IplImage,CvMat,Mat的关系和相互转换_第1页
IplImage,CvMat,Mat的关系和相互转换_第2页
IplImage,CvMat,Mat的关系和相互转换_第3页
IplImage,CvMat,Mat的关系和相互转换_第4页
IplImage,CvMat,Mat的关系和相互转换_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Ipllmage,CvMat,Mat的关系和相互转换(转载)opencv中常见的与图像操作有关的数据容器有Mat,cvMat和Ipllmage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和Ipllmage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在opencv2.0之前,opencv是完全用C实现的,但是,Ipllmage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽彖的基类-CvArr,这在源代码中会常见。1.

2、1pllmageopencv中的图像信息头,该结构体定义:ViewCodetypedefstructJpllmageintnSize;intID;intnChannels;intalphaChannel;intdepth;charcolorModel4;charchannelSeq4;intdataOrder;intorigin;intalign;intwidth;intheight;structJpIROI*roi;structpllmage*maskROI;void*imageld;structJpITilelnfo*tilelnfo;intimageSize;char*imageData

3、;intwidthstep;intBorderMode4;intBorderConst4;char*imageDataOrigin;Ipllmage;dataOrder中的两个取值:交叉存取颜色通道是颜色数据排列将会是BGRBGR.的交错排列。分开的颜色通道是有几个颜色通道就分几个颜色平面存储。roi是IpIROI结构体,该结构体包含了xOffselyOffset,height,width,coi成员变量,其中xOffset,yOffset是x,y坐标,coi代表channelofinterest)感兴趣的通道),非0的时候才有效。访问图像中的数据元素,分间接存储和直接存储,当图像元素为浮点型

4、时,(uchar*)改为(float*):ViewCodeIpllmage*img=cvLoadlmage(,lena.jpg,/1);CvScalars;s=cvGet2D(imgJj);cvSet2D(imgJj,s);Ipllmage*img;/mallocmemorybycvLoadlmageorcvCreatelmagefor(introw=0;rowheight;row+)for(intcol=0;colwidth;col+)b=CV_IMAGE_ELEM(img,UCHAR,row,col*img-nChannels+0);g=CVJMAGE_ELEM(img,UCHAR,row

5、,col*img-nChannels+1);r=CV_IMAGE_ELEM(img,UCHAR,row,col*img-nChannels+2);Ipllmage*img;/mallocmemorybycvLoadlmageorcvCreatelmageucharb,g,r;/3channelsfor(introw=0;rowheight;row+)for(intcol=0;colwidth;col+)b=(uchar*)(img-imageData+row*img-widthStep)col*img-nChannels+0;g=(uchar*)(img-imageData+row*img-w

6、idthStep)col*img-nChannels+1;r=(uchar*)(img-imageData+row*img-widthStep)col*img-nChannels+2;初始化使用Ipllmage*,是一个指向结构体Ipllmage的指针:ViewCodeIpllmage*cvLoadlmage(constchar*filename,intiscolorCV_DEFAULT(CV_LOADMAGE_COLOR);/loadimagesfromspecifiedimageIpllmage*cvCreatelmage(CvSizesize,intdepth,intchannels);

7、/allocatememoryCvMat首先,我们需要知道,第一,在OpenCV中没有向量(vector)结构。任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轨向量,则需要一个行矩阵)。第二,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更抽彖,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值。CvMat的结构:ViewCodetypedefstructCvMatinttype;intstep;int*refcount;unionuchar*ptr;short*s;int*i;float*fl;double*db;data;unionintrows;int

8、height;unionintcols;intwidth;CvMat;创建CvMat数据:ViewCodeCvMat*cvCreateMat(introws,intcols,inttype);CV_INLineCvMatcvMat(introws,intcols,inttype,void*dataCV_DEFAULT);CvMat*cvlnitMatHeader(CvMat*mat,introws,intcols,inttype,void*dataCV_DEFAULT(NULL),intstepCV_DEFAULT(CV_AUTOSTEP);对矩阵数据进行访问:ViewCodecvmSet(C

9、vMat*mat,introw,intcol,doublevalue);cvmGet(constCvMat*mat,introw,intcol);IIII迴饯田来-5=o.mueo匸)丄七+QTdAK丄eEAo)Nullo丄00多0Mo匸兰EAo*Null/lUJIJJllvl/roU0mlOHard己A丄eEA3)HldUJCJIlo二一omH(_0。7vo(u_qnopMUMO*IAIIJJ-lIJJllvlAro、寸、寸)lelAIEeCDoAOn*lezAoomH=00+SOOAJPUJA晏zvo一qpelep丄05IUA3、寸、寸)lelAIEeCDoAOn*lezAoOm(leo-

10、J)n=00+soooleluAo晏Mo一-Jelepe-POSAoJxp一-u一oxp一-u一st_aAs報闿黑世nc*乏出UJIJLy(寸:H寸91/0GT)牯乏右巴丫。Hotj叟晏右三5soroosuod/on(0、0Quod/Vo匚01。叟*|/1出1)(sszmlJmd忘三出eeuzHots岁着右三Ao卅H+d“+一8+Mo?o_4)H(0+d占+-0。+Mo(leo-J)H(H+d*=0。+Mo(leo-4)Hd*(+O0fs-0Q2elu/。V-Ouon-oo-u二0J=寸-d(DlsMculu/o)*M0+-JwlepA,lelu/xoHd)(+M0二SM02PEA3VMoon

11、MO二)0J旦来ip、om丄ip+odAlo)NulJLo丄0。7voo)七CvScalar(O,0,0,0);复制矩阵操作:ViewCodeCvMat*Ml=cvCreateMat(4,4/CV32FCl);CvMat*M2;M2=cvCloneMat(Ml);MatMat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的cvMat和Ipllmage,相比之下Mat最人的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。opencv2.3中提到Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。ViewCode

12、classCV_EXPORTSMatpublic:intflags;(Note:目前还不知道flags做什么用的)intdims;introws,cols;uchar*data;int*refcount;从以上结构体可以看出Mat也是一个矩阵头,默认不分配内存,只是指向一块内存(注意读写保护)。初始化使用create函数或者Mat构造函数,以下整理自opencv2.3.1Manual:ViewCodeMatfnrows,ncols,type,fillValue);M.create(nrows,ncols,type);例子:MatM(7/7,CV-32FC2,Scalar(l/3);M.crea

13、te(100,60zCV_8UC(15);intsz=100,100,100;MatbigCubesz,CV_8U,Scalar:all(0);doublem3=a,b,c,d,ezf,g,hzi;MatM=Mat(3z3,CV_64F,m).inv();Matimg(Size(320,240),CV_8UC3);Matimg(height,width,CV_8UC3,pixels,step);Ipllmage*img=cvLoadlmage(,greatwave.jpg,/1);Matmtx(img,0);/convertIpllmage*-Mat;访问Mat的数据元素:ViewCodeMa

14、tM;M.row(3)=M.row+M.row(5)*3;MatMl=M.col(l);M.col(7).copyTo(Ml);MatM;M.at(izj);M.at(uchar)(iJ);Vec3ibgrl=M.at(Vec3b)(i,j)Vec3sbgr2=M.at(Vec3s)(iJ)Vec3wbgr3=M.at(Vec3w)(i,j)doublesum=O.Of;for(introw=0;rowM.rows;row+)constdouble*Mi=M.ptr(row);for(intcol=0;colM.cols;col+)sum+=stdiimaxfMiU,0.);doublesum

15、=0;MatConstlteratorit=M.begin(),it_end=M.end();for(;it!=it_end;+it)sum+=std:max(*it,0.);Mat可进行Matlab风格的矩阵操作,如初始化的时候可以用initializers,zeros(),ones(),eye().除以上内容之外,Mat还有有3个重要的方法:ViewCodeMatmat=imread(constString*filename);/读取图像imshow(conststringframeName,InputArraymat);/显示图像imwrite(conststring&filename,

16、InputArrayimg);/储存图像CvMat,Mat,Ipllmage之间的互相转换ViewCodeIpllmage-CvMatCvMatmatheader;CvMat*mat=cvGetMat(img,&matheader);CvMat*mat=cvCreateMat(img-height,img-width,CV_64FC3);cvConvert(img,mat)Ipllmage-MatMat:Mat(constIpllmage*img,boolcopyData=false);例子:Ipllmage*ipllmg=cvLoadlmage(,greatwave.jpg,/1);Matm

17、tx(ipllmg);Mat-IpllmageMatMIpllmageiplimage=M;CvMat-MatMat:Mat(constCvMat*m,boolcopyData=false);Mat-CvMat例子(假设Mat类型的imgMat图像数据存在):CvMatcvMat=imgMat;/*Mat-CvMat,类似转换到Ipllmage,不复制数据只创建矩阵头一、Mat类型:矩阵类型,MatriXo在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。Mat有3个重要的方法:1、Matmat=imread(constString*fi

18、lename);读取图像2、imshow(conststringframeName,InputArraymat);显示图像3、imwrite(conststring&filename,InputArrayimg);储存图像Mat类型较CvMat与Ipllmage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与Ipllmage类型转化为Mat类型将人人减少计算时间花费。Mat-Ipllmage同样只是创建图像头,而没有复制数据。例:/假设Mat类型的imgMat图像数据存在Ipllmageplmg=Ipllmage(imgMat);Mat-CvMat与I

19、pllmage的转换类似,不复制数据,只创建矩阵头。例:/假设Mat类型的imgMat图像数据存在CvMatcvMat=imgMat;二、CvMat类型与Ipllmage类型:“图像”类型在openCV中,Mat类型与CvMat和Ipllmage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和Ipllmage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。补充:Ipllmage由CvMat派生,而CvMat由CvArr派生即CvArr-CvMat-IpllmageCvA

20、rr用作函数的参数,无论传入的是CvMat或Ipllmage,内部都是按CvMat处理。CvMatCvMat-IpllmageIpllmage*img=cvCreatelmage(cvGetSize(mat),8,l);cvGetlmage(matl,img);cvSavelmage(ricel.bmpzimg);CvMat-Mat与Ipllmage的转换类似,可以选择是否复制数据。Mat:Mat(constCvMat*mzboolcopyData=false);在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。但是,CvMat类型与我们在

21、线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:CvMat*cvCreatMat(introwsJntcols,inttype);这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。2pllmage在类型关系上,我们可以说Ipllmage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。Ipllmage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32

22、位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。Ipllmage的对图像的另一种优化是变量origin-原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左卞角。dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。Ipllmage类型的所有额外变量都是对“图像”的表示与计算能力的优化。Ipllmage-MatIpllmage*plmg=cvLoadlmage(lena.jpg);Matimg(plmg,0);/0是不複製影像,也就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论