wordpress网站网页加密,网站免费站,企业网站建设工作流程,百度推广时间段在哪里设置转载自http://blog.csdn.net/wuxiaoyao12/article/details/7305848
一、Mat类型#xff1a;矩阵类型#xff0c;Matrix。 在openCV中#xff0c;Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。 Mat有3个重要的方法#xff1a; 1…转载自http://blog.csdn.net/wuxiaoyao12/article/details/7305848
一、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 copyDatafalse); 在openCV中没有向量vector的数据结构。任何时候但我们要表示向量时用矩阵数据表示即可。 但是CvMat类型与我们在线性代数课程上学的向量概念相比更抽象比如CvMat的元素数据类型并不仅限于基础数据类型比如下面创建一个二维数据矩阵 CvMat* cvCreatMat(int rows ,int cols , int type); 这里的type可以是任意的预定义数据类型比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。 2.IplImage 在类型关系上我们可以说IplImage类型继承自CvMat类型当然还包括其他的变量将之解析成图像数据。 IplImage类型较之CvMat多了很多参数比如depth和nChannels。在普通的矩阵类型当中通常深度和通道数被同时表示如用32位表示RGBAlpha.但是在图像处理中我们往往将深度与通道数分开处理这样做是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 法1CvMat mathdr, *mat cvGetMat( img, mathdr ); 法2CvMat *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。