OpenCV基础部分(Mat、图像视频读取、显示、保存)

一、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> &params = 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

有空再议

上一篇:错误 LNK2019 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_OutputArray


下一篇:第三课 Mat对象