OpenCV2基础知识——Mat结构

1、概述

在opencv2中,图像以矩阵的形式进行存储,主要一Mat来进行存储。鉴于Opencv2采用基于c++的特性,Mat矩阵的特点主要有以下几个方面:
  • 不需要手动管理内存空间,应该采用引用计数的方式实现(是C++的通用方法)。
  • Mat以类的方式实现,包括两个部分:矩阵头和实际数据指针。
  • 通常情况下,Mat的拷贝和赋值都是浅拷贝方式,如需要深拷贝则使用copyTo()和clone()。举例说明:
Mat A, C; // 只创建信息头部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存
Mat B(A); // 使用拷贝构造函数
C = A; // 赋值运算符
Mat F = A.clone(); //深拷贝,数据有两份
Mat G;
A.copyTo(G); //深拷贝,数据有两份

2、如何创建Mat/使用Mat

(1)使用构造函数初始化Mat

cv::Mat img(2,2,CV_8UC3,cv::Scalar(0,0,255));
上述代码创建了一个2行2列的矩阵,矩阵元素使用8位无符号char类型保存,具有3通道,每个像素的初始值是(0,0,255)。

(2)使用指针创建可以表示三维3维矩阵的Mat

 int sz[3] = {2,2,2}; 
 Mat L(3,sz, CV_8UC(1), Scalar::all(0));
上述代码表示第一个参数指定维数3,第二个参数表示每个维度的尺寸2*2*2,另外两个参数与(1)相同。

(3)使用IplImage指针初始化Mat。

IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat

(4)使用Creat()创建Mat。

M.create(4,4, CV_8UC(2));
cout << "M = "<< endl << " "  << M << endl << endl;
 表示创建了一个4行4列的矩阵,每个元素为双通道的8位无符号类型,该方法不可以设矩阵初值,它只是在改变尺寸时候重新为矩阵开辟内存。

(5)MATLAB形式的初始化

Mat E = Mat::eye(4, 4, CV_64F);    
cout << "E = " << endl << " " << E << endl << endl;
Mat O = Mat::ones(2, 2, CV_32F);    
cout << "O = " << endl << " " << O << endl << endl;
Mat Z = Mat::zeros(3,3, CV_8UC1);
cout << "Z = " << endl << " " << Z << endl << endl;

(6)小矩阵的初始化(比较适用于定义模板)

Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

(7)使用copyTo()和clone() 初始化

Mat RowClone = C.row(1).clone();
cout << "RowClone = " << endl << " " << RowClone << endl << endl;

表示复制C的第一行(行数以0为起始点)

(8)使用imread初始化Mat

a = cv::imread("f:\\psb.jpg");//读入图像
imread的原型如下:
v::Mat imread(const string& filename,int flags=1)
filename指定要读取图像的位置
flags指定图像的颜色空间
flags > 0 3通道的彩色图像
flags = 0 灰度图像
flags < 0 不作改变
也可以有以下的枚举值:CV_LOAD_IMAGE_ANYDEPTH、CV_LOAD_IMAGE_COLOR、CV_LOAD_IMAGE_GRAYSCALE

3、将Mat输出

imwrite的函数原型如下:

bool imwrite(const string& filename,InputArrayimg,constvector<int>& params=vector<int>())

filename,指定的文件
img 要保存的Mat对象
params 用来指定图像的保存编码方式。
使用filename的扩展名来指定图像的保存格式(.jpg .png .bmp),对于不同的图像保存类型,params是不同的值
JPEG,params用来指定图像的质量(0到100),默认的是95. CV_IMWRITE_JPEG_QUALITY
PNG,params用来指定图像的压缩级别(0到9),压缩级别越高图像占用的空间越小,保存图像所用的时间越久。默认值是3. CV_IMWRITE_PNG_COMPRESSION
PPM,PGM,PBM,params是一个标记(0或者1),默认的是1.CV_IMWRITE_PXM_BINARY
imwrite只能保存8位(或者是16位无符号(CV_16UC)的PNG,JPEG200或者TIFF图像)单通道或者三通道的图像,如果要保存的不是这样的图片,可以使用convertTo或者cvtColor来进行转变。
例子:


> imwrite("alpha.png",mat,compression_params);

4、Mat显示

Mat img = imread("f:\psb.jpg");
const string name ="Hu";
namedWindow(name);
imshow(name,img);
waitKey();

5、Tips

(1)使用<<对Mat取值,只有Mat表示的是二维矩阵的时候才有效。
(2)对于opencv里面常用的表达方式类似于CV_8UC3,其命名规则遵循:
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

6、参考资料

(1)http://www.cnblogs.com/wangguchangqing/p/3841271.html
(2)opencv2中文文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值