opencv houghcircles差异c c ++

时间:2014-05-05 22:26:16

标签: c++ c opencv

我在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

1 个答案:

答案 0 :(得分:0)

我在C版本中看到Hough参数为&#34; ...,100,40,0,0); &#34;而在C ++版本中作为&#34; ... 100,140,​​0,0);&#34;这种阈值差异可能解释了结果的差异。