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);