【实战】OpenCV钢管计数分析与方法比较
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:opencv学堂
这个问题最早是在QQ群中看到,佳乐跟禾路分别用不同的两个思路完成了处理。原图如下:
禾路的思路是通过寻找钢管中的黑色区域,分析黑色区域的轮廓,从而根据下面的公式计算轮廓的圆度:
4 * PI * S
Afa = ------------
C * C
设置一个阈值,完成对拍照钢管计数,同时加以人工手动辅助,实现了项目的预期目标。它的最早结果图示如下:
佳乐最近一直在搞基于边缘与角度旋转的模板匹配,所以它基于边缘与旋转模板匹配实现了一个结果输出,图示如下:
我发现这个钢管挺圆的,使用Houg圆检测也应该比较靠谱,所以我从图像降噪、形态学边缘提取、霍夫检测角度也输出了一个检测结果,发现效果也很好。图示如下:
我分别实现了基于轮廓分析圆度来计数的方法与基于霍夫圆检测方法,考虑到这个还是禾路课程中案例实践的代码,我要是放出源代码的话不是很好,但是我可以把我的方法步骤结合代码跟大家详细说一下:
首先是加载图像,实现形态学梯度
image = cv.imread("D:/images/gangguan.jpg")
se = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
image = cv.morphologyEx(image, cv.MORPH_GRADIENT, se)
cv.imwrite("D:/image.png", image)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
然后使用霍夫变换,得到输出的圆数组,直接循环绘制颜色即可:
circles= cv.HoughCircles(gray, cv.HOUGH_GRADIENT, d, min_dist, param1=hgrad, param2=lgrad, minRadius=min, maxRadius=max)
for c in circles[0]:
print(c)
x, y, r = c
b = np.random.randint(0, 256)
g = np.random.randint(0, 256)
r = np.random.randint(0, 256)
cv.circle(src, (x, y), 30, (255, g, r), -1, 8, 0)
cv.imwrite("D:/hough_det.png", src)
代码真的没几行,关键是有效果就好! 最后说一下,只有自己测试了才知道!
只有一张图像,还没有进行更多测试, 但是在实践环节中结合人工辅助,可以很快实现精准计数,达到提升效果,节约时间与人工的目的。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~