• 5--OpenCV:图形绘制与文字输出


    opencv图形绘制与文字输出

    注意:

            ①cv::Point类型

            ②C++ STL vector的data()函数 :

            std::vector::data() 是 C++ 中的 STL,它返回一个指向内存数组的直接指针,该内存数组由向量内部用于存储其拥有的元素

    vector_name.data()

    参数:该函数不接受任何参数。

    返回值:该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用。

    1. // C++ program to demonstrate the
    2. // vector::date() function
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. // initialising vector
    8. vector<int> vec = { 10, 20, 30, 40, 50 };
    9. // memory pointer pointing to the
    10. // first element
    11. int* pos = vec.data();
    12. // prints the vector
    13. cout << "The vector elements are: ";
    14. for (int i = 0; i < vec.size(); ++i)
    15. cout << *pos++ << " ";
    16. return 0;
    17. }

             ③注意画多边形的时候,传入的是点集简单版的可以直接传入vector类型。

    复杂版本的,需要 const Point**类型--->vector的data方法,构造一个数组。

    绘线

    1. void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
    2. //线的样式
    3. enum LineTypes
    4. {
    5.    FILLED  = -1,
    6.    LINE_4  = 4, //!< 4-connected line
    7.    LINE_8  = 8, //!< 8-connected line
    8.    LINE_AA = 16 //!< antialiased line
    9. };
    10. /*******************************************************************
    11. * img: 绘制在那个图像上
    12. * pt1: 起点
    13. * pt2: 终点
    14. * color: 颜色
    15. * thickness: 厚度(宽度)
    16. * lineType: 线的样式
    17. * FILLED: 线填充的
    18. * LINE_4: 4邻接连接线
    19. * LINE_8: 8邻接连接线
    20. * LINE_AA:反锯齿连接线(高斯滤波)
    21. * shift: 坐标点小数点位数(可忽略不写)
    22. *********************************************************************/

    绘圆

    1. void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
    2. //线的样式
    3. enum LineTypes {
    4.    FILLED  = -1,
    5.    LINE_4  = 4, //!< 4-connected line
    6.    LINE_8  = 8, //!< 8-connected line
    7.    LINE_AA = 16 //!< antialiased line
    8. };
    9. /*******************************************************************
    10. * img: 绘制在那个图像上
    11. * center: 圆心坐标
    12. * radius: 半径
    13. * color: 颜色
    14. * thickness: 厚度(宽度)
    15. * -1: 填充圆
    16. * 其他值: 空心
    17. * lineType: 线的样式
    18. * FILLED: 线填充的
    19. * LINE_4: 4邻接连接线
    20. * LINE_8: 8邻接连接线
    21. * LINE_AA:反锯齿连接线(高斯滤波)
    22. * shift: 坐标点小数点位数(可忽略不写)
    23. *********************************************************************/

    绘矩形

    1. void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * rec: 矩形大小 Rect(x,y,w,h);  
    5. * x,y: 起始坐标
    6. * w,h: 宽度和高度
    7. * color: 颜色
    8. * thickness: 厚度(宽度)
    9. * -1: 填充矩形
    10. * 其他值: 空心矩形
    11. * lineType: 线的样式
    12. * FILLED: 线填充的
    13. * LINE_4: 4邻接连接线
    14. * LINE_8: 8邻接连接线
    15. * LINE_AA:反锯齿连接线(高斯滤波)
    16. * shift: 坐标点小数点位数(可忽略不写)
    17. *********************************************************************/

    绘椭圆

    1. void ellipse(InputOutputArray img, Point center, Size axes,double angle, double startAngle, double endAngle,
    2. const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
    3. /*******************************************************************
    4. * img: 绘制在那个图像上
    5. * center: 椭圆圆心
    6. * axes: 矩形内置椭圆
    7. * angle: 倾斜角
    8. * startAngle: 扩展的弧度 0
    9. * endAngle: 扩展的弧度 360
    10. * color: 颜色
    11. * thickness: 线宽度
    12. * -1: 填充矩形
    13. * 其他值: 空心矩形
    14. * lineType: 线的样式
    15. * FILLED: 线填充的
    16. * LINE_4: 4邻接连接线
    17. * LINE_8: 8邻接连接线
    18. * LINE_AA:反锯齿连接线(高斯滤波)
    19. * shift: 坐标点小数点位数(可忽略不写)
    20. *********************************************************************/

    绘制多边形

    polylines简单版

    1. void polylines(InputOutputArray img, InputArrayOfArrays pts,bool isClosed, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0 );
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * pts: 点集
    5. * isClosed: 是否封闭
    6. * color: 颜色
    7. * thickness: 厚度(宽度)
    8. * -1: 引发中断
    9. * 其他值: 空心矩形
    10. * lineType: 线的样式
    11. * FILLED: 线填充的
    12. * LINE_4: 4邻接连接线
    13. * LINE_8: 8邻接连接线
    14. * LINE_AA:反锯齿连接线(高斯滤波)
    15. * shift: 坐标点小数点位数(可忽略不写)
    16. *********************************************************************/

    polylines复杂版

    1. void polylines(InputOutputArray img, const Point* const* pts, const int* npts,int ncontours, bool isClosed, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0 );
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * pts: 点集
    5. * npts: 点数目
    6. * ncontours:   待绘制折线数
    7. * isClosed: 是否封闭
    8. * color: 颜色
    9. * thickness: 厚度(宽度)
    10. * -1: 应发中断
    11. * 其他值: 空心形状
    12. * lineType: 线的样式
    13. * FILLED: 线填充的
    14. * LINE_4: 4邻接连接线
    15. * LINE_8: 8邻接连接线
    16. * LINE_AA:反锯齿连接线(高斯滤波)
    17. * shift: 坐标点小数点位数(可忽略不写)
    18. *********************************************************************/

    fillPoly简单版

    1. void fillPoly(InputOutputArray img, InputArrayOfArrays pts,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * pts: 点集
    5. * color: 颜色
    6. * thickness: 厚度(宽度)
    7. * -1: 引发中断
    8. * 其他值: 空心矩形
    9. * lineType: 线的样式
    10. * FILLED: 线填充的
    11. * LINE_4: 4邻接连接线
    12. * LINE_8: 8邻接连接线
    13. * LINE_AA:反锯齿连接线(高斯滤波)
    14. * shift: 坐标点小数点位数(可忽略不写)
    15. * offset: 忽略
    16. *********************************************************************/

    fillPoly复杂版

    1. void fillPoly(InputOutputArray img, const Point** pts,const int* npts, int ncontours,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * pts: 点集
    5. * npts: 点数
    6. * color: 颜色
    7. * ncontours: 待绘制折线数
    8. * thickness: 厚度(宽度)
    9. * -1: 引发中断
    10. * 其他值: 空心矩形
    11. * lineType: 线的样式
    12. * FILLED: 线填充的
    13. * LINE_4: 4邻接连接线
    14. * LINE_8: 8邻接连接线
    15. * LINE_AA:反锯齿连接线(高斯滤波)
    16. * shift: 坐标点小数点位数(可忽略不写)
    17. * offset:
    18. *********************************************************************/

    文字输出

            目前字体中只支持英文

    1. void putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );
    2. /*******************************************************************
    3. * img: 绘制在那个图像上
    4. * text: 绘制文字
    5. * org: 文本框左下角
    6. * fontFace: 字体
    7. * fontScale: 缩放
    8. * color: 颜色
    9. * thickness 线宽度
    10. * lineType: 线的样式
    11. * FILLED: 线填充的
    12. * LINE_4: 4邻接连接线
    13. * LINE_8: 8邻接连接线
    14. * LINE_AA:反锯齿连接线(高斯滤波)
    15. * bottomLeftOrigin: 起点位置
    16. * true: 左上角 反转倒立显示
    17. * false: 左下角 正常显示
    18. *********************************************************************/
    19. //opencv 不识别汉字
    20. //fontFace: 字体
    21. enum HersheyFonts {
    22.    FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font   //灯芯体
    23.    FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
    24.    FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
    25.    FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
    26.    FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
    27.    FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
    28.    FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
    29.    FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
    30.    FONT_ITALIC                 = 16 //!< flag for italic font
    31. };

    综合代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. using namespace cv;
    8. class Shape
    9. {
    10. public:
    11. Shape() :mat(imread("mm.jpg")) {}
    12. void DrawLine(int x = 0, int y = 0, int xx = 600, int yy = 460)
    13. {
    14. line(mat, Point(x, y), Point(xx, yy), Scalar(0, 0, 255), 2, LINE_AA);
    15. }
    16. void DrawCircle(int x = 300, int y = 230, int r = 10)
    17. {
    18. circle(mat, Point(x, y), r, Scalar(0, 255, 0), -1, FILLED); //填充圆
    19. circle(mat, Point(x, y), r+2, Scalar(0, 0, 255), 2, FILLED); //空心圆
    20. }
    21. void DrawRectangle(int x = 100, int y = 100, int w = 40, int h = 40)
    22. {
    23. rectangle(mat, Rect(x, y, w, h), Scalar(255, 0, 0), -1, LINE_4);
    24. rectangle(mat, Rect(x - 1, y - 1, w + 2, h + 2), Scalar(0, 255, 0));
    25. }
    26. void DrawEllipse(int x = 400, int y = 200, Size size = { 100,200 })
    27. {
    28. ellipse(mat, Point(x, y), size, 180, 0, 360, Scalar(255, 0, 0),1);
    29. ellipse(mat, Point(x, y), size, 90, 0, 360, Scalar(255, 0, 0),-1);
    30. }
    31. void DrawText()
    32. {
    33. putText(mat, "opencv test draw shape", Point(50, 50), FONT_ITALIC, 1.0, Scalar(0, 0, 255),
    34. 2,LINE_AA,false);
    35. }
    36. void Show(string wName = "shape")
    37. {
    38. imshow(wName, mat);
    39. waitKey(0);
    40. }
    41. void DrawPolygon()
    42. {
    43. vector pixel;
    44. for (int i = 0; i < 5; i++)
    45. {
    46. pixel.push_back(Point(rand() % 600, rand() % 460));
    47. }
    48. //简单版本
    49. polylines(mat, pixel, true, Scalar(0, 0, 255), 2);
    50. fillPoly(mat, pixel, Scalar(0, 255, 0), 1);
    51. //复杂版本
    52. //int size = 5;
    53. //auto p = pixel.data();
    54. //polylines(mat, &p, &size, 1, true, Scalar(0, 0, 255),1);
    55. //const Point** pts = const_cast(&p);
    56. //fillPoly(mat, pts, &size, 1, Scalar(255, 0, 255),1);
    57. }
    58. protected:
    59. Mat mat;
    60. };
    61. int main()
    62. {
    63. srand((unsigned int)time(nullptr));
    64. Shape* pshape = new Shape;
    65. pshape->DrawLine();
    66. pshape->DrawCircle();
    67. pshape->DrawRectangle();
    68. pshape->DrawEllipse();
    69. pshape->DrawText();
    70. pshape->DrawPolygon();
    71. pshape->Show();
    72. delete pshape;
    73. return 0;
    74. }
  • 相关阅读:
    2022 年移动应用开发终极指南
    【探讨C++中的临时对象:一时之物还是永恒之道?】
    docker compose使用教程(docker-compose教程)
    批量在文件名中的特定文字的左边或右边位置添加文字
    SLAM面试笔记(8) — 计算机视觉面试题
    Linux 15:基于C/S架构——微云盘
    Docker基础学习
    算法(第4版)练习题 1.1.27 的三种解法
    TensorFlow和CUDA、cudnn、Pytorch以及英伟达显卡对应版本对照表
    【Java线程池ThreadPool(创建线程的第三种方式)】
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126463494