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