opencv findContuors 详解

来源:互联网 发布:360游戏优化器安卓版 编辑:程序博客网 时间:2024/06/05 03:08

官网的解释很明白,结合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 cv2import numpy as npimport matplotlib.pyplot as plt#init image img = np.ones((200, 200, 3), dtype = np.uint8) * 255img[:, :9, :] = 0img[:, -10:, :] = 0img[:9, :, :] = 0img[-10:, :, :] = 0#convert colorgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#find contourscontours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#draw contourscv2.drawContours(img, contours, -1, (0,255, 0), 1)plt.figure(), plt.imshow(img, cmap = 'gray')plt.show()
结果如下:







原创粉丝点击