Contour Properties in findContours

    OpenCV中的轮廓(Contours)是形状分析以及对象检测和识别的非常有用的工具,我们可以通过函数findContours获取。今天我们继续来学习Contours的相关的常用函数boundingRect,minAreaRect,contourArea,convexHull。
参考资料
    参考链接中有一系列关于findContours获得的Contours的相关函数与属性,值得认真学习哦,感谢原作者!

测试环境

Visual studio 2019
Opencv4.3

前言

    上一篇文章Contours Hierarchy and order in OpenCV我们学习了findContours不同轮廓检索模式(Contour Retrieval Mode)下返回轮廓的层次结构与排序规律,本文将继续学习findContours得到的Contours的相关的常用函数boundingRect,minAreaRect,contourArea,convexHull。上述函数在Structural Analysis and Shape Descriptors均有具体说明,本文将以代码为例来学习上述函数。

boundingRect/minAreaRect/contourArea/convexHull测试与说明

第3~6行代码读取测试图像,并获取其二值化图像;
第8~10行代码通过调用findContours函数以CV_RETR_LIST模式获取二值化图像中的轮廓;
接下来开始遍历每一个轮廓并绘制外接矩形和最小外接矩形,获取相应轮廓的凸包:
第17~18行获取当前轮廓的外接矩形(boundingRect),用红色线绘制;
第20~24行获取当前轮廓的最小外接矩形(minAreaRect),用绿色线绘制;
第26~33行在原图中外接轮廓左上角附近用红色字体显示其轮廓的编号;
第35行调用convexHull函数获取当前轮廓的凸包;
第36~38行在命令行中输出轮廓面积(contourArea),外接矩形面积(bbRectArea),凸包面积(hullArea);

第39行在命令中输出contourArea/bbRectArea/hullArea/Extent/Solidity。

第41~42行在原图中绘制所有轮廓和凸包。

在原图中同时绘制了各轮廓外接矩形,最小外接矩形,凸包以及自身轮廓的图像如下:

Contour properties test

该测试图原图如下所示:

Contour Properties

运行上述代码后得到的命令行测试结果如下:

接下来我们来看一下参考链接Contour Properties中提到的Extent和Solidity。

extent and solidity

Extent:其值小于1,因为contourArea得到的是当前轮廓所包围的像素数量,而boundingRect得到的是当前轮廓外接矩形的面积。
Solidity:与Extent相同,Solidity不能大于1。形状内的像素数不能超过凸包中的像素数,因为根据定义,凸包是包围形状的最小像素集 。

在某些需要区分固定形状的物件时,通过计算和判断Extent和Solidity的范围就可以实现,例如本文中的测试图形。大家可以参考Advanced contour properties解锁本文体积函数的更多有趣的应用。

本文到此结束,感谢阅读,欢迎关注。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub