2011-10-01 37 views
0

我正在尝试检测圈子,但我发现甚至没有圈子。我的代码如下。任何人都知道如何修改DetectCircle()方法使检测更加准确,请和感谢正在检测的随机圈子

void detectCircle(IplImage * img) 
{ 
    int edge_thresh = 1; 
    IplImage *gray = cvCreateImage(cvSize(img->width,img->height), 8, 1); 
    IplImage *edge = cvCreateImage(cvSize(img->width,img->height), 8, 1); 

    cvCvtColor(img, gray, CV_BGR2GRAY); 

    gray->origin = 1; 

    // color threshold 
    cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);  

    // smooths out image 
    cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11); 

    // get edges 
    cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 

    // detects circle 
    CvSeq* circle = cvHoughCircles(edge, cstorage, CV_HOUGH_GRADIENT, 1, 
     edge->height/50, 5, 35); 

    // draws circle and its centerpoint 
    float* p = (float*)cvGetSeqElem(circle, 0); 
    if(p==null){ return;} 

    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0); 
    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0); 

    cvShowImage ("Snooker", img); 
} 
+0

你为什么叫'cvCanny',如果你不算账使用'edge'结果里面的像素? – Niki

+0

是的,这是一个错误。有变化,但仍然随机检测圆圈 – user966890

+0

平滑后尝试127与另一个阈值。 – Adrian

回答

1

cvHoughCircles检测的arent明显地向我们的圈子。如果你知道斯诺克球的像素大小,你可以根据它们的半径进行过滤。尝试在cvHoughCircles函数中设置min_radius和max_radius参数。

在附注中,一旦获得圆圈,就可以根据颜色对其进行过滤。如果这个圈子大多是一种颜色,那么它很可能成为一个球,如果它能够证明它可能是假的。

编辑:由“圆的颜色”我的意思是圆边界

+0

我会放弃这一点。感谢您的建议。雅,我只是在努力让22个球被检测出来,然后我就开始寻找颜色。再次感谢 – user966890