Java OpenCV findContours函数RETR_CCOMP轮廓顺序

findContours函数说明

https://blog.csdn.net/marooon/article/details/81332487
https://blog.csdn.net/tanmx219/article/details/84973542
RETR_CCOMP:检测所有轮廓,但所有轮廓都只建立两个等级关系(简单的说就是检测双层轮廓)

坐标系说明

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

测试代码

//读入图片
Mat src = Imgcodecs.imread("F:\\opencvPhoto\\photo\\zz2.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_CCOMP , 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说明:将图片1内矩形从左到右依次标号为0-4,其中0号矩形(最左端矩形)和4号矩形(最右端矩形)最高像素点Y坐标相同
在这里插入图片描述

图片1结果

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

图片2

在这里插入图片描述

图片2层级图片

层级说明:红字为轮廓标号, 用绿色的“1”标记外层轮廓,用蓝色“2”标记内层轮廓
在这里插入图片描述

图片2结果

在这里插入图片描述

结论

  1. 外轮廓为同一层级 ,同一外轮廓的内轮廓为同一层级
  2. 双层轮廓顺序基于外轮廓最上像素点Y坐标从大到小排序(图片的从下到上),若存在Y坐标相同情况下根据X坐标从大到小排序(图片的从右到左)
  3. 若有多个内轮廓,内轮廓排序基于内轮廓最上像素点Y坐标从大到小排序(图片的从下到上),若存在Y坐标相同情况下根据X坐标从大到小排序(图片的从右到左)

其他

//注:在检测双层轮廓时,若只提取内轮廓时,可以使用以下语句对内轮廓进行筛选出来
语句如下:
if (ds[2] == -1) {

}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值