主要参考了毛星云等著《OpenCV3编程入门》学习了在OpenCV中绘制一些几何图形,包括线段、圆形、矩形、椭圆形、多边形等。由于代码比较简单,直接上代码了,相信大家应该可以看懂。
#include
using namespace cv;
#define WINDOW_WIDTH 400
void DrawEllipse(Mat img, double angle); //画椭圆形
void DrawCircle(Mat img, Point center); //画圆形
void DrawPolygon(Mat img); //画凹多边形
void DrawLine(Mat img, Point start, Point end); //画线段
int main()
{
Mat srcimg = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
Mat dstimg = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
//画椭圆形
DrawEllipse(srcimg, 90);
//画圆形
Point center(srcimg.cols / 2, srcimg.rows / 2);
DrawCircle(srcimg, center);
//画凹多边形
DrawPolygon(dstimg);
//画线段
Point start(30, 30), end(200, 200);
DrawLine(srcimg, start, end);
//画矩形
rectangle(srcimg,
Point(0, 100),
Point(50, 200),
Scalar(0, 255, 255),
-1,
8);
imshow("srcimg", srcimg);
imshow("dstimg", dstimg);
waitKey(0);
return 0;
}
//画椭圆形
void DrawEllipse(Mat img, double angle)
{
int thickness = -2; //当thickness<0时,为实心,大于0时为空心。
int lineType = 8;
ellipse(img,
Point(img.rows / 2, img.cols / 2),
Size(img.rows / 4, img.cols / 16),
angle,
0,
360,
Scalar(255, 129, 0),
thickness,
lineType
);
}
//画圆形
void DrawCircle(Mat img, Point center)
{
int thickness = 50;
int lineType = 8;
circle(img,
center,
img.rows / 32,
Scalar(0, 0, 255),
thickness,
lineType
);
}
//画凹多边形
void DrawPolygon(Mat img)
{
int lineType = 8;
Point rookPoints[1][20];
rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][11] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][12] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][13] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
rookPoints[0][14] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
rookPoints[0][17] = Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
rookPoints[0][18] = Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
const Point* ppt[1] = { rookPoints[0] };
int npt[] = { 20 };
fillPoly(img,
ppt,
npt,
1,
Scalar(255, 255, 255),
lineType );
}
//画线段
void DrawLine(Mat img, Point start, Point end)
{
int thickness = 2;
int lineType = 8;
line(img,
start,
end,
Scalar(255, 255, 255),
thickness,
lineType);
}
最终结果如下: