0

I am trying to detect coin ( circle ) detection using Opencv4Android. So far I have tried two approaches

1 ) Regular method :

// convert image to grayscale
Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGBA2GRAY);
// apply Gaussian Blur 
Imgproc.GaussianBlur(mGray, mGray, sSize5, 2, 2);

iMinRadius = 20;
iMaxRadius = 400;
iAccumulator = 300;
iCannyUpperThreshold = 100;

//apply houghCircles 
Imgproc.HoughCircles(mGray, mIntermediateMat, Imgproc.CV_HOUGH_GRADIENT, 2.0, mGray.rows() / 8, 
  iCannyUpperThreshold, iAccumulator, iMinRadius, iMaxRadius);
    if (mIntermediateMat.cols() > 0)
    for (int x = 0; x < Math.min(mIntermediateMat.cols(), 10); x++) {
      double vCircle[] = mIntermediateMat.get(0,x);
        if (vCircle == null)
          break;
          pt.x = Math.round(vCircle[0]);
          pt.y = Math.round(vCircle[1]);
          radius = (int)Math.round(vCircle[2]);
          // draw the found circle
          Core.circle(mRgba, pt, radius, colorRed, iLineThickness);
   }

2 ) Sobel and then Hough Cicles

// apply Gaussian Blur 
    Imgproc.GaussianBlur(mRgba, mRgba, sSize3, 2, 2,
            Imgproc.BORDER_DEFAULT);

    // / Convert it to grayscale
    Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGBA2GRAY);
    // / Gradient X

    Imgproc.Sobel(mGray, grad_x, CvType.CV_16S, 1, 0, 3, scale, delta,
            Imgproc.BORDER_DEFAULT);
    Core.convertScaleAbs(grad_x, abs_grad_x);

    // / Gradient Y
    Imgproc.Sobel(mGray, grad_y, CvType.CV_16S, 0, 1, 3, scale, delta,
            Imgproc.BORDER_DEFAULT);
    Core.convertScaleAbs(grad_y, abs_grad_y);
    // / Total Gradient (approximate)
    Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);

    iCannyUpperThreshold = 100;

    Imgproc.HoughCircles(grad, mIntermediateMat,
            Imgproc.CV_HOUGH_GRADIENT, 2.0, grad.rows() / 8,
            iCannyUpperThreshold, iAccumulator, iMinRadius, iMaxRadius);

    if (mIntermediateMat.cols() > 0)
        for (int x = 0; x < Math.min(mIntermediateMat.cols(), 10); x++) {
            double vCircle[] = mIntermediateMat.get(0, x);

            if (vCircle == null)
                break;

            pt.x = Math.round(vCircle[0]);
            pt.y = Math.round(vCircle[1]);
            radius = (int) Math.round(vCircle[2]);
            // draw the found circle
            Core.circle(mRgba, pt, radius, colorRed, iLineThickness);
    }

method one gives fair result in case of coin detection and method two gives better result

Out of these two methods second method processing is slow but results are good

Both of these methods are working when camera frmae is caputured using JavaCameraView or NativeCameraView from opencv library .

If I use same procedure on image captured from android naive image capture intent which returns Bitmap , I am unable to get any results at all i.e. no circles are detected at all.

In methods one sometimes I get circle detected when using Bitmap captured using android camera intent.

I also tried changing the captured bitmap as suggested in this Post but still no circle detection.

Can anybody tell me what modifications I have to do.

And also I want to know which algorithm will give better results in coin ( circle ) detection but with less processing.

I have played with various values of houghCircle method and also tried canny edge out put as intput to houghCircles but its not considerably good enough.

Community
  • 1
  • 1
Devendra
  • 89
  • 2
  • 11
  • Are you 100% sure that the captured image is a valid cv::Mat object? – LovaBill Nov 26 '13 at 10:07
  • You mean the image captured with Android camera intent ? I get a bitmap and using `Utils.bitmapToMat(bitmap, mRgba);` I convert it to cv:Mat for further processing. Also heres the link which shows small piece of code I wrote for this.[link](http://pastebin.com/Hug2UUQ4) – Devendra Nov 26 '13 at 10:32
  • Hi, did u get a solution to this one ?? And also any ways of detecting a coin perfectly ? – Rat-a-tat-a-tat Ratatouille Jul 01 '14 at 10:56

0 Answers0