前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【实战】OpenCV钢管计数分析与方法比较

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

作者头像
OpenCV学堂
发布2020-04-20 11:27:41
1.4K0
发布2020-04-20 11:27:41
举报
文章被收录于专栏:贾志刚-OpenCV学堂

基本思路选择

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

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

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

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

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

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

代码实现

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

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

代码语言:javascript
复制
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)

然后使用霍夫变换,得到输出的圆数组,直接循环绘制颜色即可:

代码语言:javascript
复制
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)

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

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档