aihot  2017-05-18 01:46:51  图像处理 |   查看评论   

 IplImage, CvMat, Mat 的关系和相互转换


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

1. IplImage

opencv中的图像信息头,该结构体定义:  

View Code
typedef struct _IplImage  {  int nSize;  int ID;  int nChannels;  int alphaChannel; int depth;  char colorModel[4];  char channelSeq[4];  int dataOrder;  int origin;  int align; int width;  int height;  struct _IplROI *roi;  struct _IplImage *maskROI;  void *imageId; struct _IplTileInfo *tileInfo;  int imageSize;  char *imageData;  int widthStep; int BorderMode[4];  int BorderConst[4];  char *imageDataOrigin;  } IplImage;

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

View Code
IplImage* img=cvLoadImage("lena.jpg"1); CvScalar s;  s=cvGet2D(img,i,j);  cvSet2D(img,i,j,s);  IplImage* img; //malloc memory by cvLoadImage or cvCreateImage for(int row = 0; row < img->height; row++) { for (int col = 0; col < img->width; col++) { b = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 0);  g = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 1);  r = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 2); } } IplImage* img; //malloc memory by cvLoadImage or cvCreateImage uchar b, g, r; // 3 channels for(int row = 0; row < img->height; row++) {             
 1/8    1 2 3 4 5 6 下一页 尾页
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自IplImage, CvMat, Mat 的关系和相互转换

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]