我想从二值图像中得到圆形的质心,但输出给出了不止一个质心。我使用了opencv网络教程文档中关于图像时刻的代码,并做了一些修改。仅供参考,我使用的是c++接口OpenCV。
输出结果为:

我预计,文本输出可能会从3个轮廓中给出3个质心,但现实是7个轮廓(轮廓,...,contours6)。
哪一个是质心?或者,圆形的轮廓区域是哪一个?
然后我修改了代码,删除了一些轮廓(因为真实的图片噪声很大,我只想得到一些特定的轮廓,圆的形状,所以我必须删除其他轮廓,比如线条和字符):
contours.erase()我只想从100到500之间的区域轮廓中获得质心。
但是,输出变得奇怪了..

质心喜欢从它们的轮廓飞到任何地方。
然后,仍然有来自5个轮廓(轮廓,...,contours4)的5个质心。
我必须做什么?我只想得到圆形的质心(在数字3之上)。我真的需要你的建议。非常感谢!:D
*为我糟糕的英语道歉..
发布于 2013-05-20 01:05:52
我会怎么做:
- circularity
- convexity
- aspect ratio
为了获得可视化的示例,请看一下like that:您可以根据面积(cv::contourArea)和周长(cv::arcLength)计算圆度,而凸性将涉及计算凸包(cv::convexHull)。此步骤应产生仅包含有效的(即,圆形轮廓)。
您的contourArea(contours[i], false) < 100是一个很好的开始,但它不会告诉您轮廓是否为圆。
在此之后,您可以计算新矢量中每个元素的重心(并显示它)。这有意义吗?
最后,我不会对大的向量使用contours.erase()。我认为迭代擦除对于CPU来说是一项相当繁重的工作。相反,我会将好的轮廓存储在一个新的预先分配的向量中。然而,这只是一个性能细节。
https://stackoverflow.com/questions/16628213
复制相似问题