opencv c ++中椭圆检测的模糊性

时间:2015-03-03 15:30:42

标签: c++ opencv ellipse

嘿,我正在进行过去两周的道路标志检测项目,我遇到了从图像中检测椭圆的主要问题。任何人都告诉我如何处理这个问题!!!你可以看到结果和code.Thanks

Road sign Detection

    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);
     }

1 个答案:

答案 0 :(得分:3)

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

  

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

只要你传递一个轮廓,它就会适合一个椭圆。这是什么意思?好吧考虑一下积分清单。如果我通过了表示矩形(角落)的点,则可能的输出将是绘制的椭圆。

Fitted ellipse to rectangle Least squares fit

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

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

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