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();
参考资料: