在OpenCV / JaVa中查找圆形图像处理

时间:2015-09-29 14:32:28

标签: java opencv image-processing hough-transform

我使用opencv和java在图像上找到圆圈,到目前为止我有下面的图像。我正在使用Hough找到包含如下代码的圆圈:

    public static Vector<Mat> circles(Mat img){

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    long start_time = System.nanoTime();
    Imgproc.resize(img, img, new Size(450,250));

    Mat gray = new Mat();
    Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY);
    Imgproc.blur(gray, gray, new Size(3, 3));

    Mat edges = new Mat();
    int lowThreshold = 40;
    int ratio = 3;
    Imgproc.Canny(gray, edges, lowThreshold, lowThreshold * ratio);

    Mat circles = new Mat();
    Vector<Mat> circlesList = new Vector<Mat>();

    Imgproc.HoughCircles(edges, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 60, 200, 20, 30, 0 );


    System.out.println("#rows " + circles.rows() + " #cols " + circles.cols());
    double x = 0.0;
    double y = 0.0;
    int r = 0;

    for( int i = 0; i < circles.rows(); i++ )
    {
      double[] data = circles.get(i, 0);
      for(int j = 0 ; j < data.length ; j++){
           x = data[0];
           y = data[1];
           r = (int) data[2];
      }
      Point center = new Point(x,y);
      // circle center
      Core.circle( img, center, 3, new Scalar(0,255,0), -1);
      // circle outline
      Core.circle( img, center, r, new Scalar(0,0,255), 1);

     Imshow im1 = new Imshow("Hough");
     im1.showImage(img); 

     Rect bbox = new Rect((int)Math.abs(x-r), (int)Math.abs(y-r), (int)2*r, (int)2*r);
     Mat croped_image = new Mat(img, bbox);
     Imgproc.resize(croped_image, croped_image, new Size(160,160));
     circlesList.add(croped_image);
     Imshow m2 = new Imshow("cropedImage");
     m2.showImage(croped_image); 
    }

    long end_time = System.nanoTime();
    long duration = (end_time - start_time)/1000000;  //divide by 1000000 to get milliseconds.
    System.out.println("duration :  " + duration * 0.001 + " s"); 
    return circlesList;
}

但它始终只能检测到一个圆圈。

enter image description here

我的问题是如何使用java / OpenCV检测图像中的所有圆圈?

注意: -

1-我在HoughCircles函数参数中使用Mat称为圆圈,因为该函数需要Java中的Mat。

2-我使用的是openCV 2.4.11版本。

1 个答案:

答案 0 :(得分:0)

圆圈保存在圆圈的列中 尝试将循环替换为:

for( int i = 0; i < circles.cols(); i++)
{
  double[] data = circles.get(0,i);
...