OpenCV学习笔记(六):绘制几何图形
2016-07-21 15:56
441 查看
主要参考了毛星云等著《OpenCV3编程入门》学习了在OpenCV中绘制一些几何图形,包括线段、圆形、矩形、椭圆形、多边形等。由于代码比较简单,直接上代码了,相信大家应该可以看懂。
最终结果如下:
#include<opencv2/opencv.hpp> 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); }
最终结果如下: