在图像处理中,绘制多边形是常见的操作之一。多边形不仅是基础图形,而且在计算机视觉中经常用于表示轮廓、区域和目标检测等任务。在 OpenCV 中,我们可以使用多种方法来绘制和填充多边形,如 、
polylines 和
fillPoly。
drawContours

1. OpenCV 中的多边形绘制方法
OpenCV 提供了多个函数来绘制多边形,常见的有:
:绘制多边形的边界(折线)。
polylines()
:绘制并填充一个多边形。
fillPoly()
:绘制轮廓线,也可以用来填充多边形。
drawContours()
2. 多边形绘制步骤
为了帮助大家更好地理解多边形的绘制,我们将通过一个简单的示例来演示如何创建一个多边形并进行绘制。我们将绘制一个五边形并将其填充为不同的颜色。
示例代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void polyline_drawing_demo() {
// 创建一个 512x512 的黑色图像
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
// 定义五个点,构成一个五边形
Point p1(100, 100);
Point p2(350, 100);
Point p3(450, 280);
Point p4(320, 450);
Point p5(80, 400);
// 将点加入到点集 vector 中
std::vector<Point>pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
// 将点集存入 contours(外部轮廓集合),以便调用 drawContours()
std::vector<std::vector<Point>>contours;
contours.push_back(pts);
// 使用 drawContours 绘制多边形并填充(-1 表示填充所有轮廓)
drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1); // 蓝色填充
// 显示结果
imshow("多边形绘制", canvas);
waitKey(0); // 等待用户按键后退出
destroyAllWindows(); // 关闭窗口
}
int main() {
polyline_drawing_demo();
return 0;
}
3. 代码详解
创建图像
Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
使用 创建一个大小为 512×512 的黑色图像。
Mat::zeros() 表示图像具有 3 个通道(BGR 色彩空间),每个通道的像素值为 8 位无符号整数。
CV_8UC3
定义五个点并创建多边形
Point p1(100, 100);
Point p2(350, 100);
Point p3(450, 280);
Point p4(320, 450);
Point p5(80, 400);
我们定义了五个点,分别是 ,
(100, 100),
(350, 100),
(450, 280) 和
(320, 450),这些点将构成一个五边形。
(80, 400)
将这些点放入
vector 中
vector
std::vector<Point> pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
我们使用 来存储这些点,OpenCV 提供了
std::vector<Point> 类型来处理点的集合。
std::vector
绘制多边形
std::vector<std::vector<Point>> contours;
contours.push_back(pts);
drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1);
用来绘制并填充轮廓。它接受以下参数:
drawContours()
:目标图像。
canvas
:一个包含多边形轮廓的向量。
contours
:表示绘制所有轮廓(即所有多边形)。
-1
:设置颜色为蓝色(BGR 格式)。
Scalar(255, 0, 0)
:表示填充该轮廓。
-1
显示图像
imshow("多边形绘制", canvas);
用来显示图像。
imshow()
4. 其他多边形绘制方法
4.1
polylines() 绘制折线(不填充)
polylines()
polylines(canvas, pts, true, Scalar(0, 0, 255), 8, 8, 0);
用来绘制多边形的边界,它的参数如下:
polylines()
:目标图像。
canvas
:点集,表示多边形的顶点。
pts
:表示闭合图形,即连接最后一个点与第一个点。
true
:边框颜色,红色(BGR 格式)。
Scalar(0, 0, 255)
:线宽。
8
:线型(这里是默认值)。
8
:连接点类型(一般使用默认值即可)。
0
4.2
fillPoly() 填充多边形
fillPoly()
fillPoly(canvas, pts, Scalar(255, 255, 0), LINE_AA, 0);
用来绘制并填充多边形,填充颜色由
fillPoly() 指定(黄色)。
Scalar(255, 255, 0) 是抗锯齿线条,确保填充效果平滑。
LINE_AA
5. 总结
:绘制多边形的边界,不填充图形。
polylines()
:绘制并填充多边形,适合用来创建实心多边形。
fillPoly()
:可以用来绘制和填充多个轮廓,适合处理复杂的多边形和区域。
drawContours()


