2014-02-28 95 views
0

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

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

回答

0

我检查了你的程序,好像你只是在检测后忘了用imshow()来想象它。在检测之前,您只绘制了图像,这样,您无法看到圆圈(也许这会错误地让您认为没有检测到圆圈),即使它确实检测到了一些圆圈。

尝试c = waitKey(33);前右加

imshow("main", img); 

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


编辑:解答实时检测圆您的评论:

做一个while循环风格将使其视频帧的工作。但是,不管是否实时,取决于HoughCircles()的工作速度以及循环内部的其他内容,尽管您设置了waitKey()的适当时间。

+0

我尝试了你所说的,但它仍然不适用于实时圆检测。但是,当我试图通过加载图像而不是使用视频捕捉它的工作。我怎样才能使它工作的实时圈检测 – BBB

+0

@Behroz检查出更新的答案。 – herohuyongtao