求助:关于不存在从IplImage转换到cv:Mat的适当构造函数

2025-05-13 19:38:07
推荐回答(1个)
回答1:

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

  1. IplImage

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

  3. 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