一、Mat类

1.1 Mat类简介

        Mat类是一个储存矩阵数据的容器,包括灰度、向量、矩阵、彩色图像等数据。Mat类分为矩阵头和指向存储数据的矩阵指针两部分。

矩阵头:

矩阵尺寸:

存储方法:

地址:

引用次数:

        而图像传递和复制过程中,主要开销是存放矩阵数据,在Opencv中复制和传递图像时,只是复制了矩阵头和指向存储数据的指针。

1.2 构造函数

Mat类还可以存储double、float、uchar、unsigned char数据类型

如: Mat A= Mat<double>(3,3);

Mat A;//创建了一个名称是A的矩阵头   用于保存读取数据的结果和某个·函数的输出结果

Mat B(A);

Mat B.clone(A);//数据域不同了

Mat B(A,Range(x1,x2),Range(y1,y2));

Mat A(640,480,CV_8UC1);//知道尺寸和数据类型时用,比如:内参矩阵、旋转矩阵

Mat A(Size(480,640),CV_8UC1);

Mat的数据类型:

CV_8U: 8位无符号整数                 CV_16U: 16位无符号整数

CV_8S: 8位有符号整数                 CV_16S: 16位有符号整数

CV_32S: 32位有符号整数             CV_32F: 32位浮点整数

CV_64F: 64位浮点整数

通道数:C1、C2、C3、C4分别代表单、双、三、四通道

例如:CV_8UC1

赋值:

Scalar(0,0,255);给每个像素的3个通道分别赋值

Mat A(Size(480,640),CV_8UC3,Scalar(0,0,255));

直接赋值:Mat a=Mat<double>(3,3) <<1.0,2.0);

循环赋值:

for(int i=0;i<c.rows;i++)
        for(int j=0;j<c.cols;j++)
        {
             c.at<int>(i,j)=i+j;
        }
类方法赋值:
A=Mat::eye(640,480,CV_8UC1);
A=Mat::ones(640,480,CV_8UC1);
A=Mat::zeros(640,480,CV_8UC1);
B=Mat::diag(A);//A是1维矩阵

1.3 运算

        加减运算:为了给图像滤波、增强等操作。乘除:卷积

加减运算:两个矩阵的数类型要相同,常数结果保持与Mat类型相同

普通乘法:k=a*b;

内积:k=a.dot(b);

位乘:k=a.mul(b);

        这三种运算,不解释。

1.4 元素读取

        首先,Mat的存储是第一个元素的三个通道存储完成后再去存储后面的。

Mat类的属性 

cols:列数                rows:行数          step:以字节为单位的矩阵宽度

elemSize():每个元素的字节数        total():矩阵中元素的个数

channels():  矩阵的通道数       

四种方式读取:

1.通过at方法

2.通过ptr指针

3.通过迭代器

4.通过矩阵元素的地址

二、图像的读取、显示、保存·

2.1 imread

Mat imread(filename,int flags)

参数二说明:flags常用几种方式

-1:带透明度        0:灰度                  1:BGR

2.2 imshow和namedWindow

namedWindow("窗口名称",int flags=WINDOW_AUTOSIZE);
flags的常用参数:
WINDOW_NORMAL :用户可以随意调整窗口大小
WINDOW_AUTOSIZE:自动适应图像大小,不允许修改
其他参数自行查找
imshow("窗口名称",Mat对象);
waitKey(0);
destroyWindow();//关闭指定名称的窗口
destroyALLWindows();//关闭所有窗口

2.3 imwrite

bool imwrite(filename,InputArray img,vector<int> ¶ms = vector<int> ());
params:保存图片格式属性设置标志
CV_16U:png、jpeg、tiff
CV_32F

4通道

第三个参数的具体设置,不详细说明.

第三个参数一般不需要写,特殊情况才写

三、视频的读取、显示、保存

3.1 视频加载

1.VedioCapture类
VedioCapture::VedioCapture();//默认构造函数
VedioCapture::VedioCapture(filename,int 属性);//默认构造函数
属性:编码格式,参是否调用OpenNI
以上只是将视频文件加载到了VedioCapture中,还需要赋值给Mat,
video>>frame
2.VedioCapture方法
bool isOpened();判断是否读取成功
open("文件名")
get();获取像素尺寸、帧数、帧率。具体参数不讲
3.2 摄像头调用
3.3 视频数据䣌保存
VedioWriter(filename,int fourcc,double fps,Size frameSize,bool isColor=true);

参数2:视频编码格式

参数3:帧率,视频中每秒图像的张数

参数4:视频帧的尺寸

参数5:保存视频是否是彩色视频

四、XML和YMAL

有空再议