• Opencv之Mat常用类成员(一篇就够了)


    1. 重要类成员

    • data:数据存储的起始地址 (uchar*类型);
    • dims:矩阵维度。如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维;
    • channels():通道数量,矩阵中表示一个元素所需要的值的个数。例:3 * 4矩阵中共有12个元素,如果每个元素需要3个值表示,那么此矩阵的通道数为3。常见的是一张彩色图片有B蓝、G绿、R红3个通道;
    • depth():深度,即表示单通道中元素值的位数(bits)。Mat.depth()返回的是一个 0~6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;
    • elemSize() : 单个元素在所有通道中大小之和,elemSize() = sizeof(数据类型) * channels()。如果Mat中的数据的数据类型是 CV_8U 那么 elemSize() = 1;CV_8UC3 那么 elemSize() = 3,CV_16UC2 那么 elemSize() = 4;
    • elemSize1() : 单个元素在1个通道中的大小。elemSize1() = sizeof(数据类型) = elemSize()  / channels()。 
    • step[]:可以看作是一个有dims个元素的动态数组,定义了矩阵的在各维度之间跳变时的最大步长(单位:字节。如2维Mat时,step[0]表示行长度,step[1]表示元素长度)。
    • step1(n):与step[n]对应范围的总通道数, step1(n) = step[n] / elemSize1();
    • type: 矩阵元素的数据类型

    2. Mat.step

    step的几个类别区分:

    • step:矩阵第一行元素的字节数
    • step[0]:矩阵第一行元素的字节数
    • step[1]:矩阵中一个元素的字节数
    • step1(0):矩阵中一行有几个通道数
    • step1(1):一个元素有几个通道数(channel())

    3. Mat的创建

    1. Mat::Mat(); //default  
    2.     Mat::Mat(int rows, int cols, int type);  
    3.     Mat::Mat(Size size, int type);  
    4.     Mat::Mat(int rows, int cols, int type, const Scalar& s);  
    5.     Mat::Mat(Size size, int type, const Scalar& s);  
    6.     Mat::Mat(const Mat& m);  
    7.     //参数说明:  
    8.     //int rows:高  
    9.     //int cols:宽  
    10.     //int type:参见"Mat类型定义"  
    11.     //Size size:矩阵尺寸,注意宽和高的顺序:Size(cols, rows)  
    12.     //const Scalar& s:用于初始化矩阵元素的数值  
    13.     //const Mat& m:拷贝m的矩阵头给新的Mat对象,但是不复制数据!相当于创建了m的一个引用对象  
    14.       
    15.     //例子1:创建100*90的矩阵,矩阵元素为3通道32位浮点型  
    16.     cv::Mat M(100, 90, CV_32FC3);  
    17.     //例子2:使用一维或多维数组来初始化矩阵,  
    18.     double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};  
    19.     cv::Mat M = cv::Mat(3, 3, CV_64F, m);  
    20.       
    21.     //2.使用create函数:  
    22.     Mat a = create(10, 9, CV_16U);  //创建10*9的矩阵,矩阵元素为16位无符号整型  
    23.     //create的一个特殊用法:如果初始化的时候没有传入size的参数,或者后面需要改变size的参数,可以使用create来调整  
    24.     // make 7x7 complex matrix filled with 1+3j.  
    25.     cv::Mat M(7,7,CV_32FC2,Scalar(1,3));  
    26.     // and now turn M to 100x60 15-channel 8-bit matrix.  
    27.     // The old content will be deallocated:隐式使用release()释放  
    28.     M.create(100,60,CV_8UC(15));

    4. Mat的访问

    at

    1. //第一种方法
    2. for(int h = 0 ; h < image.rows ; ++ h)
    3. {
    4. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    5. {
    6. image.at(h , w)[0] = 255 ;
    7. image.at(h , w)[1] = 0 ;
    8. image.at(h , w)[2] = 0 ;
    9. }
    10. }
    11. imshow("color1" , image) ;
    12. //方法二
    13. for(int h = 0 ; h < image.rows ; ++ h)
    14. {
    15. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    16. {
    17. Vec3b &bgr = image.at(h , w) ;
    18. bgr.val[0] = 0 ;
    19. bgr.val[1] = 255 ;
    20. bgr.val[2] = 0 ;
    21. }
    22. }

    ptr

    1. //三通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
    2. //第一种方法
    3. for(int h = 0 ; h < image.rows ; ++ h)
    4. {
    5. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    6. {
    7. uchar *ptr = image.ptr(h , w) ;
    8. ptr[0] = 255 ;
    9. ptr[1] = 0 ;
    10. ptr[2] = 0 ;
    11. }
    12. }
    13. imshow("color1" , image) ;
    14. //第二种方法
    15. for(int h = 0 ; h < image.rows ; ++ h)
    16. {
    17. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    18. {
    19. Vec3b *ptr = image.ptr(h , w) ;
    20. ptr->val[0] = 0 ;
    21. ptr->val[1] = 255 ;
    22. ptr->val[2] = 0 ;
    23. }
    24. }
    25. //单通道图像,at(y , x)索引是先行(y轴) , 后列(x轴)
    26. //第一种方法
    27. for(int h = 0 ; h < image.rows ; ++ h)
    28. {
    29. uchar *ptr = image.ptr(h) ;
    30. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    31. {
    32. ptr[w] = 128 ;
    33. }
    34. }
    35. for(int h = 0 ; h < image.rows ; ++ h)
    36. {
    37. for(int w = 0 ; w < image.cols / 2 ; ++ w)
    38. {
    39. uchar *ptr = image.ptr(h , w) ;
    40. *ptr = 255 ;
    41. }
    42. }

    迭代器

    1. //三通道图像
    2. Mat_::iterator it = image.begin() ;
    3. Mat_::iterator itend = image.end() ;
    4. for(;it != itend ; ++ it)
    5. {
    6. (*it)[0] = 255 ;
    7. (*it)[1] = 0 ;
    8. (*it)[2] = 0 ;
    9. }
    10. //单通道图像
    11. image = imread("forest.jpg" , 0) ;
    12. Mat_::iterator it1 = image.begin() ;
    13. Mat_::iterator itend1 = image.end() ;
    14. for (;it1 != itend1 ; ++ it1)
    15. {
    16. (*it1) = 128 ;
    17. }

    data

    1. data = image.data ;
    2. for(int h = 0 ; h < image.rows ; ++ h)
    3. {
    4. for(int w = 0 ; w < image.cols/2 ; ++ w)
    5. {
    6. *data ++ = 128 ;
    7. }
    8. }

    row, col

    1. for(int i = 0 ; i < 100 ; ++ i)
    2. {
    3. image.row(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i行数据
    4. image.col(i).setTo(Scalar(0 , 0 , 0)) ;//设定第i列数据
    5. }

    综合高效

    1. //单通道多通道都适用
    2. int nRows = image.rows ;
    3. int nCols = image.cols * image.channels() ;
    4. if(image.isContinuous())
    5. {
    6. nCols = nRows * nCols ;
    7. nRows = 1 ;
    8. }
    9. for(int h = 0 ; h < nRows ; ++ h)
    10. {
    11. uchar *ptr = image.ptr(h) ;
    12. for(int w = 0 ; w < nCols ; ++ w)
    13. {
    14. *ptr ++ = 128 ;
    15. }
    16. }

    5. Mat的数据类型

    当使用at以及对数据进行运算时候需要指定类型。cv::Mat 类的对象有一个成员函数type()用来返回矩阵元素的数据类型

    访问:

    1. cv::Vec3b vec3b = img.at(0,0);
    2. uchar vec3b0 = img.at(0,0)[0];
    3. uchar vec3b1 = img.at(0,0)[1];
    4. uchar vec3b2 = img.at(0,0)[2];

     

    定义:

    1. typedef Vec2> Vec2b;
    2. typedef Vec3> Vec3b;
    3. typedef Vec4> Vec4b;
    4. typedef Vec<short, 2> Vec2s;
    5. typedef Vec<short, 3> Vec3s;
    6. typedef Vec<short, 4> Vec4s;
    7. typedef Vec<int, 2> Vec2i;
    8. typedef Vec<int, 3> Vec3i;
    9. typedef Vec<int, 4> Vec4i;
    10. typedef Vec<float, 2> Vec2f;
    11. typedef Vec<float, 3> Vec3f;
    12. typedef Vec<float, 4> Vec4f;
    13. typedef Vec<float, 6> Vec6f;
    14. typedef Vec<double, 2> Vec2d;
    15. typedef Vec<double, 3> Vec3d;
    16. typedef Vec<double, 4> Vec4d;
    17. typedef Vec<double, 6> Vec6d;

     

  • 相关阅读:
    Spring Cloud + Spring Boot + Mybatis + Uniapp 企业架构之 JVM垃圾回收总结
    Redis学习笔记18:基于spring data redis及lua脚本的分布式锁
    Python基础095:Python读取PDF中的字符
    UE5实现相机水平矫正
    基于生物激励神经网络的室内实时激光SLAM控制方法
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    简单小游戏制作
    CAD二次开发--像纬地与CASS程序一样双击桌面图标实现插件的自动挂载(不用netload也不用进入后输入挂载命令)
    HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码
    Java基础题08——数组(查找下标所对应的值)
  • 原文地址:https://blog.csdn.net/u010420283/article/details/128058391