Mat容器

发布时间 2023-12-10 18:48:40作者: 肆空界

Mat:在openCV中用于存储矩阵数据的类型

Mat中能存储的数据:

cv::Mat_<_Tp>, cv::Mat_<double>, cv::Mat_<float>, cv::Mat_<uchar>, cv::Mat_<unsigned char>

 openCV中规定的数据类型:

 

 

 Mat类的创建:

  1.cv::Mat::Mat(int rows,int cols,int type)//注意:type:矩阵中存储的数据类型,另如CV_8UC(n)中C(n)构建多通道,n指明通道数,不加C默认C(1),n最大取512

  2.cv::Mat::Mat(Size size,int type)//size:2D数组变量的尺寸,通过Size(cols,rows)进行赋值,type一致:

  3.cv::Mat::Mat(const Mat& m,const Range& rowRange,const Range& colRange=Range::all())//m已有的Mat类矩阵数据,rowRange行:如Range(2,5),colRange列:如Range(2,5)--------前闭后开

  4.cv::Mat::Mat(int rows,int cols,int type,const Scalar& s)//s:给矩阵中的每个像素赋值的参数变量,例如Scalar(0,0,255),这是3通道

  5.类方法赋值:

    eye:单位矩阵  diag:对角矩阵  ones:元素全为1的矩阵  zeros:元素全为0的矩阵

    举例:a=Mat::eye(3,3,type)

  6.枚举法赋值:

    举例:(类型为基本数据类型)

      cv::Mat a=(cv::Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);

      cv::Mat b=(cd::Mat_<double>(2,)<<1.0,2.1,3.2,4.0,5.1,6.2);

 Mat类矩阵的常用属性

  cols,rows,step以字节为单位的矩阵的有效宽度,elemSize()每个元素的字节数,total()矩阵中元素的个数,channels矩阵的通道数

常用的Mat类矩阵的元素读取方式:

  • at()

    单通道:

      int value=(int)a.at<uchar>(0,0);//括号内为矩阵行列坐标

    多通道:

      cv::Vec3b vc3=b.at<cv::Vector>(0,0);

  • 指针ptr

    cv::Mat b(3, 4, CV_8UC3, cv::Scalar(0, 0, 1));

    for (int i = 0; i < b.rows; i++){

      uchar* ptr = b.ptr<uchar>(i);

      for (int j = 0; j < b.cols*b.channels(); j++){

        cout << (int)ptr[j] << endl;

      }

    }

  • 迭代器

cv::MatIterator_<uchar> it = a.begin<uchar>();

cv::MatIterator_<uchar> it_end = a.end<uchar>();

for (int i = 0; it != it_end; it++){

  cout << (int)(*it) << " ";

  if ((++i% a.cols) == 0){

    cout << endl;

  }

}

  • 通过矩阵元素的地址定位方式

(int)(*(b.data + b.step[0] * row + b.step[1] * col + channel));//b.step[0]行步长,b.step[1]列步长