我想从二进制图像中获得圆形的质心,但是输出会给出一个以上的质心。 我正在使用opencv web教程文档中关于图像时刻和修改后的一点代码。 仅供参考,我正在使用c ++ API OpenCV。
输出是:
我希望,文本输出可以从3个轮廓给出3个质心,但实际是7个轮廓(轮廓[0],...,等高线[6])。
哪一个质心?或者,哪一个圆形的轮廓区域?
然后我修改了代码,删除了一些轮廓(因为真实的图片非常噪音,我只想得到一些特定的轮廓,圆形,所以我必须删除其他轮廓,如线和字符)使用:< / p>
contours.erase()
我只想从100到500之间的区域轮廓获得质心。
但是,输出变得很奇怪..
质心像从它们的轮廓飞到任何地方 然后,仍有5个轮廓的5个质心(轮廓[0],...,等高线[4])。
我该怎么办?我只想得到圆形的质心(在数字3之上)。 我真的需要你的建议。非常感谢! :d
*抱歉我的英文不好..
答案 0 :(得分:0)
我会做什么:
cv::findContours
)应用自定义粒子滤镜。也就是说,一个能告诉你轮廓是否有效的函数。要做到这一点,您需要根据形态特征做出决定,例如
查看like that内容以获得可视化示例:
您可以从区域(cv::contourArea
)和周长(cv::arcLength
)计算圆度,而凸度将涉及计算凸包(cv::convexHull
)。
此步骤应生成一个仅包含有效(e.i.圆形轮廓)的新向量。
您的contourArea(contours[i], false) < 100
是一个好的开始,但它不会告诉您轮廓是否为圆形。
之后,您可以计算新矢量的每个元素的重心(并显示它)。有道理吗?
最后,我不会将contours.erase()
用于大型向量。我认为迭代擦除对CPU来说是一项相当繁重的工作。相反,我会将好的轮廓存储在一个新的预分配矢量中。然而,这只是一个性能细节。