Opencv视觉学习--findContours()轮廓提取

对于刚开始学习Opencv的朋友们,查找资料是自学最好的方式。
这一篇博客,我将介绍利用Opencv的findContours()轮廓提取的操作方法,如有问题或建议可留言于我,谢谢!
更多资料请点击:我的目录
构建环境:Ubuntu18.04 + Opencv4.1.0 + QT5.12

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

参数解释
image:输入图像,图像必须为单通道图像(二值图像)。我们可以使用compare、inRange、threshold、adaptiveThreshold、Canny等函数来创建二值图像。

contours:检测到的轮廓,每个轮廓都是以点向量的形式进行存储即使用point类型的vector表示。

hierarchy:可选的输出向量(std::vector),包含了图像的拓扑信息,作为轮廓数量的表示hierarchy包含了很多元素,每个轮廓contours[i]对应hierarchy中hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引,如果没有对应项,则相应的hierarchy[i]设置为负数。

mode:轮廓检索模式,可以通过cv::RetrievalModes()查看详细信息:
RETR_EXTERNAL:表示只检测最外层轮廓,对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST:提取所有轮廓,并放置在list中,检测的轮廓不建立等级关系。
RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界,次层位内层边界。
RETR_TREE:提取所有轮廓并重新建立网状轮廓结构

method:轮廓近似方法,可以通过cv::ContourApproximationModes()查看详细信息:
CHAIN_APPROX_NONE:获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1;
CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,值保留该方向的重点坐标,如果一个矩形轮廓只需4个点来保存轮廓信息
CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS使用Teh-Chinl链逼近算法中的一种;
offset:轮廓点可选偏移量,有默认值Point(),对ROI图像中找出的轮廓并要在整个图像中进行分析时使用。

定义并找到轮廓:

vector<vector<Point>>contours;
vector<Vec4i>hierarchy;
findContours(bin_img,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));

更多资料请点击:我的目录

发布了75 篇原创文章 · 获赞 35 · 访问量 5942

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/103804614