1

我想从二进制图像中获得圆的质心,但输出给出的质心不止一个。我正在使用来自 opencv 网络教程文档中关于图像时刻的代码并进行了一些修改。仅供参考,我正在使用 c++ API OpenCV。

输出是:

AQ38S.jpg

我希望,文本输出可能会从 3 个轮廓中给出 3 个质心,但现实是 7 个轮廓(轮廓 [0],...,轮廓 [6])。

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

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

contours.erase()

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

但是,输出变得奇怪..

xnDlZ.jpg

质心喜欢从它们的轮廓飞到任何地方。
然后,仍然有来自 5 个轮廓的 5 个质心(contours[0],...,contours[4])。

我必须做什么?我只想获得圆形的质心(高于数字 3)。我真的需要你的建议。非常感谢!:D

*对不起,我的英语不好..

4

1 回答 1

0

我会做什么:

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

    • 凸度
    • 纵横比

看一下类似的东西以获得视觉示例:您可以根据面积 ( cv::contourArea) 和周长 ( cv::arcLength) 计算圆度,而凸度将涉及计算凸包 ( cv::convexHull)。此步骤应生成仅包含有效(ei 圆形轮廓)的新向量。

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

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

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

于 2013-05-19T17:05:51.683 回答