2014-05-05 106 views
0

我介紹自己在OpenCV中(爲了在大學中的軟件項目),並發現一個tutorial用於顏色檢測圓我適於和測試。它是在與C. OpenCV的1書面所以,我試圖將其轉換爲OpenCV的2類API,一切都很好,但我遇到了一個問題:
C函數cvHoughCircles產生比C++函數HoughCircles其他結果。
C版本找到我的測試圈並且誤報率較低,但C++版本的錯誤率明顯較高。的OpenCV houghcircles差異C C++

//My C implementation 
    IplImage *img = cvQueryFrame(capture); 

    CvSize size = cvGetSize(img); 
    IplImage *hsv = cvCreateImage(size, IPL_DEPTH_8U, 3); 
    cvCvtColor(img, hsv, CV_BGR2HSV); 

    CvMat *mask = cvCreateMat(size.height, size.width, CV_8UC1); 
    cvInRangeS(hsv, cvScalar(107, 61, 0, 0), cvScalar(134, 255, 255, 0), mask); 

    /* Copy mask into a grayscale image */ 
    IplImage *hough_in = cvCreateImage(size, 8, 1); 
    cvCopy(mask, hough_in, NULL); 
    cvSmooth(hough_in, hough_in, CV_GAUSSIAN, 15, 15, 0, 0); 
    cvShowImage("mask",hough_in); 
    /* Run the Hough function */ 
    CvMemStorage *storage = cvCreateMemStorage(0); 
    CvSeq *circles = cvHoughCircles(hough_in, storage, CV_HOUGH_GRADIENT, 
     4, size.height/4, 100, 40, 0, 0); 
// ... iterating over all found circles 

這個工作得很好

//My C++ implementation 
    cv::Mat img; 
    cap.read(img); 

    cv::Size size(img.cols,img.rows); 
    cv::Mat hsv(size, IPL_DEPTH_8U, 3); 
    cv::cvtColor(img, hsv, CV_BGR2HSV); 

    cv::Mat mask(size.height, size.width, CV_8UC1); 
    cv::inRange(hsv, cv::Scalar(107, 61, 0, 0), cv::Scalar(134, 255, 255, 0), mask);  

    GaussianBlur(mask, mask, cv::Size(15, 15), 0, 0); 
    /* Run the Hough function */ 
    imshow("mask",mask); 
    vector<cv::Vec3f> circles; 
    cv::HoughCircles(mask, circles, CV_HOUGH_GRADIENT, 
     4, size.height/4, 100, 140, 0, 0); 
// ... iterating over all found circles 

正如你所看到的,我用同樣的參數所有呼叫。我用一個攝像頭和一個靜態樣品對象進行了測試。
一個要求是使用OpenCV2 C++ API。

是否有人知道,爲什麼我得到在同等條件下如此不同的結果?

編輯 當我測試結果更平等時,不同的閾值僅僅是一個錯誤。
這些截圖採取與閾值設置爲40,這兩個版本:

截圖(對不起,還不能發表圖片)
C and C++ version

回答

0

我看到C版霍夫參數」 ...... 100 ,40,0,0);「而在C++版本中爲」...... 100,140,​​0,0「;」閾值差異可能解釋了結果的差異。

+0

好的,但如上述[這裏](http://stackoverflow.com/a/10718967/3512140)更高的值導致要發現少圈,但我看到的是相反的,在C++中發現相當多(假)圈子。 (見編輯答案) –