以下哪个质心是图像中物体的质心?

时间:2013-05-18 19:33:33

标签: c++ opencv image-processing contour centroid

我想从二进制图像中获得圆形的质心,但是输出会给出一个以上的质心。 我正在使用opencv web教程文档中关于图像时刻和修改后的一点代码。 仅供参考,我正在使用c ++ API OpenCV。

输出是:

AQ38S.jpg

我希望,文本输出可以从3个轮廓给出3个质心,但实际是7个轮廓(轮廓[0],...,等高线[6])。

哪一个质心?或者,哪一个圆形的轮廓区域?

然后我修改了代码,删除了一些轮廓(因为真实的图片非常噪音,我只想得到一些特定的轮廓,圆形,所以我必须删除其他轮廓,如线和字符)使用:< / p>

contours.erase()

我只想从100到500之间的区域轮廓获得质心。

但是,输出变得很奇怪..

xnDlZ.jpg

质心像从它们的轮廓飞到任何地方 然后,仍有5个轮廓的5个质心(轮廓[0],...,等高线[4])。

我该怎么办?我只想得到圆形的质心(在数字3之上)。 我真的需要你的建议。非常感谢! :d

*抱歉我的英文不好..

1 个答案:

答案 0 :(得分:0)

我会做什么:

  1. 查找所有轮廓(并将其存储在点矢量中)(cv::findContours
  2. 应用自定义粒子滤镜。也就是说,一个能告诉你轮廓是否有效的函数。要做到这一点,您需要根据形态特征做出决定,例如

    • 宽高比
  3. 查看like that内容以获得可视化示例: 您可以从区域(cv::contourArea)和周长(cv::arcLength)计算圆度,而凸度将涉及计算凸包(cv::convexHull)。 此步骤应生成一个仅包含有效(e.i.圆形轮廓)的新向量。

    您的contourArea(contours[i], false) < 100是一个好的开始,但它不会告诉您轮廓是否为圆形。

    之后,您可以计算新矢量的每个元素的重心(并显示它)。有道理吗?

    最后,我不会将contours.erase()用于大型向量。我认为迭代擦除对CPU来说是一项相当繁重的工作。相反,我会将好的轮廓存储在一个新的预分配矢量中。然而,这只是一个性能细节。