首页 > 编程知识 正文

opencv轮廓检测,contours婴儿车简介

时间:2023-05-03 13:19:48 阅读:163589 作者:967

import c v2 importnumpyasnpimg=cv2.im read (test.jpg ) imgray=cv2.cvtcolor(img,cv2.COLOR_BGR2GRAY ) ret,contt cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE ) cv2.imshow ) ) im实际情况与输入参数的thresh原图像相同cv2.waitkey(print ) NP.size ) contours ) ) (对应轮廓之间的关系img=cv2.drawcontours ) img、[contours[0]]、-1、) 0、255、0 )、10 )打印标记处的编号img ) cv2.wait kkit

参数含义: image表示输入的图像。 注意输入的图片必须为二值图片。如果输入的图像是彩色图像,则需要首先进行灰度化和二值化。

mode表示轮廓的搜索模式有四种:

cv2.RETR_EXTERNAL表示仅检测外轮廓。

cv2.RETR_LIST检验的配置文件不建立等级关系。

cv2.RETR_CCOMP创建两个级别的轮廓:上层为外部边界,中层为内部孔边界信息。 内孔内有连通物体时,该物体的边界也在顶层。

cv2.RETR_TREE创建分层树结构的配置文件。

method是轮廓的近似方法,有4种。

cv2.CHAIN_APPROX_NONE存储所有轮廓点,且两个相邻点的像素位置差不大于一,即max(ABS(x1-x2 )、ABS (y2-y1 ) ) )=1。

cv2.CHAIN_APPROX_SIMPLE压缩水平方向、垂直方向、对角线方向的要素,仅保留该方向的终点坐标。 例如,矩形轮廓用4个点保存轮廓信息。

cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain近似算法。

返回值: cv2.findContours ()函数返回两个值:配置文件本身contours和与每个配置文件对应的属性hierarchy

contours:

cv2.findContours ) )函数首先返回一个list。 list中的每个元素(在本例中为两个)是图像中的轮廓信息,而list中的每个元素(轮廓信息)的类型为ndarray。 len(contours[1] )表示保存在第一个轮廓中的元素的数量,即保存在该轮廓中的点的数量。 本例中的第一个轮廓是矩形,轮廓上有四个点。 这是因为当参数mode设置为cv2.CHAIN_APPROX_SIMPLE时,轮廓不会存储轮廓上的所有点,而是只存储可以用直线描述轮廓的点数。 例如,只要是“直立”的矩形即可

print(type ) contours ) #输出是class ' list ' print (type ) contours[0] ) #输出是class 'numpy.ndarray'pr

int(len(contours)) # 图像中轮廓的数量,输出为:2print(len(contours[1])) # 轮廓1(矩形)中的元素(点)的数量, 输出为:4

由于我们知道返回的轮廓有两个,因此可通过

cv2.drawContours(img,contours,0,(0,0,255),3)

cv2.drawContours(img,contours,1,(0,255,0),3)

分别绘制两个轮廓,关于该参数可参见:cv2.drawContours() 轮廓绘制

 

 

hierarchy:

此外,该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。
 

print(hierarchy)

输出:[[[ 1 -1 -1 -1]
                        [-1  0 -1 -1]]]

 

下面具体解释下hierarchy输出的矩阵参数的意义:
           其输出矩矩阵大小为NXM, 其中N为轮廓的个数,M恒等于4,也就是说每一行的4个数,能够表示出轮廓间的相互关系,那么具体是怎样表示的呢

第一个数:表示同一级轮廓的下个轮廓的编号,如果这一级轮廓没有下一个轮廓,一般是这一级轮廓的最后一个的时候,             则为-1

第二个数:表示同一级轮廓的上个轮廓的编号,如果这一级轮廓没有上一个轮廓,一般是这一级轮廓的第一个的时候,则             为-1

第三个数:表示该轮廓包含的下一级轮廓的第一个的编号,假如没有,则为-1

第四个数: 表示该轮廓的上一级轮廓的编号,假如没有上一级,则为-1
 

以如下的图片为例:

hierarchy为:

[[[ 1 -1 -1 -1] #轮廓0 [ 4 0 2 -1] #轮廓1 [-1 -1 3 1] #轮廓2 [-1 -1 -1 2] #轮廓3 [-1 1 -1 -1]]] #轮廓4

轮廓0,它的同级下一个的编号为1,第一个参数为1; 因为这一级别的第一个,第二个参数-1;因为不包含子轮廓,所以第三个参数-1;因为处于第一级,其不属于任何别的级别,所以第四个参数为-1
轮廓1,它的同级下一个的编号为4,第一个参数为4; 因为这一级别的上一个的编号为0,第二个参数0;因为包含子轮廓,且子轮廓的第一个编号(当然只包含一个,多个也是同样的道理)为2,所以第三个参数2;因为处于第一级,其不属于任何别的级别,所以第四个参数为-1

轮廓2,它是第二级的最后一个(因为只有一个),所以第一个参数为-1; 它也是第二级的第一个,所以第二个参数为-1;因为包含子轮廓,且子轮廓的第一个编号(当然只包含一个,多个也是同样的道理)为3,所以第三个参数3; 因为处于第二级,其属于上一级的轮廓1,所以第四个参数为1

依次类推 。。。。。轮廓3

轮廓4  它是同一级(第一级)的最后一个,因此第一个参数为-1;因为这一级别的上一个的编号为1,第二个参数1;因为不包含子轮廓,所以第三个参数-1;因为处于第一级,其不属于任何别的级别,所以第四个参数为-1

 

 

 

 

 

 

 

 

 

 

 


--------------------- 
作者:Lecol_leng 
来源:CSDN 
原文:https://blog.csdn.net/jjddss/article/details/73527990 

作者:Daetalus 
原文:https://blog.csdn.net/sunny2038/article/details/12889059 
      

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。