基本思路选择
这个问题最早是在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)
代码真的没几行,关键是有效果就好! 最后说一下,只有自己测试了才知道!
总结
只有一张图像,还没有进行更多测试, 但是在实践环节中结合人工辅助,可以很快实现精准计数,达到提升效果,节约时间与人工的目的。