0

I'm introducing myself in OpenCV (in order for an software project at university) and found a tutorial for color circle detection which I adapted and tested. It was written with OpenCV 1 in C. So I tried to convert it to OpenCv 2 classes API and everything was fine, but I ran into one problem:
The C function cvHoughCircles produces other results than the C++ function HoughCircles.
The C version finds my test circle and has a low rate of false positives, but the C++ version has a significantly higher mistake rate.

//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

this works pretty well

   //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

As you can see, I use same arguments to all calls. I tested this with a webcam and a static sample object.
One requirement is to use OpenCV2 C++ API.

Does anybody know, why I get so different results under equivalent conditions?

Edit The different threshold values was just a mistake when I tested to make results more equally.
These screenshots are taken with threshold set to 40 for both versions:

Screenshots: (Sorry, cannot yet post images)
C and C++ version

mik-tec
  • 1
  • 1

1 Answers1

0

I see Hough parameters in C version as "..., 100, 40, 0, 0); " while in C++ version as "... 100, 140, 0, 0);" This difference in thresholds probably explains the difference in results.

Michael Simbirsky
  • 3,045
  • 1
  • 12
  • 24
  • Okay, but as mentioned [here](http://stackoverflow.com/a/10718967/3512140) a higher value causes less circles to be found, but what I see is the opposite, in C++ it finds quite more (false) circles. (See edited answer) – mik-tec May 06 '14 at 13:47