opencv findcontour查找最大的内轮廓
转自:opencv findcontour查找最大的内轮廓
问题是怎么来的呢
比如输入一幅图像,往往需要我们找最大的轮廓,如果是仅仅是查找最大的轮廓,那么问题也比较简单了,直接找出所有的轮廓,然后根据轮廓的面积,遍历查找出最大的轮廓即可。如果是找最大的外轮廓,那么问题也比较简单,因为findContours(image_contour_outside, contours_out, hierarchy_out, RETR_EXTERNAL, CHAIN_APPROX_NONE);有参数,CV_RETR_EXTERNAL:只检索最外面的轮廓。fingcontours函数详解,可参考百度百科。
现在的问题是:我们要查找最大的内轮廓。如果有一个参数,限定只找内轮廓就好了,可惜opencv并没有提供这样的接口。那么问题就需要我们自己动手解决了。
话不多说,直接上代码吧。开发环境vs2013+opencv2.4.13
- int chao_get_pointlist_inner_contour2(Mat src, vector<Point> &contourlist)
- {
- Mat image_contour_all = src.clone();
- Mat image_contour_outside = src.clone();
- vector<vector<Point> > contours_out;
- vector<Vec4i> hierarchy_out;
- findContours(image_contour_outside, contours_out, hierarchy_out, RETR_EXTERNAL, CHAIN_APPROX_NONE);
- vector<vector<Point> > contours_all;
- vector<Vec4i> hierarchy_all;
- findContours(image_contour_all, contours_all, hierarchy_all, RETR_TREE, CHAIN_APPROX_NONE);
- if (contours_all.size() == contours_out.size()) return -1;//没有内轮廓,则提前返回
- for (int i = 0; i < contours_out.size(); i++)
- {
- int conloursize = contours_out[i].size();
- for (int j = 0; j < contours_all.size(); j++)
- {
- int tem_size = contours_all[j].size();
- if (conloursize == tem_size)
- {
- swap(contours_all[j], contours_all[contours_all.size() - 1]);
- contours_all.pop_back();
- break;
- }
- }
- }
- //contours_all中只剩下内轮廓
- //查找最大轮廓
- double maxarea = 0;
- int maxAreaIdx = 0;
- for (int index = contours_all.size() - 1; index >= 0; index--)
- {
- double tmparea = fabs(contourArea(contours_all[index]));
- if (tmparea>maxarea)
- {
- maxarea = tmparea;
- maxAreaIdx = index;//记录最大轮廓的索引号
- }
- }
- contourlist = contours_all[maxAreaIdx];
- return 0;
- }
效果如图所示:
这个函数的原理就是:
1、找出所有的轮廓,包含内轮廓和外轮廓;
2、仅找出外轮廓;
3、删除所有轮廓中的外轮廓,即得到内轮廓
4、找出内轮廓中的最大轮廓
这是我目前想到的方法,如果读到这篇博文的读者,有更好的方法和建议,欢迎提出。
opencv findcontour查找最大的内轮廓相关推荐
- 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍
计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...
- OpenCV演示代码以查找图像中的轮廓(附完整代码)
OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 OpenCV演示代码以查找图像中的轮廓 #include "opencv2/imgcodecs.hpp&quo ...
- OpenCV图象孔洞内轮廓填充
图像内轮廓填充通常称为孔洞填充,主要用于目标提取.不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充.一种典型情况,当多个目标粘连,并 且形成环状时,简单的内轮廓填充会将环状内部背景部分误认 ...
- matlab灰度图孔洞填充,OpenCV图像内轮廓填-孔洞填充
//test #include "stdafx.h" #include "cxcore.h" #include "cv.h" #includ ...
- 计算机视觉OpenCV(五):图像金字塔与轮廓检测
目录 图像金字塔 1. 高斯金字塔(Gaussian Pyramid) 2. 拉普拉斯金字塔(Laplacian Pyramid) 图像轮廓 1. 查找检测物体的轮廓 2. 绘制轮廓 3. 轮廓特征 ...
- 【OpenCV 例程300篇】200.轮廓的基本属性
OpenCV 例程200篇 总目录-202206更新 文章目录 [youcans 的 OpenCV 例程300篇]200.轮廓的基本属性 2.4 轮廓的基本属性 2.4.1 轮廓的宽高比(Aspect ...
- python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓
轮廓检测 轮廓检测也是图像处理中经常用到的.OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. 实现 使用方式如下: import cv2 img ...
- opencv进阶学习笔记12:轮廓发现和对象测量
基础版笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 轮廓发现 1轮廓发现介绍 基础 ...
- opencv学习笔记20:图像轮廓
图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...
- OpenCV(六)之图像轮廓检测
OpenCV(六)之图像轮廓检测 Contour detection系列 Contour detection-图像金字塔 图像金字塔-高斯金字塔 图像金字塔-拉普拉斯金字塔 Contour detec ...
最新文章
- Nature Methods:基于人工重组菌群数据的宏基因组的软件评估金标准
- 台湾国立大学郭彦甫Matlab教程笔记(21)linear equations(高斯消去法和追赶法)
- 基于Struts2的供求信息网设计(一)
- 【机器学习】FaceBook开源全网第一个时序王器--Kats。
- Android复习04(适配器 Get()请求 适配器 getView()方法 Post()请求 保存Cookie 流转字符串 从网上获取图片 重点考Json解析)
- tensorflow2 神经网络模型构建4种方法
- 使用自动机的Lucene新的邻近查询
- 论文浅尝 | 面向开放域的无监督实体对齐
- 解决Ubuntu18.04下VLC打不开的问题
- 平面设计版式构成实用技巧
- 如何在Mac电脑中设置投屏?Mac投屏,Mac电脑无线投屏教程
- 树莓派USB摄像头的使用
- nssa和stub_Stub区域和NSSA区域比较
- 从1G说到5G:构造万物互联的社会
- Kotlin For循环详解
- 语言认知模型--的学习笔记
- Spring源码解析-bean实例化
- 牛客2019跨年AK场 E	【大】约数 (两个数的全部公约数)
- 软件设计师2010上午题基础知识(易错整理)
- 南京邮电大学实验报告3.3
热门文章
- Python 定时任务(apscheduler模块)
- centos php mysql 配置_CentOS系统中安装配置Apache+PHP+MySQL环境
- ubuntu自定义安装里怎么选_安装地暖时,地板要怎么选?
- python gdbm_linux下python安装
- 用户已关闭隐式函数计算_针对隐式反馈和LightFM模型的杂谈
- PHP可以读取什么配置文件,使用php读取配置文件
- python去除列表指定位置元素_Python实现判断并移除列表指定位置元素的方法
- python不用sort排序_Python排序方法sort、sorted的key参数的作用
- android 按钮换行_自定义Android自动换行的布局
- JavaScript:时间戳(timestamp)与时间(Date)转换