API:
polylines(预定义的背景画布, 点数组, true, 颜色, 线宽, 线形, shift参数);
fillPoly(定义的背景画布, 点数组, 颜色, 线形, shift参数);
1、简单绘制一个多边形:
void QuickDemo::polyline_demo()
{
//创建画布
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);
//生成点数组向量,并初始化容量,使用索引赋值,如果不初始化容量,只能通过push_back()来填充元素。
vector<Point> pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
//绘制多边形polylines()
polylines(canvas, pts, true, Scalar(255, 0, 0), 3, 8, 0);
imshow("多边形绘制", canvas);
}
结果:
2、填充多边形
如果直接如Rect等API直接将线宽参数赋值-1,在执行程序会报错,此处有专门的填充函数来实现:
fillPoly(定义的背景画布, 点数组, 颜色, 线形, shift参数);
void QuickDemo::polyline_demo()
{
//创建画布
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);
//生成点数组向量,并初始化容量,使用索引赋值,如果不初始化容量,只能通过push_back()来填充元素。
vector<Point> pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
//绘制多边形polylines()
polylines(canvas, pts, true, Scalar(255, 0, 0), 3, 8, 0);
fillPoly(canvas, pts, Scalar(0, 255, 0), 8, 0);
imshow("多边形绘制", canvas);
}
结果:
3、使用一个函数来选择实现绘制轮廓或填充
第二步中的实现方法过于麻烦,可以使用如下函数实现:
drawContours(画布, 包含多个点数组的数组, 点数组索引, 颜色, 线宽);
注:点数组索引 = -1时,会绘制所有轮廓, 线宽为 -1 时, 实现填充。
代码:
void QuickDemo::polyline_demo()
{
//创建画布
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);
//生成点数组向量,并初始化容量,使用索引赋值,如果不初始化容量,只能通过push_back()来填充元素。
vector<Point> pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
绘制多边形polylines()
//polylines(canvas, pts, true, Scalar(255, 0, 0), 3, 8, 0);
//fillPoly(canvas, pts, Scalar(0, 255, 0), 8, 0);
//创建包含多个点数组的数组
vector<vector<Point>> contours;
contours.push_back(pts);
drawContours(canvas, contours, -1, Scalar(255, 0, 0), -1);
imshow("多边形绘制", canvas);
}
结果: