Java OpenCV findContours函数RETR_LIST轮廓顺序

findContours函数说明

https://blog.csdn.net/marooon/article/details/81332487
https://blog.csdn.net/tanmx219/article/details/84973542
RETR_LIST:检测所有轮廓,不建立等级关系,彼此独立

坐标系说明

以屏幕左上角为坐标原点,左右为X轴,上下为Y轴,其中自左向右X坐标逐渐增大,自上向下Y坐标逐渐增大,如下图所示。
坐标系说明图
在这里插入图片描述

测试代码

 //读入图片
 Mat src = Imgcodecs.imread("F:\\opencvPhoto\\photo\\zz.jpg");
 //灰度化
 Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2GRAY);
 //二值化
 Imgproc.threshold(src, src, 120, 255, Imgproc.THRESH_BINARY);
 //findContours测试
 List<MatOfPoint> contours=new ArrayList<MatOfPoint>();
 Mat hierarchy = new Mat();
 Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_LIST , Imgproc.CHAIN_APPROX_SIMPLE);
 for (int i = 0; i < contours.size(); i++) {
     Mat temp = new Mat(src.size(), CvType.CV_8U, new Scalar(0));
     Imgproc.drawContours(temp, contours, i, new Scalar(255), -1);
     //ds[0]->同层级的下一个轮廓(不存在为-1)
     //ds[1]->同层级的上一个轮廓(不存在为-1)
     //ds[2]->第一个子轮廓(不存在为-1)
     //ds[3]->父轮廓(不存在为-1)
     double[] ds = hierarchy.get(0, i);
     StringBuilder stringBuilder = new StringBuilder();
     stringBuilder.append(i); //轮廓标记
     stringBuilder.append("="); //分割符
     stringBuilder.append(ds[0]); //同层级的下一个轮廓
     stringBuilder.append("="); //分割符
     stringBuilder.append(ds[1]); //同层级的上一个轮廓
     stringBuilder.append("="); //分割符
     stringBuilder.append(ds[2]); //第一个子轮廓
     stringBuilder.append("="); //分割符
     stringBuilder.append(ds[3]); //父轮廓
     stringBuilder.append(".jpg");
     Imgcodecs.imwrite("F:\\opencvPhoto\\result\\" + stringBuilder, temp);
 }

图片测试

图片1

在这里插入图片描述

图片1结果

在这里插入图片描述

图片2

图片2说明:将图片2内矩形从左到右依次标号为0-4,其中0号矩形(最左端矩形)和4号矩形(最右端矩形)最高像素点Y坐标相同

在这里插入图片描述

图片2结果

图片2结果说明:轮廓输出顺序为1,2,4,0,3
在这里插入图片描述

图片3

在这里插入图片描述

图片3结果

在这里插入图片描述

结论

1.轮廓顺序基于轮廓最上像素点Y坐标从大到小排序(图片的从下到上),若存在Y坐标相同情况下根据X坐标从大到小排序(图片的从右到左)
2. RETR_LIST是不分层的所以轮廓的第一个子轮廓(ds[2])以及父轮廓(ds[3]) 为-1

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
findContours 函数OpenCV 中的一个轮廓检测函数,用于在二值化图像中查找轮廓。该函数的语法如下: ``` cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) ``` 参数说明: - image:输入图像,必须是一个二值化图像(即只有黑白两种颜色)。 - mode:轮廓检索模式,有以下两种模式: - cv2.RETR_EXTERNAL:只检测外轮廓。 - cv2.RETR_LIST:检测所有轮廓,并将它们保存在列表中。 - method:轮廓逼近方法,有以下几种方法: - cv2.CHAIN_APPROX_NONE:存储所有的轮廓。 - cv2.CHAIN_APPROX_SIMPLE:仅存储水平、垂直和对角线方向的端。 - cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chinl 链逼近算法。 - contours(可选):检测到的轮廓,以列表形式返回。 - hierarchy(可选):轮廓层次结构,以 numpy 数组形式返回。 - offset(可选):轮廓的偏移量。 返回值: - contours:检测到的轮廓,以列表形式返回。 - hierarchy:轮廓层次结构,以 numpy 数组形式返回。 示例代码: ```python import cv2 # 读入图像并转为灰度图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化图像 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(img, contours, -1, (0, 0, 255), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该示例代码将读入一张名为 test.jpg 的图像,并进行灰度化和二值化处理。然后使用 findContours 函数查找轮廓,并使用 drawContours 函数轮廓绘制在原图上。最后显示结果图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值