zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    hadoop-0.20-集群搭建___实体机通过SSH访问基于VM安装的Linux
    Kettle的集群排序 2——(基于Windows)
    在使用Kettle的集群排序中 Carte的设定——(基于Windows)
    POJ3083
    本地tomcat访问mysql数据库
    正则表达式——(一)
    图论——读书笔记 (深度优先搜索)
    c# 反射+Attribute 实现获取Description的两种做法
    排序方法的总结
    c# 初识Actor Model
  • 原文地址:https://www.cnblogs.com/lnlin/p/13748179.html
Copyright © 2011-2022 走看看