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

标签 c++ opencv image-processing contour centroid

我想从二值图像中获取圆形的质心,但输出给出的质心不止一个。 我正在使用 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

*抱歉我的英语不好..

最佳答案

我会做什么:

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

    • 圆度
    • 凸性
    • 纵横比

看看一些东西like that有视觉的例子: 您可以根据面积 (cv::contourArea) 和周长 (cv::arcLength) 计算圆度,而凸度将涉及计算凸包 (cv::convexHull)。 此步骤应生成一个仅包含有效(即圆形轮廓)的新 vector 。

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

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

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

关于c++ - 以下哪个质心是图像中物体的质心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628213/

相关文章:

c++ - 将空的 c++ 文件添加到 xcode 项目会在 obj-c 头文件中创建语法错误

c++ - 如何在 long long int 中使用加法?

python - 如何在 Python OpenCV 中读取 TIFF 图像的 alpha channel ?

c++ - 如何访问 Opencv 中的 RGB 值?

Python 转换图像以使用更少的颜色

php - 如何在 PHP 中检测相似图像?

c++ - "/usr/bin/ld: errno: TLS definition in/lib/libc.so.6"在编译一个 fortran 文件

c++ - 无法从 C DLL 调用函数

opencv - cv2.error : OpenCV(4. 3.0) ../opencv_contrib/modules/dnn_superres/src/dnn_superres.cpp:97: error: (-2:Unspecified error) 未指定模型

c++ - C++与OpenCV的图像对比方法