mat 释放_opencv mat转 iplimage 需要释放内存吗

2016-09-10 回答

一、mat类型:矩阵类型,matrix。

在opencv中,mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

mat有3个重要的方法:

1、mat mat = imread(const string* filename); 读取图像

2、imshow(const string framename, inputarray mat); 显示图像

3、imwrite (const string& filename, inputarray img); 储存图像

mat类型较cvmat与iplimage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将cvmat与iplimage类型转化为mat类型将大大减少计算时间花费。

a.mat -> iplimage

同样只是创建图像头,而没有复制数据。

例: // 假设mat类型的imgmat图像数据存在

iplimage pimg= iplimage(imgmat);

b.mat -> cvmat

与iplimage的转换类似,不复制数据,只创建矩阵头。

例: // 假设mat类型的imgmat图像数据存在

cvmat cvmat = imgmat;

二、cvmat类型与iplimage类型:“图像”类型

在opencv中,mat类型与cvmat和iplimage类型都可以代表和显示图像,但是,mat类型侧重于计算,数学性较高,opencv对mat类型的计算也进行了优化。而cvmat和iplimage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

补充:iplimage由cvmat派生,而cvmat由cvarr派生即cvarr -> cvmat -> iplimage

cvarr用作函数的参数,无论传入的是cvmat或iplimage,内部都是按cvmat处理。

1.cvmat

a.cvmat-> iplimage

iplimage* img = cvcreateimage(cvgetsize(mat),8,1);

cvgetimage(mati,img);

cvsaveimage("rice1.bmp",img);

b.cvmat->mat

与iplimage的转换类似,可以选择是否复制数据。

mat::mat(const cvmat* m, bool copydata=false);

在opencv中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。

但是,cvmat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如cvmat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:

cvmat* cvcreatmat(int rows ,int cols , int type);

这里的type可以是任意的预定义数据类型,比如rgb或者别的多通道数据。这样我们便可以在一个cvmat矩阵上表示丰富多彩的图像了。

2.iplimage

在类型关系上,我们可以说iplimage类型继承自cvmat类型,当然还包括其他的变量将之解析成图像数据。

iplimage类型较之cvmat多了很多参数,比如depth和nchannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示rgb+alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是opencv对图像表示的一种优化方案。

iplimage的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,opencv允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。

dataorder参数定义数据的格式。有ipl_data_order_pixel和ipl_data_order_plane两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。

iplimage类型的所有额外变量都是对“图像”的表示与计算能力的优化。

a.iplimage -> mat

iplimage* pimg = cvloadimage("lena.jpg");

mat img(pimg,0); // 0是不复制影像,也就是pimg与img的data共用同个记忆体位置,header各自有

b.iplimage -> cvmat

法1:cvmat mathdr, *mat = cvgetmat( img, &mathdr );

法2:cvmat *mat = cvcreatemat( img->height, img->width, cv_64fc3 );

cvconvert( img, mat );

c.iplimage*-> byte*

byte* data= img->imagedata;

cvmat和iplimage创建时的一个小区别:

1、建立矩阵时,第一个参数为行数,第二个参数为列数。

cvmat* cvcreatemat( int rows, int cols, int type );

2、建立图像时,cvsize第一个参数为宽度,即列数;第二个参数为高度,即行数。这 个和cvmat矩阵正好相反。

iplimage* cvcreateimage(cvsize size, int depth, int channels );

cvsize cvsize( int width, int height );

iplimage内部buffer每行是按4字节对齐的,cvmat没有这个限制

补充:

a.byte*-> iplimage*

img= cvcreateimageheader(cvsize(width,height),depth,channels);

cvsetdata(img,data,step);

//首先由cvcreateimageheader()创建iplimage图像头,制定图像的尺寸,深度和通道数;

//然后由cvsetdata()根据byte*图像数据指针设置iplimage图像头的数据数据,

//其中step指定该iplimage图像每行占的字节数,对于1通道的ipl_depth_8u图像,step可以等于width。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值