您的位置:

使用OpenCV polylines画出多边形轮廓

一、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参数需要传入指向要绘制的轮廓点集的指针或引用。对于只想绘制其中一个轮廓的情况,可以使用如下代码:

vector contour = contours[0]; //指向第1个轮廓点集
polylines(image, &contour, true, Scalar(0,255,0), 1);

  

注意,将vector 传给InputArrayOfArrays类型的参数时,需要使用&符号取地址。这是因为进一步封装时,vector是一个Object_类型,其数组的指针存储在Object_类的指针中。

其次,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函数可以绘制多个不相连的线段。示例代码如下:

vector pts1(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中的多边形轮廓的相关知识。