opencv的一些函数——contours

opencv的一些函数——contours,第1张

image, contours, hierarchy = cv2findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point());

findContours( InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point());

检测轮廓方法(mod):

表示一条轮廓的方法(method):

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )

函数参数详解:

1、获取包围对象的垂直矩阵

2、获取包围对象的最小圆

3、获取包围对象的多边形

4、获得包围对象的凸包

原理

5、轮廓中的所有点

一个想法:先取得轮廓,然后新建一个图像,在新图像上画出轮廓以及填充的图像,遍历这幅图像,如果有颜色就是在轮廓内。

另一个方法1

另一个方法2

6、最小面积的外接矩形(可倾斜)

minAreaRect(InputArray points);

7、可倾斜椭圆(见上)

fitEllipse(InputArray points);

8、轮廓内连通区域的面积和长度

double contourArea(InputArray contour, bool oriented=false )

double arcLength(InputArray curve, bool closed);

9、判断一个点是否在一个多边形内

pointPolygonTest

double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)

用于测试一个点是否在多边形中

当measureDist设置为true时,若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。

当measureDist设置为false时,若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上。

10、比较两个形状的相似性

原理: OpenCV提供的一个根据计算比较两张图像Hu不变距的函数,函数返回值代表相似度大小,完全相同的图像返回值是0,返回值最大是1。这可以用在在一堆照片中搜索出两张相同或相同程度最大的图像。

double cvMatchShapes(const void object1, const void object2, int method, double parameter = 0);

1、数字图像:

数字图像,又称为数码图像或数位图像,是二维图像用有限数字数值像素的表示。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储和处理的图像。

2、数字图像处理包括内容:

图像数字化;图像变换;图像增强;图像恢复;图像压缩编码;图像分割;图像分析与描述;图像的识别分类。

3、数字图像处理系统包括部分:

输入(采集);存储;输出(显示);通信;图像处理与分析。

4、从“模拟图像”到“数字图像”要经过的步骤有:

图像信息的获取;图像信息的存储;图像信息处理;图像信息的传输;图像信息的输出和显示。

5、数字图像1600x1200什么意思?灰度一般取值范围0~255,其含义是什么?

数字图像1600x1200表示空间分辨率为1600x1200像素;灰度范围0~255指示图像的256阶灰阶,就是通过不同程度的灰色来来表示图像的明暗关系,8bit的灰度分辨率。

理论

在前面的关于轮廓的几节里,我们介绍了轮廓相关的一些函数。但当我们用cv2findContours()函数来找轮廓的时候,我们传入了一个参数,Contour Retrieval Mode。我们一般传的是cv2RETR_LIST或者cv2RETR_TREE这样就可以了。但是这个参数实际是什么意思呢?

并且在输出时我们得到了三个数组,第一个是图像,第二个是我们的轮廓,第三个输出名字是hierarchy。但是我们一直没用这个。

什么是层级

一般来说我们用cv2findContours()函数来检测图像里的目标,有时候目标在不同的地方,但是在有些情况下,有些图形在别的图形里面,就像图形嵌套,在这种情况下,我们把外面那层图形叫做parent,里面的叫child。这样图形里的轮廓之间就有了关系。我们可以指定一个轮廓和其他之间的是如何连接的,这种关系就是层级。

看下面的例子:

在这个图像里,不同的图形我标注了0-5,2和2a表示了最外层盒子的外部和内部轮廓。

这里轮廓0,1,2是外部的。我们可以说他们是hierarchy-0,或者他们是同层级的。

接下来是contour-2a,可以认为是轮廓-2的孩子,或者反过来,contour-2是contour-2a的父亲,所以它在hierarchy-1里。类似的contour-3是contour-2的孩子,在下一层级。最后contour4,5是contour-3a的孩子,它们在最后的层级。

OpenCV里的层级表示

每个轮廓有他自己的关于层级的信息,谁是他的孩子,谁是他的父亲等。OpenCV用一个包含四个值得数组来表示:[Next, Previous, First_Child, Parent]

"Next表明同一层级的下一个轮廓"

比如,在我们的里的contour-0,水上hi他相同层级的下一个轮廓?是contour-1,所以Next=1,对于Contour-1,下一个是contour-2,所以Next=2

那对于contour-2呢?没有同层级的下一个轮廓,所以Next=-1。那么对于contour-4呢?同层级的下一个是contour-5,所以下一个轮廓是contour-5Next=5

"Previous指同层级的前一个轮廓"

和上面一样,contour-1的前一个是contour-0contour-2的前一个contour-1对于contour-0没有前序,所以-1

"First_Child指它的第一个孩子轮廓"

不用解释,对于contour-2,孩子是contour-2a,所以这里是contour-2a的索引,contour-3a有两个孩子,但我们只取第一个,是contour-4,所以First_Child=4

"Parent指它的父轮廓索引"

和First_Child相反,contour-4和contour-5的parent都是contour-3a,对于contour-3a,是contour-3

注意:

如果没有孩子或者父亲,就为-1

我们知道了层级,现在来看OpenCV里的轮廓获取模式,四个标志cv2RETR_LIST, cv2RETR_TREE, cv2RETR_CCOMP, cv2RETR_EXTERNAL表示啥?

轮廓获取模式

1RETR_LIST

这是最简单的一个,它获取所有轮廓,但是不建立父子关系,他们都是一个层级。

所以,层级属性第三个和第四个字段(父子)都是-1,但是Next和Previous还是有对应值。

下面是结果,每行是对应轮廓的层级信息。

>>> hierarchy

2RETR_EXTERNAL

如果用这个模式,它返回最外层的。所有孩子轮廓都不要,我们可以说在这种情况下,只有家族里最老的会被照顾,其他都不管。

所以在我们的图像里,有多少最外层的轮廓呢,有3个,contours 0,1,2

3RETR_CCOMP

这个模式获取所有轮廓并且把他们组织到一个2层结构里,对象的轮廓外边界在等级1里,轮廓内沿(如果有的话)放在层级2里。如果别的对象在它里面,里面的对象轮廓还是放在层级1里,它的内沿在层级2

看下面的例子,轮廓的顺序为红色,他们的层级是绿色,

看第一个轮廓,contour-0,他的层级是1,他有两个洞,contours1和2,他们都属于层级2,所以对于contour-0,Next是contour-3,没有前序,他的第一个孩子是contour-1,没有parent,所以层级数组是[3,-1,1,-1]

看contour-1,他在层级2里,Next是contour-2,没有前序,没有孩子,parent是contour-0,所以数组是[2,-1,-1,0]

同样对于contour-2,也在层级2里,没有next,前序是contour-1,没有孩子,parent是contour-0,所以[-1,1,-1,0]。

contour-3:next是contour-5,Previous是contour-0,Child是contour-4,没有parent,所以[5,0,4,-1]

contour-4:在层级2里,没有兄弟,所以没有Next,没有Previous,没有孩子,parent是contour-3,[-1,-1,-1,3]

4RETR_TREE

最后,MrPerfect。它取回所有的轮廓并且创建完整的家族层级列表,它甚至能告诉你谁是祖父,父亲,儿子,孙子。。

比如把上面的图形用cv2RETR_TREE,

对于contour-0:层级是0,Next是contour-7,没有previous,孩子是contour-1,没有parent,所以[7,-1,1,-1]

contour-1:在层级1里,没有同级的其他轮廓,没有previous,孩子是contour-2,所以[-1,-1,2,0]

OpenCV里的直方图

以上就是关于opencv的一些函数——contours全部的内容,包括:opencv的一些函数——contours、Opencv数字图像处理颜色识别问题_opencv颜色分割、OpenCV-Python教程:22.轮廓层级等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9791932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存