在java中使用openCV实现对图片的分割(仅限java)

同样是面向java的同学

使用霍夫圆识别图片中的圆,操作相对简单

核心代码:

Imgproc.HoughCircles(InputArray image,OutputArray circles,int method,double dp,double minDist,double param1=100,double param2=100,int minRadius=0,int maxRadius=0); 

     image为输入图像,要求是灰度图像

    circles为输出圆向量,每个向量包括三个浮点型的元素——(x,y,radius)

    method为使用霍夫变换圆检测的算法,它的参数是CV_HOUGH_GRADIENT

    dp为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半

    minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心

    param1有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

   param2也有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

    minRadius和maxRadius为所检测到的圆半径的最小值和最大值

甭废话,上代码:


     
     
     
     
  1. /**
  2. * 使用霍夫圆对图片的中的所有圆进行识别
  3. * @author Administrator
  4. *
  5. */
  6. public class TestCircle {
  7. public static void main(String[] args) {
  8. String relativelyPath = System.getProperty( “user.dir”);
  9. System.load(relativelyPath + “\\lib\\opencv_java310.dll”);
  10. Mat src = Imgcodecs.imread( “E:\\zzz.bmp”);
  11. Mat dst = src.clone();
  12. Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
  13. Mat circles = new Mat();
  14.      //核心代码
  15. Imgproc.HoughCircles(dst, circles, Imgproc.HOUGH_GRADIENT, 1, 300, 400, 100, 0, 0);
  16. System.out.println(circles.cols());
  17. for ( int i = 0; i < circles.cols(); i++){
  18. double[] vCircle = circles.get( 0, i);
  19. Point center = new Point(vCircle[ 0], vCircle[ 1]);
  20. int radius = ( int) Math.round(vCircle[ 2]);
  21. // circle center
  22. Imgproc.circle(src, center, 3, new Scalar( 0, 255, 0), - 1, 8, 0);
  23. // circle outline
  24. Imgproc.circle(src, center, radius, new Scalar( 0, 255, 255), 3, 8, 0);
  25. }
  26. Imgcodecs.imwrite( “E:\\gray2.png”, src);
  27. }
  28. }

原图:

在java中使用openCV实现对图片的分割(仅限java)_第1张图片

截取后:

在java中使用openCV实现对图片的分割(仅限java)_第2张图片

希望可以对各位有帮助,如有问题请评论提出



你可能感兴趣的:(csdn转载)