OpenCV学习之路(十八) 图像的轮廓

本文详细介绍了使用OpenCV进行图像轮廓检测的步骤,包括findContours()和drawContours()函数的使用,以及如何计算和绘制轮廓的凸包。此外,还讨论了如何通过boundingRect(), minAreaRect(), minEnclosingCircle(), fitEllipse()等函数获取轮廓的包围矩形、最小外接矩形、最小外接圆和椭圆。最后,探讨了图像矩的概念及其在形状分析中的应用,如计算面积和周长等几何特征。" 133423155,19687575,计算机病毒的危害与防范策略,"['服务器', '编程', '安全']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

查找并绘制轮廓:

查找并绘制物体的凸包

使用多边形将轮廓包围

图像的矩


 

查找并绘制轮廓

查找并绘制凸包

轮廓外接矩形和最小外接圆

轮廓最小外接矩形和外接椭圆

图像的矩

 

查找并绘制轮廓:

1. findContours() 函数。查找轮廓。函数原型如下:

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

(1)第一个参数,InputArray 类型的 image,源图像。8位单通道。图像的非零元素被视为 1,0 像素值保留为 0,所以图像为二进制。也可以使用 compare()、inrange()、threshold()、adaptivethreshold()、canny() 等函数由灰度图或彩色图创建二值图。此函数将会在提取图像轮廓的同时修改图像的内容。如果第四个参数为cv::RETR_CCOMP或cv::RETR_FLOODFILL,输入图像可以是32-bit整型图像(CV_32SC1) 。

(2)第二个参数,OutputArrayOfArrays 类型的 contours、检测到的轮廓、函数调用后的运算结果存在这里。每个轮廓存储为一个点向量,即用 Point 类型的 vector 表示。

(3)第三个参数,OutputArray 类型的 hierarchy,可选的输出向量,包含图像的拓扑信息。其作为轮廓数量的表示,包含了很多元素。每个轮廓 contours[ i ] 对应 4 个 hierarchy 元素 hierarchy[ i ][ 0 ] ~ hierarchy[ i ][ 3 ],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对应项,对应的 hierarchy[ i ] 值设置为负数。

(4)第四个参数,int 类型的 mode,轮廓检索模式,如下所示:

      RETR_EXTERNAL,表示只检索最外层轮廓。对所有轮廓,设置 hierarchy[i][2] = hierarchy[i][3] = -1。

      RETR_LIST,提取所有的轮廓,并且放置在 list 中。检测的轮廓不建立等级关系。

      RETR_CCOMP,提取所有轮廓,并且将其组织为双层结构(顶层为连通域的外围边界,次层为孔的内层边界)。

      RETR_TREE,提取所有轮廓,并重新建立网状的轮廓结构。

(5)第五个参数,int 类型的 method,为轮廓的近似方法。如下所示:

     CHAIN_APPROX_NONE,获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1。

     CHAIN_APPROX_SIMPLE,压缩水平、垂直、对角线方向的元素,只保留该方向的终点坐标。如矩形只留四个点。

     CHAIN_APPROX_TC89_L1 和 CHAIN_APPROX_TC89_KCOS, 使用 Teh-Chinl 链逼近算法中的一个。

 

2. drawContours() 函数,绘制轮廓。函数原型如下:

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)第一个参数,InputArray 类型的 image,输入输出图像。

(2)第二个参数,InputArrayOfArrays 类型的 contours,所有的输入轮廓,findContours() 查找到的。

(3)第三个参数,int 类型的 contourIdx,轮廓绘制的指示变量。若为负值,则绘制全部轮廓。

(4)第四个参数,const Scalar& 类型的 color,轮廓的颜色。

(5)第五个参数,int 类型的 thickness,轮廓线条的粗细度,默认值为 1。若为负值,便会绘制在轮廓的内部。可选为FILLED 宏变量。

(6)第六个参数,int 类型的 lineType,线条的类型,默认值为 8。有如下类型:

        8, 8 联通线型;

        4,4 联通线型;

        LINE_AA, 抗锯齿线型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值