使用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类型。
  • 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<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中的多边形轮廓的相关知识。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/291967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-25 14:07
下一篇 2024-12-25 14:07

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Python 初学者:如何使用Python画出可爱的小动物

    Python是一种功能强大的编程语言,可以帮助您开发各种有趣的应用程序,包括图像处理、游戏设计、机器学习等。在这篇文章中,我们将向初学者介绍如何使用Python画出可爱的小动物。我…

    编程 2025-04-29
  • 如何用简笔画画出小猪佩奇全家福

    要想画出小猪佩奇全家福,我们可以按照以下步骤进行。 一、画出小猪佩奇 首先,我们需要画出小猪佩奇的脸。可以用一个圆形来表示小猪佩奇的头部,然后再在头部上画上两个小耳朵,耳朵的形状和…

    编程 2025-04-28
  • Opencv 实现读取 BMP 图片

    Opencv 是一个基于 C/C++ 语言的开源计算机视觉库,可以用于图像处理、特征识别、目标跟踪、机器学习等领域。在图像处理中,读取 BMP 图片是常见操作之一。 一、打开 BM…

    编程 2025-04-27
  • opencv鼠标绘图

    本文将为您详细介绍如何使用opencv在原始图片上进行鼠标绘图。 一、准备工作 在开始绘制之前,您需要先准备好以下的工作: 1、安装opencv库,可以通过pip install …

    编程 2025-04-27
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • OpenCV的全面介绍

    OpenCV是一款强大的开源计算机视觉库,它包含了各种用于图像和视频处理,图像识别和机器学习的函数,它可以用于开发实时的计算机视觉软件和系统,特别适用于图像处理、物体识别、人脸识别…

    编程 2025-04-25
  • Opencv CUDA编译用法介绍

    本文将从多个方面对Opencv CUDA编译进行详细的阐述和解读。通过以下小标题,我们将详细介绍如何进行编译。 一、环境搭建 在使用CUDA进行加速之前,需要进行CUDA的环境搭建…

    编程 2025-04-25
  • 详解OpenCV高斯滤波

    一、高斯滤波的介绍 OpenCV高斯滤波是一种平滑图像的处理方法,通常用于去除噪声、模糊化图像等。它的原理是利用高斯函数进行加权平均,从而减少噪声的干扰。 在图像处理中,噪声是一种…

    编程 2025-04-25

发表回复

登录后才能评论