绘制椭圆、圆、多边形、直线
1 class BasicDraw {
2 public:
3 // cv::Mat 作为函数参数传递 类似于传递引用
4 static void myEllipse(cv::Mat img, double angle) { // 画椭圆
5 int thickness = 2; // 厚度
6 int lineType = 8; // 线型
7
8 // 绘制椭圆 参数分别为(输出图像,椭圆中心点,椭圆轴大小,在空间中的偏转角度,起始角度,终止角度,颜色,线宽,线型 )
9 cv::ellipse(img, cv::Point(w / 2, w / 2), cv::Size(w / 4, w / 16), angle, 0, 360, cv::Scalar(255, 0, 0), thickness, lineType);
10 }
11
12 static void myFilledCircle(cv::Mat img, cv::Point center) {
13 // 绘制圆形 参数分别为 (输出图像,圆心点,半径,颜色,是否填充,线型)
14 cv::circle(img, center, w / 32, cv::Scalar(0, 0, 255), cv::FILLED, cv::LINE_8);
15 }
16
17 static void myPolygon(cv::Mat img) { // 画多边形
18 int lineType = cv::LINE_8;
19 cv::Point rookPoints[1][20];
20 rookPoints[0][0] = cv::Point(w / 4, 7 * w / 8);
21 rookPoints[0][1] = cv::Point(3 * w / 4, 7 * w / 8);
22 rookPoints[0][2] = cv::Point(3 * w / 4, 13 * w / 16);
23 rookPoints[0][3] = cv::Point(11 * w / 16, 13 * w / 16);
24 rookPoints[0][4] = cv::Point(19 * w / 32, 3 * w / 8);
25 rookPoints[0][5] = cv::Point(3 * w / 4, 3 * w / 8);
26 rookPoints[0][6] = cv::Point(3 * w / 4, w / 8);
27 rookPoints[0][7] = cv::Point(26 * w / 40, w / 8);
28 rookPoints[0][8] = cv::Point(26 * w / 40, w / 4);
29 rookPoints[0][9] = cv::Point(22 * w / 40, w / 8);
30 rookPoints[0][10] = cv::Point(22 * w / 40, w / 8);
31 rookPoints[0][11] = cv::Point(18 * w / 40, w / 8);
32 rookPoints[0][12] = cv::Point(18 * w / 40, w / 4);
33 rookPoints[0][13] = cv::Point(14 * w / 40, w / 4);
34 rookPoints[0][14] = cv::Point(14 * w / 40, w / 8);
35 rookPoints[0][15] = cv::Point(w / 4, w / 8);
36 rookPoints[0][16] = cv::Point(w / 4, 3 * w / 8);
37 rookPoints[0][17] = cv::Point(13 * w / 32, 3 * w / 8);
38 rookPoints[0][18] = cv::Point(5 * w / 16, 13 * w / 16);
39 rookPoints[0][19] = cv::Point(w / 4, 13 * w / 16);
40
41 const cv::Point* ppt[1] = { rookPoints[0] };
42 int npt[] = { 20 };
43
44 // 绘制多边形 参数(输出图像,多边形顶点0集合,绘制的多边形顶点数目,要绘制的多边形数量,颜色,线型)
45 cv::fillPoly(img, ppt, npt, 1, cv::Scalar(255, 255, 255), lineType);
46 }
47
48 static void myLine(cv::Mat img, cv::Point start, cv::Point end) {
49 int thickness = 2;
50 int lineType = cv::LINE_8;
51
52 // 画直线 参数:(输出图像,起始点,终点,颜色,线宽,线型)
53 cv::line(img, start, end, cv::Scalar(0, 0, 0), thickness, lineType);
54 }
55
56 static const int w = 400;
57 };
58
59
60
61 int basicDrawExample(void) {
62 // OpenCV基本绘图
63 /*
64 cv::Point 定义2D点
65 cv::Scalar() 定义颜色
66 */
67 BasicDraw draw;
68
69 cv::Mat atomImage = cv::Mat::zeros(draw.w, draw.w, CV_8UC3);
70 cv::Mat rookImage = cv::Mat::zeros(draw.w, draw.w, CV_8UC3);
71
72 // 画椭圆
73 draw.myEllipse(atomImage, 90);
74 draw.myEllipse(atomImage, 0);
75 draw.myEllipse(atomImage, 45);
76 draw.myEllipse(atomImage, -45);
77
78 // 画圆
79 draw.myFilledCircle(atomImage, cv::Point(draw.w / 2, draw.w / 2));
80
81 // 画多边形
82 draw.myPolygon(rookImage);
83
84 // 画矩形
85 cv::rectangle(rookImage, cv::Point(0, 7 * draw.w / 8), cv::Point(draw.w, draw.w), cv::Scalar(0, 255, 255), cv::FILLED, cv::LINE_8);
86
87 draw.myLine(rookImage, cv::Point(0, 15 * draw.w / 16), cv::Point(draw.w, 15 * draw.w / 16));
88 draw.myLine(rookImage, cv::Point(draw.w / 4, 7 * draw.w / 8), cv::Point(draw.w / 4, draw.w));
89 draw.myLine(rookImage, cv::Point(draw.w / 2, 7 * draw.w / 8), cv::Point(draw.w / 2, draw.w));
90 draw.myLine(rookImage, cv::Point(3 * draw.w / 4, 7 * draw.w / 8), cv::Point(3 * draw.w / 4, draw.w));
91
92 cv::imshow("atom", atomImage);
93 // cv::moveWindow() 改变窗口的位置和尺寸
94 //cv::moveWindow("atom", 0, 200);
95
96 cv::imshow("rook", rookImage);
97
98 //cv::imwrite("atomImage.jpg", atomImage);
99 //cv::imwrite("rookImage.jpg", rookImage);
100
101 cv::waitKey(0);
102 return 0;
103 }
随机生成器和OpenCV文本
1 int drawRandomLinesExample(void) {
2 // 随机生成器和OpenCV文本
3 cv::RNG rng(0xFFFFFFFF); // 创建一个随机数生成器RNG
4
5 cv::Mat image = cv::Mat::zeros(400, 800, CV_8UC3); // 创建一个(y, x)->(400, 800)的图像
6
7 int lineType = 8;
8 cv::Point pt1, pt2;
9 const int NUMBER = 100;
10
11 // 随机画一些直线
12 for (int i = 0; i < NUMBER; i++) {
13 pt1.x = rng.uniform(0, 800); // 生成一个[0, 800)之间的一个随机值
14 pt1.y = rng.uniform(0, 400);
15 pt2.x = rng.uniform(0, 800);
16 pt2.y = rng.uniform(0, 400);
17
18 int icolor = (unsigned)rng; // 随机颜色 随机线宽
19 cv::line(image, pt1, pt2, cv::Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255), rng.uniform(1, 5), lineType);
20 }
21
22 cv::imshow("Random lines", image);
23
24
25 cv::waitKey(0);
26 return 0;
27 }
28
29
30 int displayingRandomTextExample(void) {
31 // 随机生成器和OpenCV文本
32 cv::RNG rng(0xFFFFFFFF); // 创建一个随机数生成器RNG
33
34 cv::Mat image = cv::Mat::zeros(800, 1500, CV_8UC3); // 创建一个(y, x)->(400, 800)的图像
35
36 int lineType = 8;
37 cv::Point pt1, pt2;
38 const int NUMBER = 10;
39
40 // 生成随机文本
41 for (int i = 0; i < NUMBER; i++) {
42 cv::Point org;
43 org.x = rng.uniform(0, 800);
44 org.y = rng.uniform(0, 400);
45 // 创建文本
46 // org指定文本框的左下角
47 cv::putText(image, "Testing text rendering", org, rng.uniform(0, 8), rng.uniform(0, 100) * 0.05 + 0.1, cv::Scalar(0, 0, 255), rng.uniform(1, 10), lineType);
48 }
49
50 cv::imshow("Text", image);
51
52 cv::waitKey(0);
53 return 0;
54 }
55
56
57 int displayingBigEndExample(void) {
58 //cv::RNG rng(0xFFFFFFFF); // 创建一个随机数生成器RNG
59
60 //cv::Mat image = cv::Mat::zeros(800, 1500, CV_8UC3); // 创建一个(y, x)->(400, 800)的图像
61 cv::Mat image = cv::imread("angel.jpg", cv::IMREAD_COLOR);
62
63 int lineType = 8;
64
65 /*
66 cv::getTextSize()函数回答了如果把文字绘制出来将有多大的问题,而不用实际将文字绘制到图上
67 cv::getTextSize()唯一的新的参数就是baseLine,这实际上是一个输出参数,baseLine是和文字最低点相关的文字基线的y坐标值。
68 */
69 cv::Size textSize = cv::getTextSize("Wangml NB!", cv::FONT_HERSHEY_COMPLEX, 3, 5, 0);
70
71 cv::Point org((image.cols - textSize.width) / 2, (image.rows - textSize.height) / 2);
72 cv::Mat image2;
73
74 for (int i = 0; i < 255; i += 2) {
75 image2 = image - cv::Scalar::all(i);
76 cv::putText(image, "Wangml NB!", org, cv::FONT_HERSHEY_COMPLEX, 3, cv::Scalar(i, i, 255), 5, lineType);
77 }
78
79 cv::imshow("Text", image);
80
81 cv::waitKey(0);
82 return 0;
83 }