一、OpenCV中的多边形轮廓
在OpenCV中,多边形轮廓是指由一组点连接而成的多边形边缘线。这些点是通过轮廓检测算法找出来的,比如findContours等。轮廓是在二值图像中检测出来的,因此在使用轮廓之前,需要先得到二值图像。在得到了轮廓点集之后,可以使用polylines函数将轮廓画出来。
二、使用polylines画出多边形轮廓
在OpenCV中,polylines函数用于绘制由一组点连接而成的多边形。它的函数原型为:
void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness=1, int lineType=LINE_8, int shift=0);
该函数接受3个必选参数:
- img: 用于绘制的图像
- pts: 多边形轮廓点的容器,其中每个元素都是表示多边形某一部分的点集,通常是一个vector< Point >类型。
- isClosed: 多边形是否闭合(布尔类型)
接下来是一些可选参数:
- color: 多边形轮廓的颜色
- thickness: 多边形轮廓线宽
- lineType: 多边形轮廓线型
- shift: 定点坐标小数位数
示例代码如下:
//读入图像和处理后的二值图像 Mat image = imread("example.jpg"); Mat gray, binary; cvtColor(image, gray, COLOR_BGR2GRAY); //灰度化 threshold(gray, binary, 0, 255, THRESH_BINARY); //二值化 //寻找轮廓并绘制 vector< vector> contour; //定义轮廓点集 findContours(binary, contour, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); //寻找轮廓 Mat result; cvtColor(binary, result, COLOR_GRAY2BGR); //转换为3通道图像 polylines(result, contour, true, Scalar(0,255,0), 1); //绘制多边形轮廓 imshow("polylines", result); //显示图像 waitKey(0);
三、关于函数参数的详解
在上面的代码中,我们使用了findContours函数找到了多个轮廓点集,然后使用polylines函数一次性将所有轮廓绘制出来。但是在实际应用中,也会有只想绘制其中的一个轮廓的情况。这时候需要对函数参数进行一定的修改。
首先,pts参数需要传入指向要绘制的轮廓点集的指针或引用。对于只想绘制其中一个轮廓的情况,可以使用如下代码:
vectorcontour = contours[0]; //指向第1个轮廓点集 polylines(image, &contour, true, Scalar(0,255,0), 1);
注意,将vector
其次,color参数需要传入Scalar类型的值,表示轮廓的颜色。Scalar有4个构造函数,分别是无参、单参、双参和四参,具体如下:
Scalar s1; //Scalar(0, 0, 0, 0) Scalar s2(val); //Scalar(val, val, val, val) Scalar s3(val1, val2);//Scalar(val1, val2, 0, 0) Scalar s4(val1, val2, val3, val4);//Scalar(val1, val2, val3, val4)
如有需要,可以根据实际情况传不同的参数。
四、更多常见用法
在OpenCV中,polylines函数使用非常广泛,下面是一些常见的用法:
1. 绘制多线段轮廓
当设置isClosed=false时,polylines函数可以绘制多个不相连的线段。示例代码如下:
vectorpts1(3); pts1[0] = Point(100,100); pts1[1] = Point(200,200); pts1[2] = Point(300,100); vector pts2(3); pts2[0] = Point(100,200); pts2[1] = Point(200,300); pts2[2] = Point(300,200); vector > pts(2); pts[0] = pts1; pts[1] = pts2; polylines(result, pts, false, Scalar(0,0,255), 2);
执行该代码后,会在图像中绘制出由多个线段组成的图形。如下图所示:
2. 连接末尾和起始点的轮廓
当设置isClosed=true时,polylines函数可以绘制一个封闭的多边形轮廓。示例代码如下:
Point pts1[3]; pts1[0] = Point(100,100); pts1[1] = Point(200,200); pts1[2] = Point(300,100); Point pts2[3]; pts2[0] = Point(100,200); pts2[1] = Point(200,300); pts2[2] = Point(300,200); Point* pts[] = {pts1, pts2}; const int npts[] = {3, 3}; polylines(result, pts, npts, 2, true, Scalar(0,0,255), 2);
执行该代码后,会在图像中绘制出由两个多边形(三角形)组成的图形。如下图所示:
五、总结
本文主要讲述了如何使用OpenCV polylines函数绘制多边形轮廓。我们介绍了polylines的函数原型,以及传入参数的具体含义。除此之外,我们还针对常见用法进行了讲解,如绘制多线段轮廓、连接末尾和起始点的轮廓等。通过本文的学习,读者可以更加深入地了解OpenCV中的多边形轮廓的相关知识。