OpenCV成长之路(8)直线、轮廓的提取与描述
- 格式:docx
- 大小:418.88 KB
- 文档页数:7
OPENCV实现的轮廓检测与处理OpenCV是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉相关的算法和工具。
其中,轮廓检测与处理是OpenCV中一个重要的功能,用于检测图像中的物体轮廓并对其进行处理。
在OpenCV中,轮廓检测是通过对图像进行二值化处理,然后寻找轮廓的闭合边缘来实现的。
下面将介绍使用OpenCV实现轮廓检测与处理的具体步骤。
第一步是图像预处理,包括读取图像、灰度化和二值化。
在OpenCV 中,可以使用`cv2.imread(`函数读取图像,并使用`cv2.cvtColor(`函数将图像转换为灰度图像。
然后,可以使用`cv2.threshold(`函数进行图像二值化处理,将图像转换为黑白图像。
第二步是寻找轮廓。
在进行轮廓检测之前,需要对图像进行一些预处理,如边缘检测。
在OpenCV中,可以使用`cv2.Canny(`函数进行边缘检测。
然后,可以使用`cv2.findContours(`函数找到图像中的轮廓。
第三步是轮廓处理。
在OpenCV中,可以使用`cv2.drawContours(`函数绘制轮廓,在图像上显示出来。
还可以使用`cv2.boundingRect(`函数获得轮廓的边界矩形,并使用`cv2.rectangle(`函数在图像上绘制该矩形。
此外,还可以通过计算轮廓的面积、周长或凸包等属性来对轮廓进行进一步处理。
第四步是轮廓特征提取。
在OpenCV中,可以使用`cv2.moments(`函数计算轮廓的一些几何特征,如质心、面积、周长和方向。
还可以使用`cv2.approxPolyDP(`函数对轮廓进行多边形拟合,从而获取更加精确的轮廓。
第五步是轮廓匹配。
在OpenCV中,可以使用`cv2.matchShapes(`函数计算两个轮廓之间的相似度。
这在图像识别、形状匹配等方面非常有用。
最后,可以使用`cv2.imshow(`函数将处理后的图片显示出来,并使用`cv2.waitKey(`等函数控制图像窗口的显示与关闭。
opencv二值化轮廓提取摘要:I.引言- 介绍OpenCV和图像处理基本概念- 说明本文将介绍的内容II.图像二值化- 定义二值化- 解释二值化的作用- 介绍OpenCV中的二值化方法III.轮廓提取- 定义轮廓提取- 解释轮廓提取的作用- 介绍OpenCV中的轮廓提取方法IV.示例代码- 给出使用OpenCV实现二值化和轮廓提取的示例代码- 详细解释代码的执行过程V.结论- 总结本文的内容- 指出OpenCV在图像处理中的应用正文:I.引言OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了大量的图像处理和计算机视觉算法。
在图像处理中,二值化和轮廓提取是最基础和最常用的操作之一。
二值化是将图像转换为只包含黑白两种颜色的过程,它可以简化图像的复杂度,便于后续的图像分析和处理。
轮廓提取是从二值图像中提取边缘信息的过程,它可以提供图像中物体的形状和边界信息。
本文将介绍OpenCV中的二值化和轮廓提取算法,并给出一个简单的示例代码。
II.图像二值化二值化是将图像中的像素值设定为0或255,即将图像转换为只包含黑白两种颜色的过程。
二值化图像只有两个灰度等级,因此,它具有较高的对比度,可以简化图像的复杂度,便于后续的图像分析和处理。
在OpenCV中,可以使用以下方法实现二值化:1.使用`cvThreshold()`函数实现二值化。
该函数需要指定输入图像、阈值、最大值和函数类型。
函数类型可以是`CV_THRESH_BINARY`(默认值,将大于阈值的像素值设为255,小于阈值的像素值设为0)或`CV_THRESH_BINARY_INV`(将大于阈值的像素值设为0,小于阈值的像素值设为255)。
2.使用`cvAdaptiveThreshold()`函数实现二值化。
该函数可以根据图像的局部特性自适应地设置阈值。
函数需要指定输入图像、阈值类型、最大值、阈值系数和函数类型。
计算机视觉中的轮廓线提取技术随着现代技术的迅速发展,计算机视觉技术也日渐成熟。
其中轮廓线提取技术是视觉算法中一个重要的环节,它能够从图像中提取出物体的轮廓线,为图像处理、目标检测、三维建模等应用提供基础支持。
本文将介绍计算机视觉中的轮廓线提取技术,包括方法原理、应用场景以及相关算法。
一、轮廓线提取技术原理轮廓线提取是数字图像处理中一个重要的过程,它主要通过对图像进行边缘检测和特征提取,来实现对物体轮廓线的提取。
轮廓线是物体和背景之间的边界线,它具有明显的区分度,适用于识别物体的形状、大小和位置等信息。
轮廓线提取技术的主要流程包括:1. 去噪:对原始图像进行降噪处理,使得图像更加干净,有利于后续的边缘检测和特征提取。
2. 边缘检测:经过降噪后,对图像进行边缘检测,以便提取出物体的轮廓线。
边缘检测算法主要有Sobel算子、Canny算子、Laplacian算子等。
3. 特征提取:提取边缘点,将其组成闭合的轮廓线。
常用的特征提取算法有霍夫变换、最大连通区域分析等。
二、轮廓线提取算法1. Sobel算子Sobel算子是一种边缘检测算法,在数字图像处理中广泛应用。
该算法通过对图像进行卷积操作,来提取出图像中的边缘点。
Sobel算子具有简单、易于实现的特点,但是提取出的边缘点可能不够准确,容易受到噪声的影响。
2. Canny算子Canny算子是一种比较常用的边缘检测算法,它对图像进行多次卷积操作,以提取出图像中的边缘点。
Canny算子具有高灵敏度和低误检率的特点,可以有效地提取出物体的轮廓线,受到很广泛的应用。
3. Laplacian算子Laplacian算子是一种利用二阶偏导数求解的边缘检测算法,它主要通过对图像进行拉普拉斯滤波,来提取出图像中的边缘点。
Laplacian算子具有灵敏度高、响应速度快的特点,但是容易受到噪声的干扰。
三、轮廓线提取技术的应用场景轮廓线提取技术可以应用于多个领域,如图像处理、目标检测、三维建模等。
opencv轮廓提取原理标题:OpenCV轮廓提取原理引言:OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能。
其中,轮廓提取是一项重要的技术,可以用于目标检测、图像分割等应用。
本文将介绍OpenCV中轮廓提取的原理及其应用。
一、什么是轮廓?轮廓是指图像中连续的边界线,可以用一系列的点来表示。
在图像处理中,轮廓是由边缘检测算法得到的。
边缘检测是一种识别图像中明暗变化的方法,常用的算法有Sobel、Canny等。
二、OpenCV中的轮廓提取方法OpenCV提供了多种轮廓提取的方法,其中最常用的是findContours 函数。
该函数可以根据二值化图像找到图像中的轮廓,并将其保存为一个轮廓向量。
三、轮廓提取的原理轮廓提取的基本原理是通过图像的边缘信息来确定物体的边界。
具体步骤如下:1. 图像预处理:首先,对原始图像进行预处理,包括灰度化、降噪、二值化等操作。
这一步的目的是将图像转换为二值图像,使得物体与背景能够更好地区分开来。
2. 边缘检测:利用边缘检测算法,如Sobel、Canny等,在二值化图像中找到物体的边缘。
边缘检测算法会计算图像中每个像素点的梯度值,梯度值较大的点被认为是边缘点。
3. 轮廓提取:根据边缘图像,使用findContours函数将边缘点连接起来,形成物体的轮廓。
findContours函数会返回一个轮廓向量,其中每个轮廓由一系列的点表示。
4. 轮廓处理:根据需要,可以对轮廓进行进一步的处理,如轮廓拟合、轮廓面积计算等。
这些处理可以用于物体检测、形状识别等应用。
四、轮廓提取的应用轮廓提取在计算机视觉和图像处理中有广泛的应用,包括但不限于以下几个方面:1. 目标检测:通过提取图像中物体的轮廓,可以实现目标检测。
例如,可以通过形状匹配的方法,在图像中找到与给定模板形状相似的物体。
2. 图像分割:轮廓提取可以用于图像分割,将图像中的不同物体分离开来。
例如,在医学图像中,可以通过轮廓提取将肿瘤与正常组织分割开来。
C语⾔实现opencv提取直线、轮廓及ROI实例详解⼀、Canny检测轮廓在上⼀篇⽂章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果⼀致,⽽soble边缘检测是基于单⼀阈值的,我们不能兼顾到低阈值的丰富边缘和⾼阈值时的边缘缺失这两个问题。
⽽canny算⼦则很好的弥补了这⼀不⾜,从⽬前看来,canny边缘检测在做图像轮廓提取⽅⾯是最优秀的边缘检测算法。
canny边缘检测采⽤双阈值值法,⾼阈值⽤来检测图像中重要的、显著的线条、轮廓等,⽽低阈值⽤来保证不丢失细节部分,低阈值检测出来的边缘更丰富,但是很多边缘并不是我们关⼼的。
最后采⽤⼀种查找算法,将低阈值中与⾼阈值的边缘有重叠的线条保留,其他的线条都删除。
本篇⽂章中不对canny的算法原理作进⼀步说明,稍后会在图像处理算法相关的⽂章中详细介绍。
下⾯我们⽤OpenCV中的Canny函数来检测图像边缘int main(){Mat I=imread("../cat.png");cvtColor(I,I,CV_BGR2GRAY);Mat contours;Canny(I,contours,125,350);threshold(contours,contours,128,255,THRESH_BINARY);namedWindow("Canny");imshow("Canny",contours);waitKey();return 0;}显⽰效果如下:⼆、直线检测⽤到的是霍夫变换检测直线的算法直线在图像中出现的频率⾮常之⾼,⽽直线作为图像的特征对于基本内容的图像分析有着很重要的作⽤,本⽂通过OpenCV中的hough变换来检测图像中的线条。
我们先看最基本的Hough变换函数HoughLines,它的原型如下:void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );它的输⼊是⼀个⼆值的轮廓图像,往往是边缘检测得到的结果图像;它的输出是⼀个包含多个Vec2f点的数组,数组中的每个元素是⼀个⼆元浮点数据对<rou,theta>,rou代表直线离坐标原点的距离,theta代表⾓度。
opencv轮廓提取原理OpenCV是一个用于图像处理和计算机视觉的开源库,拥有丰富的功能和算法。
其中之一就是轮廓提取,它可以帮助我们从图像中提取出物体的边界轮廓。
本文将介绍OpenCV轮廓提取的原理和实现方法。
在图像处理中,轮廓是物体边界的表示形式,它是由一系列连续的点构成的曲线。
轮廓提取的目的是找到图像中所有物体的轮廓,以便进行进一步的分析和处理。
OpenCV提供了一种基于边缘检测的方法来实现轮廓提取。
边缘检测是一种常用的图像处理技术,它可以帮助我们找到图像中明显的边缘。
OpenCV提供了一些边缘检测算法,如Canny边缘检测算法。
这些算法可以帮助我们找到图像中明显的边缘,并将其表示为二值图像,其中边缘像素的值为255,非边缘像素的值为0。
在进行轮廓提取之前,我们首先需要对图像进行预处理,以便提高后续边缘检测的效果。
预处理包括灰度化、滤波和二值化等步骤。
灰度化将彩色图像转换为灰度图像,滤波可以帮助我们去除图像中的噪声,而二值化则可以将灰度图像转换为二值图像。
一旦我们得到了二值图像,就可以使用OpenCV提供的findContours函数来进行轮廓提取。
该函数可以帮助我们找到二值图像中的所有轮廓,并将其表示为一系列的点集。
每个轮廓都是一个包含一系列点坐标的向量,我们可以通过遍历这些点来获取轮廓的每个像素位置。
在轮廓提取之后,我们可以对轮廓进行一些进一步的处理,如计算轮廓的面积、周长和中心点等。
OpenCV提供了一些函数来实现这些功能,如contourArea、arcLength和moments等。
除了基本的轮廓提取之外,OpenCV还提供了一些高级的轮廓处理算法,如轮廓逼近、轮廓拟合和轮廓匹配等。
这些算法可以帮助我们更精确地描述和分析物体的轮廓。
总结来说,OpenCV轮廓提取是一种基于边缘检测的方法,它可以帮助我们从图像中提取出物体的边界轮廓。
通过预处理和使用findContours函数,我们可以得到图像中所有物体的轮廓,并进行进一步的分析和处理。
图像识别中的轮廓提取算法探索随着人工智能技术的迅猛发展,图像识别越来越受到关注。
而在图像识别中,轮廓提取算法是一个至关重要的环节。
本文将就图像识别中的轮廓提取算法进行探索和分析。
一、图像轮廓提取算法的背景随着计算机硬件和软件的不断进步,图像处理技术取得了长足的发展。
而图像轮廓提取算法作为图像处理的重要一环,主要用于识别和描述图像中的边缘轮廓。
在目标检测、图像分割和模式识别等领域都有广泛的应用。
因此,对图像轮廓提取算法的研究具有重要的实际意义。
二、轮廓提取算法的传统方法1、Sobel算子Sobel算子是一种基于梯度的边缘检测算法,通过计算图像中每个像素点灰度值的梯度来提取轮廓。
Sobel算子计算简单快速,且对噪声具有一定的抑制能力。
然而,Sobel算子容易受到图像中边缘灰度变化较大的影响,导致提取结果不准确。
2、Canny算子Canny算子是一种基于高斯滤波和非最大值抑制的边缘检测算法。
它能够有效地抑制噪声,同时提取出细节较为清晰的轮廓。
Canny算子在图像轮廓提取中被广泛应用,但其参数的选择对提取效果有较大影响。
3、拉普拉斯算子拉普拉斯算子是一种基于二阶微分的边缘检测算法,通过求取图像中每个像素点的二阶微分来提取轮廓。
拉普拉斯算子对噪声敏感,容易出现边缘断裂的现象。
因此,在实际应用中,常常需要结合其他算法进行改进和优化。
三、新兴的轮廓提取算法1、基于深度学习的轮廓提取算法近年来,深度学习技术在图像处理领域取得了巨大的突破。
基于深度学习的轮廓提取算法通过训练神经网络模型,实现自动化的轮廓提取。
这种算法不仅能够提取出高质量的轮廓,还能够应对各种复杂的图像场景。
但基于深度学习的轮廓提取算法需要大量的训练数据和计算资源,且难以解释模型的预测结果。
2、基于边缘增长的轮廓提取算法边缘增长算法是一种基于种子点的图像分割算法,通过将具有相似特征的像素点合并为同一个区域,最终实现轮廓的提取。
边缘增长算法具有较好的鲁棒性和适应性,对噪声和细节变化具有一定的容忍度。
基于OpenCV的图像轮廓提取的实现【摘要】OpenCV是近几年来推出的一个开源的、免费的计算机视觉库.OpenCV的目标是构建一个简单易用的计算机视觉框架,利用它所包含的函数帮助开发人员方便快捷地实现图像处理和视频处理。
而图像的轮廓是图像的一种基本特征,携带着一幅图像大部分的信息,经常被应用到较高层次的图像应用中。
它在图像分离,图像识别和图像压缩等领域有很广泛的应用,也是图像处理的基础。
本文首先阐述了OpenCV的特点和结构,然后采用一系列的可行性算法来获取图像特征参数并通过各种算子(Sobel算子,Laplace算子,Canny算子)对图像的灰度进行分析,调节,用实现对图像的边缘检测和轮廓提取。
【关键词】OpenCV 图像轮廓提取The realization of the image contour extraction based on OpenCV【Abstract】OpenCV is launched an open source in recent years.Free computer vision library. OpenCV's goal is to build a simple and easy to use computer vision framework, function to help developers use it contains quick and easy to realize image processing and video processing.And the outline of the image is a basic feature of image, carrying an image, most of the information is often applied to the higher level of the image application.It in image separation, image recognition and image compression, and other fields have a wide range of applications, is also the basis of image processing.At first, this paper expounds the characteristics and structure of OpenCV, then a series of the feasibility of the algorithm is used to obtain image feature parameters and through a variety of operator (Sobel operator, Laplace operator, Canny operator) analysis of image gray level, adjustment, use of image edge detection and contour extraction.【Key words】OpenCV Image Contour extraction目录1引言 (1)1.1 课题背景 (1)1.2 研究的目的及意义 (1)1.3 可行性分析 (2)2 开发工具及轮廓提取概述 (3)2.1 OpenCV (3)2.1.1 OpenCV简介 (3)2.1.2 OpenCV安装及环境搭建 (3)2.2 边缘检测........................................................................................ 错误!未定义书签。
opencv查找轮廓算法原理
OpenCV中的轮廓查找算法原理主要基于图像处理和计算机视觉技术。
以
下是该算法的基本步骤和原理:
1. 边缘检测:这是轮廓查找的第一步,通过使用如Canny边缘检测器等算法,找出图像中像素强度发生显著变化的区域,这些区域通常对应于物体的边缘。
2. 二值化:对于边缘检测后的图像,通常会进行二值化处理,即将像素点分为前景(物体)和背景两类。
这一步通常通过设定阈值实现,大于阈值的像素被视为前景,小于阈值的像素被视为背景。
3. 轮廓提取:在二值化后的图像中,通过寻找连续的像素点(即轮廓),可以识别出物体的轮廓。
这一步通常使用如findContours函数等算法实现。
4. 轮廓处理:在提取出轮廓后,可能还需要进行一些处理,如轮廓平滑、轮廓细化等,以优化轮廓的表示。
5. 轮廓分析:最后,通过对提取出的轮廓进行分析,可以得出有关物体形状、大小、位置等的信息。
这个过程通常用于图像识别、机器视觉、目标检测等领域。
通过OpenCV
等计算机视觉库,可以方便地实现这些算法,并利用它们从图像中提取有用的信息。
OpenCV成长之路(8):直线、轮廓的提取与描述分类:OpenCV成长之路2014-01-04 18:35 689人阅读评论(0) 收藏举报直线、轮廓的提取与描述基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条、轮廓、块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用。
一、Canny检测轮廓在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题。
而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在做图像轮廓提取方面是最优秀的边缘检测算法。
canny边缘检测采用双阈值值法,高阈值用来检测图像中重要的、显著的线条、轮廓等,而低阈值用来保证不丢失细节部分,低阈值检测出来的边缘更丰富,但是很多边缘并不是我们关心的。
最后采用一种查找算法,将低阈值中与高阈值的边缘有重叠的线条保留,其他的线条都删除。
本篇文章中不对canny的算法原理作进一步说明,稍后会在图像处理算法相关的文章中详细介绍。
下面我们用OpenCV中的Canny函数来检测图像边缘1.int main()2.{3. Mat I=imread("../cat.png");4. cvtColor(I,I,CV_BGR2GRAY);5.6. Mat contours;7. Canny(I,contours,125,350);8. threshold(contours,contours,128,255,THRESH_BINARY);9.10. namedWindow("Canny");11. imshow("Canny",contours);12. waitKey();13.return 0;14.}显示效果如下:二、直线检测直线在图像中出现的频率非常之高,而直线作为图像的特征对于基本内容的图像分析有着很重要的作用,本文通过OpenCV中的hough变换来检测图像中的线条。
我们先看最基本的Hough变换函数HoughLines,它的原型如下:1.void HoughLines(InputArray image, OutputArray lines, double rho,2.double theta, int threshold, double srn=0, double stn=0 );它的输出是一个二值的轮廓图像,往往是边缘检测得到的结果图像;它的输出是一个包含多个Vec2f点的数组,数组中的每个元素是一个二元浮点数据对<rou,theta>,rou 代表直线离坐标原点的距离,theta代表角度。
第3和第4个参数代表步长,因为Hough变换实际上是一个穷举的算法,rho表示距离的步长,theta代表角度的步长。
第5个参数是一个阈值设置直接的最低投票个数,知道Hough原理的,这个参数应该很容易理解。
从这个函数的输出结果我们可以看出,得到的直线并没有指定在图像中的开始点与结束点,需要我们自己去计算,如果我们想把直接显示在图像中就会比较麻烦,而且会有很多角度接近的直线,其实它们是重复的,为了解决上面这些问题,OpenCV又提供了一个函数HoughLinesP()。
它的输出是一个Vector of Vec4i。
Vector每一个元素代表一条直线,是由一个4元浮点数组构成,前两个点一组,后两个点一组,代表了在图像中直线的起始和结束点。
1.void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta,2.int threshold, double minLineLength=0, double maxLineGap=0 );解释一下最后两个参数,minLineLength指定了检测直线中的最小宽度,如果低于最小宽度则舍弃掉,maxLineGap指定通过同一点的直线,如果距离小于maxLineGap就会进行合并。
下面是一个用HoughLinesP检测直线的例子:1.int main()2.{3. Mat image=imread("../car.png");4. Mat I;5. cvtColor(image,I,CV_BGR2GRAY);6.7. Mat contours;8. Canny(I,contours,125,350);9. threshold(contours,contours,128,255,THRESH_BINARY);10.11. vector<Vec4i> lines;12.// 检测直线,最小投票为90,线条不短于50,间隙不小于1013. HoughLinesP(contours,lines,1,CV_PI/180,80,50,10);14. drawDetectLines(image,lines,Scalar(0,255,0));15.16. namedWindow("Lines");17. imshow("Lines",image);18. waitKey();19.return 0;20.}上面程序将检测到的线条保存在lines变量内,我们需要进一步将它们画在图像上:1.void drawDetectLines(Mat& image,const vector<Vec4i>& lines,Scalar & color)2.{3.// 将检测到的直线在图上画出来4. vector<Vec4i>::const_iterator it=lines.begin();5.while(it!=lines.end())6. {7. Point pt1((*it)[0],(*it)[1]);8. Point pt2((*it)[2],(*it)[3]);9. line(image,pt1,pt2,color,2); // 线条宽度设置为210. ++it;11. }12.}实际上Hough变换可以检测很多固定的形状,比如:圆、正方形等。
它们的原理基本相同,都是构造一个投票矩阵。
OpenCV里提供了检测圆的函数HoughCircles,它的输出是一个Vector of Vec3i,Vector的每个元素包含了3个浮点数,前2个是圆的中心坐标,最后一个是半径。
三、轮廓的提取与描述在目标识别中我们首先要把感兴趣的目标提取出来,而一般常见的步骤都是通过颜色或纹理提取出目标的前景图(一幅黑白图像,目标以白色显示在图像中),接下来我们要对前景图进行分析进一步地把目标提取出来,而这里常常用到的就是提取目标的轮廓。
OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合:vector<vector<Point>>。
外层vector的size代表了图像中轮廓的个数,里面vector的size代表了轮廓上点的个数。
下面我们通过实例来看函数的用法。
1.int main()2.{ing namespace cv;4.5. Mat image=imread("../shape.png");6. cvtColor(image,image,CV_BGR2GRAY);7. vector<vector<Point>> contours;8.// find9. findContours(image,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);10.// draw11. Mat result(image.size(),CV_8U,Scalar(0));12. drawContours(result,contours,-1,Scalar(255),2);13.14. namedWindow("contours");15. imshow("contours",result);16. waitKey();17.return 0;18.}上面程序中包含了2个函数,第一个是查找轮廓函数,它的第三个参数说明查找轮廓的类型,这里我们使用的是外轮廓,还可以查找所有轮廓,即包括一些孔洞的部分,像图像人物胳膊与腰间形成的轮廓。
第4个参数说明了轮廓表示的方法,程序中的参数说明轮廓包括了所有点,也可以用其他参数让有点直线的地方,只保存直线起始与终点的位置点,具体参数用法可以参考手册里函数的介绍。
第二个函数drawContours是一个画轮廓的函数,它的第3个参数程序里设置-1表示所有的轮廓都画,你也可以指定要画的轮廓的序号。
提取到轮廓后,其实我们更关心的是如果把这些轮廓转换为可以利用的特征,也就是涉及到轮廓的描述问题,这时就有多种方法可以选择,比如矢量化为多边形、矩形、椭圆等。
OpenCV里提供了一些这样的函数。
1.// 轮廓表示为一个矩形2. Rect r=boundingRect(Mat(contours[0]));3. rectangle(result,r,Scalar(255),2);4.5.// 轮廓表示为一个圆6.float radius;7. Point2f center;8. minEnclosingCircle(Mat(contours[1]),center,radius);9. circle(result,Point(center),static_cast<int>(radius),Scalar(255),2);10.11.// 轮廓表示为一个多边形12. vector<Point> poly;13. approxPolyDP(Mat(contours[2]),poly,5,true);14. vector<Point>::const_iterator itp=poly.begin();15.while(itp!=(poly.end()-1))16. {17. line(result,*itp,*(itp+1),Scalar(255),2);18. ++itp;19. }20. line(result,*itp,*(poly.begin()),Scalar(255),2);21.// 轮廓表示为凸多边形22. vector<Point> hull;23. convexHull(Mat(contours[3]),hull);24. vector<Point>::const_iterator ith=hull.begin();25.while(ith!=(hull.end()-1))26. {27. line(result,*ith,*(ith+1),Scalar(255),2);28. ++ith;29. }30. line(result,*ith,*(hull.begin()),Scalar(255),2);程序中我们依次画了矩形、圆、多边形和凸多边形。