【实战】OpenCV钢管计数分析与方法比较

小白学视觉

共 2469字,需浏览 5分钟

 ·

2021-03-16 10:23

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂


基本思路选择


这个问题最早是在QQ群中看到,佳乐跟禾路分别用不同的两个思路完成了处理。原图如下:

禾路的思路是通过寻找钢管中的黑色区域,分析黑色区域的轮廓,从而根据下面的公式计算轮廓的圆度:

                 4 * PI * S
         Afa = ------------
                  C * C

设置一个阈值,完成对拍照钢管计数,同时加以人工手动辅助,实现了项目的预期目标。它的最早结果图示如下:

佳乐最近一直在搞基于边缘与角度旋转的模板匹配,所以它基于边缘与旋转模板匹配实现了一个结果输出,图示如下:

我发现这个钢管挺圆的,使用Houg圆检测也应该比较靠谱,所以我从图像降噪、形态学边缘提取、霍夫检测角度也输出了一个检测结果,发现效果也很好。图示如下:


代码实现


我分别实现了基于轮廓分析圆度来计数的方法与基于霍夫圆检测方法,考虑到这个还是禾路课程中案例实践的代码,我要是放出源代码的话不是很好,但是我可以把我的方法步骤结合代码跟大家详细说一下:


首先是加载图像,实现形态学梯度

image = cv.imread("D:/images/gangguan.jpg")
se = cv.getStructuringElement(cv.MORPH_RECT, (33))
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(0256)
    g = np.random.randint(0256)
    r = np.random.randint(0256)
    cv.circle(src, (x, y), 30, (255, g, r), -180)
cv.imwrite("D:/hough_det.png", src)


代码真的没几行,关键是有效果就好! 最后说一下,只有自己测试了才知道!


总结


只有一张图像,还没有进行更多测试, 但是在实践环节中结合人工辅助,可以很快实现精准计数,达到提升效果,节约时间与人工的目的。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报