opencv Mat类型的使用

Mat是opencv中用于存储图像的数据类型,相对于以往的IplImage 类型,Mat类型省去了人工管理内存,转而自动分配释放。Mat 类包含一个矩阵头以及一个指向矩阵的指针。

Mat 数据元素类型

CV_64FC1 64F代表每一个像素点元素占64位浮点数,通道数为1
CV_64FC3 64F代表每一个像素点元素占64点×3个浮点数,通道数为4
CV_8U - 8-bit unsigned integers ( 0…255 )
CV_8S - 8-bit signed integers ( -128…127 )
CV_16U - 16-bit unsigned integers ( 0…65535 )
CV_16S - 16-bit signed integers ( -32768…32767 )
CV_32S - 32-bit signed integers ( -2147483648…2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX…FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX…DBL_MAX, INF, NAN )

Mat的创建

(1) cv::Mat::Mat Constructor:

// 创建大小为4*4,元素类型为8位无符号1通道(灰度图像), 元素值为255的Mat
Mat M1(4,4,CV_8UC1,Scalar(255)); 
// 创建大小为5*5,元素类型为8位无符号3通道(BGR图像),元素值为(0,0,255)的Mat
Mat M2(5,5,CV_8UC3,Scalar(0,0,255)); 

(2) cv::Mat::create function:

// 重新为矩阵数据开辟内存,创建3*3大小的8位无符号2通道的Mat, 该方法不能自定义Mat初始值
M.create(3,3,CV_8UC(2));
cout<<M;

(3) MATLAB style initializer: cv::Mat::zeros/ones/eye

Mat M1=Mat::eye(4,4,CV_64F); 
Mat M2=Mat::ones(2,3,CV_32F);
Mat M3-Mat::zeros(4,5,CV_8UC1);

(4) 自定义初始值

Mat M=(Mat_<double>(3,3)<<0,1,0,1,-4,1,0,1,0);

Mat 的复制

(1) 浅复制

// 只新建了矩阵头,并指向同一个矩阵,即修改任意一项的值,其他的都会改变。
Mat B(A);
C=A;
Mat D(A,Rect(10,10,100,100));

(2) 深复制

Mat B=A.clone();
Mat G;
A.copyTo(G);

注意:拷贝构造函数使复制后的Mat对象拥有自己的信息头和矩阵指针,而不复制矩阵,通过让矩阵指向同一地址而实现。使用函数clone() 、copyTo()可一复制矩阵本身(不只是信息头和矩阵指针);

读取图像:cv::imread

cv::Mat img;
img=cv::imread(img_path,CV_LOAD_IMAGE_COLOR);
if(!img.data)
    std::cout<<"Could not open or find file "<< img_path<<std::endl;
int rows=img.rows;
inr cols=img.cols;
for(int h=0;h<rows;h++)
    for(int w=0;w<cols;w++){
        img.at<uchar>(h,w);
    }
img.data; // uchar类型的指针,指向Mat数据矩阵的首地址
img.dims;// 若二维矩阵,dims=2
img.size().width==img.cols;
img.size().height==img.rows;
img.channels();

参考资料:

  1. opencv中Mat类型数据操作与遍历
  2. Opencv Mat矩阵中data、size等属性的理解
  3. 创建mat对象的几种方法
  4. OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解

猜你喜欢

转载自blog.csdn.net/LilyZJ/article/details/88955682