在使用 C++ 进行图形处理时,OpenCV(Open Source Computer Vision Library)是一个功能强大、用途广泛的开源计算机视觉与图像处理库。OpenCV 提供了丰富的图像绘制与操作函数,能够高效实现图像中的基本图形绘制任务,包括线段、圆形、多边形等的绘制与填充,非常适合进行多边形绘制与填充的实践和开发。
在 C++ 中引入 OpenCV 并实现多边形的绘制与填充,OpenCV 中的函数如 cv::polylines
用于绘制多边形轮廓,cv::fillPoly
用于填充多边形区域,这些函数简洁高效,能帮助开发者快速实现图形绘制功能。
以下是polylines函数及其参数的介绍:
void cv::polylines(
cv::InputOutputArray image,
const std::vector<std::vector<cv::Point>>& pts,
bool isClosed,
const cv::Scalar& color,
int thickness = 1,
int lineType = cv::LINE_8,
int shift = 0
);
参数 | 类型 | 说明 |
---|---|---|
image |
InputOutputArray |
要绘制的目标图像。 |
pts |
std::vector<std::vector<cv::Point>> |
每一组点表示一条折线(或一个多边形)。外层是多组线,内层是每组线的点序列。 |
isClosed |
bool |
是否将折线首尾连接闭合,若为 true ,则形成多边形边界。 |
color |
cv::Scalar |
绘制的颜色(例如红色为 cv::Scalar(0,0,255) )。 |
thickness |
int |
线条的粗细(默认值为 1)。 |
lineType |
int |
线型:LINE_8 (8连通,默认),LINE_4 ,或 LINE_AA (抗锯齿)。 |
shift |
int |
点坐标的小数位数精度,通常为 0(表示整数像素点)。 |
pts需要一个点集;
以下是fillPoly函数及其参数的介绍:
void cv::fillPoly(
cv::InputOutputArray image,
const std::vector<std::vector<cv::Point>>& pts,
const cv::Scalar& color,
int lineType = cv::LINE_8,
int shift = 0,
cv::Point offset = cv::Point()
);
参数 | 类型 | 说明 |
---|---|---|
image |
InputOutputArray |
要绘制的图像(8位或浮点图像,单通道或三通道)。 |
pts |
std::vector<std::vector<cv::Point>> |
每个内部 vector<cv::Point> 是一个多边形顶点序列;可以填充多个多边形。 |
color |
cv::Scalar |
填充颜色,如红色为 cv::Scalar(0, 0, 255) 。 |
lineType |
int |
边界线的类型,常用 LINE_8 ,LINE_4 或抗锯齿 LINE_AA 。 |
shift |
int |
点坐标的小数精度位数,0 表示整数像素坐标。 |
offset |
cv::Point |
所有点偏移的量,默认无偏移。 |
深度了解这两个函数后,就可以进行实际操作了:
void Demo::polygon_drawing_Demo()
{
Mat background = Mat::zeros(Size(512,512),CV_8UC3);
background = Scalar(200,100,70);
Point p1(150,100);
Point p2(350,100);
Point p3(450,250);
Point p4(350,400);
Point p5(150,400);
Point p6(50,250);
vector<Point> pts;
pts.push_back(p1);
pts.push_back(p2);
pts.push_back(p3);
pts.push_back(p4);
pts.push_back(p5);
pts.push_back(p6);
polylines(background,pts,true,Scalar(255,200,5),2,LINE_8);
fillPoly(background,pts,Scalar(100,200,25));
imshow("shape",background);
}