区分圆形和非圆形轮廓

时间:2016-09-24 13:41:39

标签: c++ opencv

是否有OpenCV函数可以确定轮廓是否为圆形?

  • fitEllipse()似乎适用于任何轮廓(如果我错了,请更正我,我做了快速测试)。

  • isContourConvex()甚至不会发现我最好的圈子。

我正在尝试检测比萨饼(相机是一个角度,所以披萨形状是椭圆形)。 HoughCircles适用于披萨的一般位置,但不适用于披萨的椭圆形状(它要么发现圆圈太小或太大)。

static void detectPizzas(const Mat& roi)
{
    Mat blur, edges;
    GaussianBlur(roi, blur, Size(3, 3), 0);
    Canny(blur, edges, 200, 275);
    dilate(edges, edges, getStructuringElement(CV_SHAPE_ELLIPSE, { 3, 3 }));

    std::vector<std::vector<Point>> contours;
    findContours(edges, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

    // Following draws ellipses to all contours that aren't even circular. 
    // How can I discriminate between 'circular' contours and non-circular contours?
    for (int i = 0; i < contours.size(); i++) 
    {
        // Doesn't detect any ellipses
        //if (!isContourConvex(contours[i]))
        //  continue;

        RotatedRect r = fitEllipse(contours[i]);

        ellipse(edges, r, { 125 }, 2);
    }

    imshow("edges", edges);
}

示例图片:

enter image description here

enter image description here

0 个答案:

没有答案