Opencv Hough圈子未检测到圈子

时间:2018-11-11 02:48:25

标签: c++ opencv image-processing hough-transform

我试图检测到交通信号灯内的圆圈,但是我只能检测到2个圆圈中的1个,而我正在发现的圆圈的大小似乎太大了

输入图像: https://i.imgur.com/VkNDt2B.png

输出图像: https://i.imgur.com/BBq5tE0.png

int main()
{
    Mat src, gray;
    src = imread("C:\/test_image2.png", 1);
    resize(src, src, Size(640, 480));

    cvtColor(src, gray, CV_BGR2GRAY);

    // Reduce the noise so we avoid false circle detection
    GaussianBlur(gray, gray, Size(9, 9), 2, 2);

    vector<Vec3f> circles;

    // Apply the Hough Transform to find the circles
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 60, 200, 20, 0, 35);

    // Draw the circles detected
    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);// circle center     
        circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);// circle outline
        cout << "center : " << center << "\nradius : " << radius << endl;
    }

    // Show your results
    namedWindow("Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE);
    imshow("Hough Circle Transform Demo", src);

    waitKey(0);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果您事先知道要寻找的圆圈的大致大小,HoughCircles效果最好。我建议您为min_radius和max_radius参数提供更好的值。 无论如何,您都需要使用param1和param2参数。如果圆不是完美的圆,则可以尝试使用dp参数降低图像分辨率(例如,dp = 2时,图像将缩小为其分辨率的一半)。 基本上:无论是否检测到其他圈子,都可以使用param1和param2直到检测到您的圈子。使用此结果来找出您的圆的半径,然后固定最小和最大半径以删除大部分不需要的圆,最后再次使用param1和param2进行操作,直到只剩下圆为止。

答案 1 :(得分:0)

这是一个很大的图像 尝试首先裁剪到交通信号灯部分(以开始操作),然后尝试使用min_distance和param_1,param_2参数的不同组合尝试获取最多的圆圈(甚至错误的圆圈)。找出哪些值获得最多的圆,什么组合获得最少(或没有)的圆,然后微调参数以检测到较少的圆,最后找到理想的组合