我在OpenCV中介绍自己(为了大学的一个软件项目),并找到了一个颜色圈检测的教程,我改编并测试了它。它是用OpenCV 1在c中编写的,所以我试图将其转换为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和c++版本
我看到C版本中的Hough参数为"…", 100, 40, 0, 0);,而在c++版本中为"…100,140,0,0);阈值的差异可能解释了结果的差异。