Opencv绕过了与c++的差异

  • 本文关键字:c++ 过了 Opencv c++ opencv
  • 更新时间 :
  • 英文 :


我在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);阈值的差异可能解释了结果的差异。

相关内容

  • 没有找到相关文章

最新更新