2011-10-01 5 views
0

원을 감지하려고하지만 거기에없는 원을 감지하고 있습니다. 내 코드는 아래와 같습니다. 누구나임의의 원이 감지 됨

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

왜 당신이 나중에'edge' 결과를 사용하지 않는 경우'cvCanny' 부르죠 원 경계 내부의 픽셀을 의미합니까? – Niki

+0

예, 실수였습니다. 변화가 있었지만 무작위로 원이 발견되었습니다. – user966890

+0

부드럽게 한 후 다른 임계 값을 127로 시도하십시오. – Adrian

답변

1

cvHoughCircles이 우리에게 분명이 arent 원을 감지, 감지 더 정확한 확인하기 위해 DetectCircle() 메소드를 수정하는 방법하시기 바랍니다 알고 감사합니다. 스누커 볼의 픽셀 크기를 알고 있으면 반경을 기준으로 필터링 할 수 있습니다. cvHoughCircles 함수에서 min_radius 및 max_radius 매개 변수를 설정해보십시오.

원을 얻으면 색상을 기준으로 서클을 필터링 할 수 있습니다. 원이 대체로 하나의 색이라면 공이 될 확률이 높습니다.

편집 : "원의 색"에 의해 내가

+0

나는 이것을 줄 것이다. 조언 해 주셔서 감사드립니다. 예, 저는 22 개의 볼을 감지하고 색상을 향하게하는 중입니다. 다시 한 번 감사드립니다. – user966890

관련 문제