java调用opencv轮廓检测

1,063 阅读1分钟

FindContours

显示最大轮廓

image.png

public static void testFindContours(Mat image) {
 //高斯滤波
 Imgproc.GaussianBlur(image, image, new Size(3, 3), 0, 0);
 Imgproc.cvtColor(image, image,Imgproc.COLOR_BGR2GRAY);
//一般来说,高阈值maxVal推荐是低阈值minVal的2~3倍
 int lowThresh=45;
 //边缘检测
 Imgproc.Canny(image, image,lowThresh, lowThresh*3,3);
 HighGui.imshow("Canny", image);

 List<MatOfPoint> contours = new ArrayList<>();
 Mat hierarchy = new Mat();
 /**
  * iamge 输入图像,需为8位单通道的二进制图像
  * contours 存储检测到的轮廓,每个轮廓存储为一个点向量
  * hierarchy //包含图像的拓扑信息,作为轮廓数量的表示。
              //每个轮廓对应4个hierarchy元素,分别表示后一个轮廓、
              //前一个轮廓、父轮廓、内嵌轮廓的索引编号。
              //若没有对应项,对应的hierarchy[i]值设置为负数
  *  mode 轮廓检索模式 RETR_EXTERNAL 只检测最外围的轮廓
  *                  RETR_LIST 检测所有轮廓,不建立等级关系,彼此独立
  *                  RETR_CCOMP 检测所有轮廓,但所有轮廓都只建立两个等级关系 
  *                  RETR_TREE 检测所有轮廓,并且所有轮廓建立一个树结构,层次完整。
  *                  RETR_FLOODFILL 洪水填充法
  *  method 轮廓的近似办法 CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点
  *                      CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
  *                      CV_CHAIN_APPROX_TC89_L1 使用Teh-Chin 链近似算法
  *                      CV_CHAIN_APPROX_TC89_KCOS 使用Teh-Chin 链近似算法
  *  offset //每个轮廓点的可选偏移量
  */ 
 Imgproc.findContours(image, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
 System.out.println("轮廓数量:"+ contours.size());
 System.out.println("hierarchy类型:"+ hierarchy);
 // 找出匹配到的最大轮廓
 double area = Imgproc.boundingRect(contours.get(0)).area();
 int index = 0;
 Random rng = new Random();
 Mat drawing = Mat.zeros(image.size(), CvType.CV_8U);
 //Imgproc.drawContours(drawing, contours, -1, new Scalar(255), 3, Imgproc.LINE_8, hierarchy, 0, new Point());
 Scalar color = new Scalar(rng.nextInt(256), rng.nextInt(256), rng.nextInt(256));
 for (int i = 0; i < contours.size(); i++) {
				double tempArea = Imgproc.boundingRect(contours.get(i)).area();
				if (tempArea > area) {
					area = tempArea;
					index = i;
				}
 }

	 
     /**
      * image,目标图像,填 Mat 类对象即可。
      * contours,输入的轮廓,每个轮廓都是一组点集,可用 Point 类型的 vector 表示。
      * contourIdx,轮廓的索引编号。若为负值,则绘制所有轮廓。
      * color,轮廓颜色。
      * thickness,轮廓线条的粗细程度,有默认值 1。若其为负值,便会填充轮廓内部空间。
      * lineType,线条的类型,有默认值 8。可去类型如下:
            *                      类型	含义
      *           8	8 连通线型
      *           4	4 连通线型
      *           LINE_AA	抗锯齿线型
      * hierarchy,可选的层次结构信息,有默认值 noArray()。
      * maxLevel,用于绘制轮廓的最大等级,有默认值 INT_MAX。
      * offset,轮廓信息相对于目标图像对应点的偏移量,相当于在每一个轮廓点上加上该偏移量,有默认值 Point() 。在 ROI 区域(感兴趣区域)绘制轮廓时,这个参数便可派上用场。
      */
 Imgproc.drawContours(drawing, contours, index, color, 1, Imgproc.LINE_AA, hierarchy, 0, new Point());
 
 HighGui.imshow("findContours", drawing);