我想从二值图像中获取圆形的质心,但输出给出的质心不止一个。 我正在使用 opencv 网络教程文档中关于图像时刻的代码并进行了一些修改。 仅供引用,我使用的是 C++ API OpenCV。
输出是:
我预计,文本输出可能会从 3 个轮廓给出 3 个质心,但实际情况是 7 个轮廓(轮廓[0],...,轮廓[6])。
哪个是质心?或者,哪个是圆形的轮廓区域?
然后我修改了代码,去除了一些轮廓(因为真实的图片非常嘈杂,我只想得到一些特定的轮廓,圆形,所以我必须去除其他轮廓,比如线条和字符)使用:
contours.erase()
我只想从 100 到 500 之间的区域轮廓获取质心。
但是,输出变得奇怪..
质心就像从轮廓飞到任何地方。
然后,仍然有 5 个轮廓的 5 个质心 (contours[0],...,contours[4])。
我必须做什么?我只想获得圆形的质心(数字 3 以上)。 我真的需要你的建议。太感谢了! :D
*抱歉我的英语不好..
最佳答案
我会做什么:
- 找到所有轮廓(并将其存储在点 vector 中)(
cv::findContours
) 应用自定义粒子过滤器。也就是说,一个函数会告诉您轮廓是否有效。为此,您需要根据形态学特征做出决定,例如
- 圆度
- 凸性
- 纵横比
看看一些东西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/