基于OpenCV的弯曲导线角度测量方法咨询
弯线角度检测的实操方案
一、先做图像预处理
- 灰度化:把彩色图转成灰度图,减少计算量,用OpenCV的话就是
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 高斯模糊:给图像降个噪,避免小杂点干扰后续边缘检测,代码是
cv2.GaussianBlur(gray, (5,5), 0) - Canny边缘检测:把导线轮廓抠出来,
cv2.Canny(blur, 50, 150),这两个阈值可以根据实际图像微调,调准了能精准提取导线边缘
二、用霍夫变换抓导线的直线段
你要的直线检测和坐标获取,用霍夫变换就能搞定,推荐用概率霍夫变换,比传统方法高效得多:
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=30, minLineLength=50, maxLineGap=10)
- 参数简单说明:
edges是刚才边缘检测后的图像1和np.pi/180是像素、角度步长,不用改动threshold:数值越高,检测到的直线越精准,能过滤掉杂线minLineLength:只保留长度超过该值的线段,避免把小噪点当成导线maxLineGap:如果导线有轻微断开,这个参数能把同一段的线段连起来
- 遍历
lines就能拿到每段直线的四个端点坐标(x1,y1,x2,y2),要画直线的话直接用cv2.line(img, (x1,y1), (x2,y2), (0,255,0), 2),就能在原图上画出绿色的导线直线段
三、计算弯角的实际角度
拿到相邻两段直线的坐标后,用向量点积算角度就行:
import math # 第一段直线的方向向量 vec1 = (x2 - x1, y2 - y1) # 第二段直线的方向向量 vec2 = (x4 - x3, y4 - y3) # 点积计算夹角 dot_product = vec1[0] * vec2[0] + vec1[1] * vec2[1] # 计算向量模长 mag1 = math.hypot(vec1[0], vec1[1]) mag2 = math.hypot(vec2[0], vec2[1]) # 弧度转角度 angle_rad = math.acos(dot_product / (mag1 * mag2)) angle_deg = math.degrees(angle_rad) # 实际弯角取180°减计算值还是直接用,看你目标角度的定义 actual_angle = 180 - angle_deg if angle_deg > 90 else angle_deg
四、合格性判断
把算出的实际角度和目标角度做对比,设定一个允许的误差范围(比如±1°),差值在范围内就判定合格,超出则不合格
小技巧:如果检测出的直线太多,可以根据导线的位置(比如只保留图像中间区域的直线)、角度范围(过滤掉明显不是导线的角度)来筛选,只留下需要的导线段

内容的提问来源于stack exchange,提问作者naro
相关产品推荐
相关产品推荐

