前言
本次要识别的焊缝是圆形焊缝,焊缝形态如下
后续具体的实现流程是用相机检测到这条圆形焊缝后,将坐标发送给机械臂,然后机械臂TCP末端运动到焊缝的位置,进行焊接。目前考虑的情况是只进行一次焊接,暂时不考虑多层焊接。
提示:以下是本篇文章正文内容,下面案例可供参考
一、霍夫圆检测原理
霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点,
跟霍夫线变换一样,也是通过投票,生成累积坐标平面,设置一个累积权重来定位圆。 在笛卡尔坐标系中圆的方程为:
在笛卡尔的xy坐标系中经过某一点的所有圆映射到abr坐标系中就是一条三维的曲线:经过xy坐标系中所有的非零像素点的所有圆就构成了abr坐标系中很多条三维的曲线。在xy坐标系中同一个圆上的所有点的圆方程是一样的,它们映射到abr坐标系中的是同一个点,所以在abr坐标系中该点就应该有圆的总像素N0个曲线相交。通过判断abr中每一点的相交(累积)数量,大于一定阈值的点就认为是代检测圆的圆心。
二、python-opencv实现霍夫圆检测
1.霍夫圆检测函数
在opencv中,内置了霍夫圆检测的库函数HoughCircles()
circle = cv2.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0)
各个参数的含义分别是:
image:待读取的输入图像
method:使用霍夫变换圆检测的算法,参数为cv2.HOUGH_GRADIENT
dp:霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推
minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心
param1:边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半
param2∶检测圆心和确定半径时所共有的阈值
minRadius和maxRadius:为所检测到的圆半径的最小值和最大值
根据检测的效果,需要适时修改param1和param2的参数
2.霍夫圆检测步骤
(1)中值滤波去噪
img = cv2.medianBlur(gay_img, 7) # 进行中值模糊,去噪点
(2)霍夫圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100,
param1=70, param2=90, minRadius=0,
maxRadius=10000)
(3) 遍历检测到的圆心,提取最优半径,绘制圆形
if circles is not None:
circles = np.uint16(np.around(circles)) print(circles) for i in circles[0, :]: # 遍历矩阵每一行的数据 cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 2) cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3) cv2.imshow("gay_img", image)
这里的circle是包含了圆心x,圆心y,圆形半径三个参数的一维数组,分别存储在i[0],i[1],i[2]中,在调试时可以实时打印查看
三.完整代码
# 显示图像
def image_show(image, name):
image = cv2.resize(image, (1440, 1080), interpolation=cv2.INTER_AREA)
name = str(name)
gay_img = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
img = cv2.medianBlur(gay_img, 7) # 进行中值模糊,去噪点
# circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=0, maxRadius=0)
# 霍夫圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100,
param1=70, param2=90, minRadius=0,
maxRadius=10000) # 根据识别圆形效果差异,调整参数param2(圆形密集则加大param2)
if circles is not None:
circles = np.uint16(np.around(circles))
#print(circles)
for i in circles[0, :]: # 遍历矩阵每一行的数据
cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3)
print(i[0],i[1],i[2])
cv2.imshow("gay_img", image)
else:
# 如果识别不出,显示圆心不存在
print('x: None y: None')
cv2.imshow("image", image)
k = cv2.waitKey(1) & 0xff
四.图像显示
这里由于存在焊缝外围和内置圆柱两个圆,所以在求焊缝半径时可以将检测到的两个半径做个均值,或者对其中一个半径做个比例的转换处理,即可求得实际半径的值。对于圆心,内圆和外圆的圆心是重叠的,因此可以无需做处理
五.总结
以上就是本次检测圆形焊缝的整体步骤,整体实现难度并不大,后续如果需要改进的话再继续更新博客。
附:参考链接
opencv+python 霍夫圆检测原理
https://www.cnblogs.com/liutianrui1/articles/10107765.html
python+OpenCV笔记(十九):霍夫变换——霍夫圆检测
https://blog.youkuaiyun.com/qq_45832961/article/details/122492086