OpenCV学习(4)--基本图形绘制、随机生成器、OpenCV文本

绘制椭圆、圆、多边形、直线

  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 }
原文地址:https://www.cnblogs.com/lnlin/p/13748179.html