我正在尝试检测圈子,但我检测到的圈子甚至没有。我的代码如下。任何人都知道如何修改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 :(得分:1)
cvHoughCircles检测到对我们来说不明显的圆圈。如果你知道斯诺克球的像素大小,你可以根据它们的半径过滤它们。尝试在cvHoughCircles函数中设置min_radius和max_radius参数。
在旁注中,一旦获得圆圈,您可以根据颜色过滤它们。如果圆圈大多是一种颜色,那么它很有可能成为一个球,如果它可能是一个假阳性。
编辑:“圆圈颜色”是指圆圈内的像素