FindContours
显示最大轮廓
网络异常,图片无法展示
|
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);