【问题标题】:which one the following centroid is the centroid of object in image?下面哪个质心是图像中物体的质心?
【发布时间】:2013-05-13 18:04:54
【问题描述】:

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

输出是:

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

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

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

contours.erase()

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

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

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

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

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

【问题讨论】:

  • 嗨,也许你可以制作一个非常简单的单形二进制图像并尝试对其进行编码。此外,这似乎是一个简单的问题,但如果不查看您的代码就很难为您提供帮助...您是否想要 1)找到圆形的形状和 2)找到质心?
  • @QuentinGeissmann 感谢您的评论:D 对于第一张图片,我使用的是 code。对于第二张图片,我用 put if ( contourArea(contours[i], false) < 100 || contourArea(contours[i], false) > 500) {contours.erase(contours.begin()+i); } 修改了代码。
  • 老实说,是的,我想找到圆形的形状并获得质心。你有什么建议吗? :D
  • 您是否尝试过使用霍夫变换来检测圆圈?
  • @Zaphod 感谢您的评论。 :) 我有,但它不起作用,因为这是手绘圆圈,所以它看起来像圆圈......

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


【解决方案1】:

我会做什么:

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

    • 圆度
    • 凸性
    • 纵横比

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

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

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

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

【讨论】:

  • 抱歉回复晚了。感谢您分享你的知识。它非常有用和有帮助,因为真正解决了我的问题。我已经在我的代码中对此进行了测试,它可以工作!对不起,但我在图像处理方面真的很新。我真的很高兴!所以,非常感谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多