我在OpenCV中介绍自己(为了在大学进行软件项目)并找到了tutorial用于色圈检测,我对其进行了调整和测试。它是在C中用OpenCV 1编写的。所以我试着将它转换为OpenCv 2类API,一切都很好,但我遇到了一个问题:
C函数cvHoughCircles
产生的结果不是C ++函数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 :(得分:0)
我在C版本中看到Hough参数为&#34; ...,100,40,0,0); &#34;而在C ++版本中作为&#34; ... 100,140,0,0);&#34;这种阈值差异可能解释了结果的差异。