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 }
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 }
OpenCV学习(4)--基本图形绘制、随机生成器、OpenCV文本
原文:https://www.cnblogs.com/lnlin/p/13748179.html