opencv findContuors 详解

官网的解释很明白,结合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()
结果如下:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此人姓于名叫罩百灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值