首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面哪个质心是图像中对象的质心?

下面哪个质心是图像中对象的质心?
EN

Stack Overflow用户
提问于 2013-05-19 03:33:33
回答 1查看 1.3K关注 0票数 1

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

输出结果为:

我预计,文本输出可能会从3个轮廓中给出3个质心,但现实是7个轮廓(轮廓,...,contours6)。

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

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

代码语言:javascript
复制
contours.erase()

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

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

质心喜欢从它们的轮廓飞到任何地方。

然后,仍然有来自5个轮廓(轮廓,...,contours4)的5个质心。

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

*为我糟糕的英语道歉..

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-20 01:05:52

我会怎么做:

  1. 使用自定义粒子过滤器查找所有轮廓(并将其存储在点的矢量中)。也就是说,该函数将告诉您轮廓是否有效。为此,您需要根据形态要素进行决策,例如

代码语言:javascript
复制
- circularity
- convexity
- aspect ratio

为了获得可视化的示例,请看一下like that:您可以根据面积(cv::contourArea)和周长(cv::arcLength)计算圆度,而凸性将涉及计算凸包(cv::convexHull)。此步骤应产生仅包含有效的(即,圆形轮廓)。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16628213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档