2011-10-10 86 views
2

enter image description here我的代碼很簡單。我試圖發現22球,但離子得到一些。我認爲這與CvSeq* circles = cvHoughCircles有關,任何人都可以幫助我,謝謝!未檢測到圖像中的多個圓圈

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 
#include <math.h> 

int main(int argc, char** argv) 
{ 
    IplImage* img = cvLoadImage("C:\\Users\\Nathan\\Desktop\\SnookerPic.png"); 


    IplImage* gray = cvCreateImage 

(cvGetSize(img), IPL_DEPTH_8U, 1); 
CvMemStorage* storage = cvCreateMemStorage(0); 

cvCvtColor(img, gray, CV_BGR2GRAY); 

// This is done so as to prevent a lot of false circles from being detected 
cvSmooth(gray, gray, CV_GAUSSIAN, 7, 7); 

IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 
IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); 
cvCanny(gray, canny, 50, 100, 3); 

CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 40.0, 100, 100,0,0); 
cvCvtColor(canny, rgbcanny, CV_GRAY2BGR); 

for (int i = 0; i < circles->total; i++) 
{ 
    // round the floats to an int 
    float* p = (float*)cvGetSeqElem(circles, i); 
    cv::Point center(cvRound(p[0]), cvRound(p[1])); 
    int radius = cvRound(p[2]); 

    // draw the circle center 
    cvCircle(img, center, 3, CV_RGB(0,255,0), -1, 8, 0); 

    // draw the circle outline 
    cvCircle(img, center, radius+1, CV_RGB(0,0,255), 2, 8, 0); 

    printf("x: %d y: %d r: %d\n",center.x,center.y, radius); 
} 


cvNamedWindow("circles", 1); 
cvNamedWindow("Image", 1); 
cvShowImage("circles", rgbcanny); 
cvShowImage("Image", img); 

cvSaveImage("out.png", rgbcanny); 
cvWaitKey(0); 

return 0; 
} 

回答

0

我認爲,問題來自於您的cvHoughCircles參數:

CvSeq* cvHoughCircles(CvArr* image, CvMemStorage* circleStorage, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0) 

minDist - 檢測到的圓的中心之間的最小距離。如果參數太小,除了真實的參數之外,可能會錯誤地檢測到多個鄰居圓。如果太大,可能會漏掉一些圈子。

您正在使用的可能是一個太大的minDist(在您的情況下,最多2-3個球將被垂直檢測,也可能水平)。

+0

是的,我調整了代碼,結果在圖片中。它有幫助,但仍有很多球仍未被檢測到?更多的信息?謝謝 – user966890

+0

它應該比球的直徑稍微小一點,所以如果圖像中的球不會改變大小,那麼可以使用檢測到的值。 – Adrian