2011-10-10 40 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