【问题标题】:Ambiguity in Ellipse Detection in opencv c++opencv c ++中椭圆检测的歧义
【发布时间】:2015-03-03 15:30:42
【问题描述】:

嘿,我正在做过去两周的路标检测项目,我遇到了从图像中检测椭圆的主要问题。谁能告诉我如何处理这个问题!!!你可以看到结果和代码。谢谢

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    findContours(GreyImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

    for (size_t i = 0; i < contours.size(); i++)
    {
        Mat pointsf;
        Mat(contours[i]).convertTo(pointsf, CV_32F);
        RotatedRect box = fitEllipse(pointsf);
        ellipse(OrignalImg, box, Scalar(0, 0, 255), 1, 8);
     }

【问题讨论】:

  • 为什么这个 fitellipse 函数也将线拟合为椭圆?我怎样才能摆脱这个问题??
  • 椭圆拟合不是椭圆检测!
  • @Micka 那么我们如何检测椭圆??
  • 没有检测椭圆的openCV功能。如果我必须实现它,我会实现一些 RANSAC 方法。或者尝试为椭圆找到/创建一个 HoughTransform。
  • 如果你可以隔离你的椭圆和其他对象,你可以在每个轮廓上使用 fitEllipse,然后测试/比较你找到的椭圆和你的精明边缘,以确定你的 fitEllipse 是否真的是一个椭圆或其他东西;)

标签: c++ opencv ellipse


【解决方案1】:

来自 OpenCV 文档:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=fitellipse#fitellipse

该函数计算最适合(在最小二乘意义上)一组二维点的椭圆。

只要你传递一个轮廓,它就会适合一个椭圆。这是什么意思?那么考虑一个点列表。如果我通过代表矩形的点(角),那么可能的输出将是绘制的椭圆。

上面的矩形实际上会找到一个“没有错误”的椭圆,因为它适合使用矩形的角。在其他情况下,它将尝试找到适合减少误差的椭圆(例如在带有多边形的图像中)。没关系,只要您传递图像中接近椭圆的轮廓即可。

轮廓(由 findContours 返回)被定义为分隔区域的线。这些区域可以是正方形、三角形或几乎任何形状。您将这些轮廓传递给您的 fitEllipse 函数;也就是说,您制作了一个穿过这些轮廓的椭圆,无论这些轮廓是否实际代表椭圆。

正如@Micka 所说,在尝试制作(拟合)椭圆之前,您需要检查给定的轮廓是否实际上是椭圆。可以在 StackOverflow 中找到使用 HoughCircles、MatchShape、HuTransforms 和 RANSAC 等各种方法的示例:

【讨论】:

  • 对不起,你能详细说明你的答案吗?谢谢
  • @ahsan-khan 您想详细说明什么?我已经就您的评论进行了扩展,但是链接的答案中提供的解决方案足以回答您的其余问题。
猜你喜欢
  • 2017-07-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2020-06-16
  • 1970-01-01
  • 2015-01-12
  • 2014-10-17
相关资源
最近更新 更多