图像容器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数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值