Случайные круги обнаруживаются - PullRequest
0 голосов
/ 01 октября 2011

Я пытаюсь обнаружить круги, но я обнаруживаю круги, которых даже нет.Мой код ниже.Кто-нибудь знает, как изменить метод 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 );
}

1 Ответ

1 голос
/ 03 октября 2011

cvHoughCircles обнаруживает круги, которые нам не очевидны.Если вы знаете размер пикселя снукерных шаров, вы можете отфильтровать их по их радиусу.Попробуйте установить параметры min_radius и max_radius в вашей функции cvHoughCircles.

В примечании, получив кружки, вы можете отфильтровать их по цвету.Если круг в основном одного цвета, у него есть хорошие шансы быть шариком, если он имеет, вероятно, ложный положительный результат.

edit: под "цветом круга" я подразумеваю пиксели внутри границы круга

...