官网的解释很明白,结合http://blog.csdn.net/jfuck/article/details/9620889画了两个图一起解释就直观了。主要的方法来自Suzukietc. 1985这篇1985年的论文。

函数原型:

C++: void findContours(InputOutputArray image,OutputArrayOfArrays contours, OutputArray hierarchy,int mode, int method, Point offset=Point())¶

C++: void findContours(InputOutputArray image,OutputArrayOfArrays contours, int mode, int method,Point offset=Point())

Python: cv2.findContours(image, mode, method[, contours[, hierarchy[,offset]]]) → contours, hierarchy

参数解释:

image: 输入图像

contours:检测到的contours,以点对的形式存储

hierarchy:可选择的输出,包含图像的拓扑结构。下面的这个图解释了hierarchy的结构。

其中如果没有的话为-1. 还可以用一个树形图来表示他们之间的关系,下图左边是假设有5个边界,他们之间的包含关系可以直接看出,也可以用右边的树状图表示,那么上面的表格就用四列数据表示了这种树状关系,读者可以将二者一一对应起来。这个hierarchy的索引是从0开始的(0-based),使用的时候注意即可。

mode: Contour retrievalmode. 也就是检测边缘的方法,不同的mode返回不同的东西。

l  CV-RETR_EXTERNAL: 听名字就知道了,返回的是仅仅最外边的一层contours。上文博客说此时hierarchy没有任何作用是不正确的,只是后两列中的数值设为-1了,前 两列的数还有意义。

l  CV_RETR_LIST: 这个是只返回轮廓信息,而不识别不同轮廓之间的拓扑结构,因此此时hierarchy就没什么用了。

l  CV_RETR_CCOMP: 这个返回的是两层树状结构,物体(components)在第一层,空洞(holes)在第二层。如果空洞中仍然有物体,那么其边界也会被列入第一层。

l  CVRETR_TREE: 这个就是最全的一个了,所有的边界信息外加hierarchy,也就是上图中的树状图。

method:这个参数就是为了节省点内存空间。对于一条直线没有必要保存下来他全部的点,只需要保存下来端点就可以还原整条直线了。因此不同参数对应着不同的边界点保存方法。

l  CV_CHAIN_APPROX_NONE:看名字就知道了,不估计嘛,因此所有点都保存下来。

l  CV_CHAIN_APPROX_SIMPLE:看名字吧,简单的估计方法,具体就不深究了。

注意:老版本的Python中使用cv2.CHAN_APPROX_NONE,也就是说没有CV_字符,其他同理,注意即可。

好了,又到了大家最喜欢的上代码时间了:

import cv2
import numpy as np
import matplotlib.pyplot as plt#init image
img = np.ones((200, 200, 3), dtype = np.uint8) * 255
img[:, :9, :] = 0
img[:, -10:, :] = 0
img[:9, :, :] = 0
img[-10:, :, :] = 0#convert color
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#find contours
contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#draw contours
cv2.drawContours(img, contours, -1, (0,255, 0), 1)plt.figure(), plt.imshow(img, cmap = 'gray')
plt.show()

结果如下:

opencv findContuors 详解相关推荐

  1. opencv卡尔曼滤波详解

    1.问题描述 假设下面曲线 y=kx+b+wy=kx+b+w y=kx+b+w 其中a,b为曲线的参数,w为高斯噪声.假设我们有N个关于x,y的观测数据点,想根据这些数据点求出直线的参数. 2.卡尔曼 ...

  2. 【openCV学习笔记】在Mac上配置openCV步骤详解

    (1)安装Homebrew:(需要Ruby) 注:因为snow leopard 以后已经自带Ruby了,所有可以不用自己安装Ruby. 看一下Homebrew的官网: http://mxcl.gith ...

  3. OpenCV:详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  4. OpenCV Stitching_detailed 详解

    算法流程函数: 1. (*finder)(img, features[i]) Mathematical explanation: Refer to BRIEF: Binary Robust Indep ...

  5. opencv cvhog详解

    首先关于HOG算法: #include "_cvaux.h" /********************************************************** ...

  6. openCV Contours详解

    在OpenCV中处理结构分析和形状描述(Structural Analysis and Shape Descriptors),大部分跟contours相关. 轮廓线就是一条连接所有边界点的曲线,其实也 ...

  7. OpenCV Mat详解

    Mat是OpenCV存储对象单元,一般我们在存储或者转换数据时,都需要用到它. 1.创建Mat对象 // 创建一个 1280x1024的 8 位无符号型 4 通道全 0 的 Mat cv::Mat m ...

  8. 图像处理: OpenCV编程详解(C++) 【持续更新中】

    原创不易,侵权必究 作者联系方式 : QQ:993678929 一. 开发环境配置 Visual Studio 2019 + opencv 这里仅记录配置过程中可能遇到的问题 由于找不到 opencv ...

  9. OpenCV中值滤波器详解及代码实现

    中值滤波(Median Filter)是一种非线性滤波技术,其基本思想是在单通道中将像素点邻域的灰度值进行排序,取中间值来代替原来的像素点的灰度值.中值滤波是目前处理椒盐噪声最好的滤波方式. 椒盐噪声 ...

  10. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. eShopOnContainers 知多少[8]:Ordering microservice
  2. 复习01统计学习方法(机器学习中的重要概念)---图片版
  3. java虚拟机学习(四)类的加载过程
  4. memcache和redis对比
  5. ecu故障现象_【案例】柴油电喷车维修故障案例
  6. 全球域名服务商域名增量TOP10:中国占据3个席位
  7. Linux开发5款实用工具推荐
  8. jsf集成spring_Spring和JSF集成:国际化和本地化
  9. Django 2.0 学习(20):Django 中间件详解
  10. 【英语学习】【WOTD】newspeak 释义/词源/示例
  11. 水滴公司再回应“线下违规”:核心是公司的管理问题
  12. 我发现有的人就活该他赚钱,他们的脑子就是个聚宝盆
  13. three轨迹线在mapbox地图上显示
  14. Gallery和BaseAdapter容器
  15. Hibernate数据查询
  16. Freescale PowerPC系列架构 处理器 种类介绍 型号发展
  17. 搜pos不为了收单而收单,互联网是个神奇的动物
  18. 怎么创建账户Crowd 和 JIRA、Confluence、Fisheye and Crucible、GitLab共享账户已经集成登入
  19. 利用python获取身份证号中年龄和性别信息
  20. 微信公众号提供的服务器故障,微信公众号出现“该公众号提供的服务出现故障”解决办法...

热门文章

  1. [Codeforces 100633J]Ceizenpok’s formula
  2. 项目中用到的一些特殊字符和图标
  3. [转]IIS状态代码的含义
  4. 【转】解密微软的架构师之路
  5. RabbitMQ系列(七)--批量消息和延时消息
  6. H5(仅仅是个地址)
  7. 八数码问题的SET实现与哈希实现的比较
  8. 学习的第一推动力(很好)
  9. 转载:C#7.0新特性(VS2017可用)
  10. python数据类型:序列(字符串,元组,列表,字典)