转自:opencv findcontour查找最大的内轮廓

问题是怎么来的呢

比如输入一幅图像,往往需要我们找最大的轮廓,如果是仅仅是查找最大的轮廓,那么问题也比较简单了,直接找出所有的轮廓,然后根据轮廓的面积,遍历查找出最大的轮廓即可。如果是找最大的外轮廓,那么问题也比较简单,因为findContours(image_contour_outside, contours_out, hierarchy_out, RETR_EXTERNAL, CHAIN_APPROX_NONE);有参数,CV_RETR_EXTERNAL:只检索最外面的轮廓。fingcontours函数详解,可参考百度百科。

现在的问题是:我们要查找最大的内轮廓。如果有一个参数,限定只找内轮廓就好了,可惜opencv并没有提供这样的接口。那么问题就需要我们自己动手解决了。

话不多说,直接上代码吧。开发环境vs2013+opencv2.4.13

[cpp] view plaincopy
  1. int chao_get_pointlist_inner_contour2(Mat src, vector<Point> &contourlist)
  2. {
  3. Mat image_contour_all = src.clone();
  4. Mat image_contour_outside = src.clone();
  5. vector<vector<Point> > contours_out;
  6. vector<Vec4i> hierarchy_out;
  7. findContours(image_contour_outside, contours_out, hierarchy_out, RETR_EXTERNAL, CHAIN_APPROX_NONE);
  8. vector<vector<Point> > contours_all;
  9. vector<Vec4i> hierarchy_all;
  10. findContours(image_contour_all, contours_all, hierarchy_all, RETR_TREE, CHAIN_APPROX_NONE);
  11. if (contours_all.size() == contours_out.size()) return -1;//没有内轮廓,则提前返回
  12. for (int i = 0; i < contours_out.size(); i++)
  13. {
  14. int conloursize = contours_out[i].size();
  15. for (int j = 0; j < contours_all.size(); j++)
  16. {
  17. int tem_size = contours_all[j].size();
  18. if (conloursize == tem_size)
  19. {
  20. swap(contours_all[j], contours_all[contours_all.size() - 1]);
  21. contours_all.pop_back();
  22. break;
  23. }
  24. }
  25. }
  26. //contours_all中只剩下内轮廓
  27. //查找最大轮廓
  28. double maxarea = 0;
  29. int maxAreaIdx = 0;
  30. for (int index = contours_all.size() - 1; index >= 0; index--)
  31. {
  32. double tmparea = fabs(contourArea(contours_all[index]));
  33. if (tmparea>maxarea)
  34. {
  35. maxarea = tmparea;
  36. maxAreaIdx = index;//记录最大轮廓的索引号
  37. }
  38. }
  39. contourlist = contours_all[maxAreaIdx];
  40. return 0;
  41. }

效果如图所示:

这个函数的原理就是:

1、找出所有的轮廓,包含内轮廓和外轮廓;

2、仅找出外轮廓;

3、删除所有轮廓中的外轮廓,即得到内轮廓

4、找出内轮廓中的最大轮廓

这是我目前想到的方法,如果读到这篇博文的读者,有更好的方法和建议,欢迎提出。

opencv findcontour查找最大的内轮廓相关推荐

  1. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍

    计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...

  2. OpenCV演示代码以查找图像中的轮廓(附完整代码)

    OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...

  3. OpenCV图象孔洞内轮廓填充

    图像内轮廓填充通常称为孔洞填充,主要用于目标提取.不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充.一种典型情况,当多个目标粘连,并 且形成环状时,简单的内轮廓填充会将环状内部背景部分误认 ...

  4. matlab灰度图孔洞填充,OpenCV图像内轮廓填-孔洞填充

    //test #include "stdafx.h" #include "cxcore.h" #include "cv.h" #includ ...

  5. 计算机视觉OpenCV(五):图像金字塔与轮廓检测

    目录 图像金字塔 1. 高斯金字塔(Gaussian Pyramid) 2. 拉普拉斯金字塔(Laplacian Pyramid) 图像轮廓 1. 查找检测物体的轮廓 2. 绘制轮廓 3. 轮廓特征 ...

  6. 【OpenCV 例程300篇】200.轮廓的基本属性

    OpenCV 例程200篇 总目录-202206更新 文章目录 [youcans 的 OpenCV 例程300篇]200.轮廓的基本属性 2.4 轮廓的基本属性 2.4.1 轮廓的宽高比(Aspect ...

  7. python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓

    轮廓检测 轮廓检测也是图像处理中经常用到的.OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. 实现 使用方式如下: import cv2   img ...

  8. opencv进阶学习笔记12:轮廓发现和对象测量

    基础版笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 轮廓发现 1轮廓发现介绍 基础 ...

  9. opencv学习笔记20:图像轮廓

    图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...

  10. OpenCV(六)之图像轮廓检测

    OpenCV(六)之图像轮廓检测 Contour detection系列 Contour detection-图像金字塔 图像金字塔-高斯金字塔 图像金字塔-拉普拉斯金字塔 Contour detec ...

最新文章

  1. Nature Methods:基于人工重组菌群数据的宏基因组的软件评估金标准
  2. 台湾国立大学郭彦甫Matlab教程笔记(21)linear equations(高斯消去法和追赶法)
  3. 基于Struts2的供求信息网设计(一)
  4. 【机器学习】FaceBook开源全网第一个时序王器--Kats。
  5. Android复习04(适配器 Get()请求 适配器 getView()方法 Post()请求 保存Cookie 流转字符串 从网上获取图片 重点考Json解析)
  6. tensorflow2 神经网络模型构建4种方法
  7. 使用自动机的Lucene新的邻近查询
  8. 论文浅尝 | 面向开放域的无监督实体对齐
  9. 解决Ubuntu18.04下VLC打不开的问题
  10. 平面设计版式构成实用技巧
  11. 如何在Mac电脑中设置投屏?Mac投屏,Mac电脑无线投屏教程
  12. 树莓派USB摄像头的使用
  13. nssa和stub_Stub区域和NSSA区域比较
  14. 从1G说到5G:构造万物互联的社会
  15. Kotlin For循环详解
  16. 语言认知模型--的学习笔记
  17. Spring源码解析-bean实例化
  18. 牛客2019跨年AK场 E 【大】约数 (两个数的全部公约数)
  19. 软件设计师2010上午题基础知识(易错整理)
  20. 南京邮电大学实验报告3.3

热门文章

  1. Python 定时任务(apscheduler模块)
  2. centos php mysql 配置_CentOS系统中安装配置Apache+PHP+MySQL环境
  3. ubuntu自定义安装里怎么选_安装地暖时,地板要怎么选?
  4. python gdbm_linux下python安装
  5. 用户已关闭隐式函数计算_针对隐式反馈和LightFM模型的杂谈
  6. PHP可以读取什么配置文件,使用php读取配置文件
  7. python去除列表指定位置元素_Python实现判断并移除列表指定位置元素的方法
  8. python不用sort排序_Python排序方法sort、sorted的key参数的作用
  9. android 按钮换行_自定义Android自动换行的布局
  10. JavaScript:时间戳(timestamp)与时间(Date)转换