使用OpenCV进行实时圆检测

时间:2014-02-28 15:31:05

标签: opencv

我编写了以下程序来实时检测圆圈。但它不起作用。 编译器没有显示任何错误,但问题是程序甚至没有检测到圆圈。我该如何解决? 这是我的代码 使用namespace cv;

int main()
{
    VideoCapture cap(0);

    namedWindow("main",CV_WINDOW_AUTOSIZE);
    namedWindow("blur",CV_WINDOW_AUTOSIZE);
    Mat img;
    Mat img2;
    int c;
    float radius;

    while(1)
    {
        cap>>img;
        imshow("main",img);

        cvtColor(img,img2,CV_BGR2GRAY);
        GaussianBlur(img2,img2,Size(9,9),2,2);
        imshow("blur",img2);

        vector <Vec3f> circles;
        HoughCircles(img2,circles,CV_HOUGH_GRADIENT,1,img2.rows/8,200,100,0,0);

        for(size_t i=0;i<circles.size();i++)
        {
            Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
            radius = cvRound(circles[i][2]);

            circle(img,center,3,Scalar(0,255,0),-1,8,0);

            circle(img,center,radius,Scalar(0,0,255),3,8,0);
        }

        c = waitKey(33);

        if(c==27)
            break;
    }

    destroyAllWindows();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我检查了你的程序,似乎你忘了在检测后使用imshow()将其可视化。您只能在检测之前绘制图像,这样,您就无法看到圆圈(可能这会错误地让您认为没有检测到圆圈),即使它确实检测到了一些圆圈。

尝试添加

imshow("main", img);

c = waitKey(33);之前。

如果检测到某些圆圈,您会看到圆圈。


编辑:回答您对实时圈子检测的评论:

while循环样式执行此操作将使其适用于视频帧。但是,它是否是实时取决于HoughCircles()的工作速度以及循环内的其他内容,尽管您为waitKey()设置了适当的时间。