当前位置: 首页 > 编程笔记 >

如何使用Java OpenCV库查找图像轮廓?

丁子石
2023-03-14
本文向大家介绍如何使用Java OpenCV库查找图像轮廓?,包括了如何使用Java OpenCV库查找图像轮廓?的使用技巧和注意事项,需要的朋友参考一下

轮廓线不过是连接沿着特定形状的边界的所有点的线。使用这个你可以-

  • 查找对象的形状。

  • 计算对象的面积。

  • 检测物体。

  • 识别对象。

您可以使用findContours()方法找到图像中各种形状的轮廓,对象。此方法接受以下参数-

  • 二进制图像。

  • 类型为MatOfPoint的空列表对象,用于存储轮廓。

  • 一个空的Mat对象,用于存储图像拓扑。

  • 两个整数变量,用于指定查找给定图像轮廓的模式和方法。

示例

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class FindingContours {
   public static void main(String args[]) throws Exception {
      //加载OpenCV核心库
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      String file ="D:\\Images\\shapes.jpg";
      Mat src = Imgcodecs.imread(file);
      //将源图像转换为二进制
      Mat gray = new Mat(src.rows(), src.cols(), src.type());
      Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
      Mat binary = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
      Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY_INV);
      //寻找轮廓
      List<MatOfPoint> contours = new ArrayList<>();
      Mat hierarchey = new Mat();
      Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE,
      Imgproc.CHAIN_APPROX_SIMPLE);
      Iterator<MatOfPoint> it = contours.iterator();
      while(it.hasNext()) {
         System.out.println(it.next());
      }
      /*
      Mat draw = Mat.zeros(binary.size(), CvType.CV_8UC3);
      for (int i = 0; i < contours.size(); i++) {
         System.out.println(contours);
         Scalar color = new Scalar(0, 0, 255);
         //绘图轮廓
         Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8, hierarchey, 2, new Point() ) ;
      }
      HighGui.imshow("Contours operation", draw);
      HighGui.waitKey();
      */
   }
}

输出结果

Mat [ 29*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829510,
dataAddr=0x19826dc0 ]
Mat [ 58*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829580,
dataAddr=0x19826f00 ]
Mat [ 35*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828be0,
dataAddr=0x19827100 ]
Mat [ 117*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829190,
dataAddr=0x19827280 ]
Mat [ 1*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198292e0,
dataAddr=0xba8280 ]
Mat [ 78*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829350,
dataAddr=0x19827680 ]
Mat [ 63*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198289b0,
dataAddr=0x19827940 ]
Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828e80,
dataAddr=0x19827b80 ]
Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829430,
dataAddr=0xb84580 ]
Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829120,
dataAddr=0xb84440 ]
Mat [ 136*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828ef0,
dataAddr=0x19827f80 ]
Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828b00,
dataAddr=0x19828440 ]
 类似资料:
  • 我最近在eclipse上使用java中的openCV,正在开发一个眼球跟踪软件,我正在使用其他人创建的基本代码,并计划对其进行tweek,但在几行代码中出现错误,无法找出原因。这是全班同学 错误从这里开始,错误代码为:“构造函数大小(double,double,int,int,Scalar)未定义” 然后在ellipse这里我得到一个错误:“类型核中的方法ellipse(Mat,RotatedRe

  • 我有一个SWT按钮,它不包含文本,只是一个图像。我搜索了方法,但我找不到按它的方法。

  • 这是我得到的错误消息

  • 问题内容: 我希望制作一个图像轮播,用户可以在其中通过单击箭头在图像之间切换。 但是,我只能使用HTML和CSS,而不能使用JavaScript(因此也不能使用jQuery)。我只需要基本设置;平滑过渡等不是必需的。 我该如何做到这一点? 问题答案: 这很容易!只需使用单选按钮和目标标签。 单选按钮的(必要的)行为是一次只能选择一个按钮,就像轮播中的图像一样。 演示版 请确保至少有一个input(

  • 我对计算机视觉不熟悉。所以我不知道下面代码的内部实现,因为我无法调试错误。有人能指出下面代码中的错误吗? 该代码使用盒滤波器和边缘检测核矩阵的组合将停车场图像转换为二进制。然后我试图找到轮廓。现在我知道轮廓是在二值图像上找到的,可以用cv2导出。threshold()函数,从过滤器和核矩阵获得的图像不是也是一个二值图像吗? 你认为我做错了什么?我非常希望在这个问题上能有一个解释或一个方向。 先谢谢

  • 问题内容: 我有一个图像,我想使用Volley库将该图像上传到我的Web服务,问题是我正在寻找一种方法,但仍然没有找到。 我找到了,但是对我不起作用:http : //develop-for- android.blogspot.com.br/2014/01/using-volley-in-your- application.html 我怎样才能做到这一点 ? 我正在尝试这个。 问题答案: 我对排球