基础图像容器Mat
opencv中的图像存储
这个部分主要介绍opencv存储图片的两种方式:IplImage和Mat;接着介绍Mat类的数据组成,最后介绍如何复制图片。
图片的存储
1.采用IplImage的方式:opencv一开始的时候,采用的时C接口,那是一般用IplImage来创建图片容器,如 IplImage* img,其缺点是不能自动释放内存,当程序较大时,容易忘记手动释放内存,从而导致内存泄漏。
2.采用Mat的方式:从opencv进入2.0时代,引入了C++接口,Mat类数据结构成为存储图片的主流,其特点是能够自动释放内存。
Mat类的数据组成
Mat类由两个部分组成:1)矩阵头,2)指针。
1)矩阵头:包含了矩阵尺寸、存储方法和存储地址等信息
2)指针:指向存储像素值的矩阵
图片的复制
在opencv中图像的复制可以分为两种:1)浅复制,2)深复制
1)浅复制:创建新的矩阵头,但是只复制了指针(即指向同一个存储像素值的矩阵),这种复制的优点是能够节省内存,防止程序运行速度降低。浅复制可以通过两种方式实现:赋值和拷贝
赋值
Mat A,B;
A = imread("picture.jpg");
B = A;
拷贝
Mat A;
A = imread("picture.jpg");
Mat B(A);
2)深复制:既创建了新的矩阵头,又创建了新的存储像素值的矩阵。有两种方式实现深复制:clone()和copyTo()
clone()
Mat A,B;
A = imread("picture.jpg");
B = A.clone()
copyTo()
Mat A,B;
A = imread("picture.jpg");
A.copyTo(B);
创建Mat对象
这一部分主要讲述七种创建Mat对象的方法。
1)采用Mat()构造函数直接构建二维数组
Mat A(10,5,CV_8UC3,Scalar(0,0,255));
其中10表示的是数组的行数,5是列数,Scalar(0,0,255)代表的是元素的值,CV_8UC3中8表示的是数据的位数,U表示的是unsigned,C代表的是数据类型char,3代表的是每个像素由三个元素组成。
2)创建多维的Mat对象
int SZ[3] = {3,3,3}
Mat A(3,SZ,CV_8UC3,Scalar(0,0,255));
其中3代表的是Mat对象的维数,SZ中的元素代表的是每个维度的尺寸,后续的两个参数与方法1)中的意思一样。
3)用IplImage指针来创建Mat对象
IplImage* img = cvLoadImage("picture.jpg")
Mat A(img)
4)利用create()函数
M.create(4,4,CV_8UC3);
该方法只是截取了原来M对象中的4行和4列,不能设定初始值。
5)采用Matlab式的方法
Mat A = Mat::eye(2,2,CV_8UC3);
创建2X2的矩阵,对角线全为1,其它的都为零。
Mat A = Mat::zeros(2,2,CV_8UC3);
创建2X2的矩阵,元素都为零。
Mat A = Mat::ones(2,2,CV_8UC3);
创建2X2的矩阵,元素都为1。
6)创建二维元素并直接赋值
Mat A = (Mat_<double>(3,3) << 0,-1,0,-1,-5,-1,0,-1,0);
7)采用clone()
Mat A = M.row(1).clone();
将M中的第一行提出来创建A数组。
2071

被折叠的 条评论
为什么被折叠?



