aihot  2017-05-11 06:33:40  OpenCV |   查看评论   

 opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换。

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 

intnSize; 
intID; 
intnChannels; 
intalphaChannel; 
intdepth; 

charcolorModel[4]; 
charchannelSeq[4]; 
intdataOrder; 
intorigin; 
intalign; 

intwidth; 
intheight; 

struct_IplROI *roi; 
struct_IplImage *maskROI; 
void*imageId; 
struct_IplTileInfo *tileInfo; 

intimageSize; 
char*imageData; 
intwidthStep; 
intBorderMode[4]; 
intBorderConst[4]; 

char*imageDataOrigin; 
} IplImage;
dataOrder中的两个取值:交叉存取颜色通道是颜色数据排列将会是BGRBGR...的交错排列。分开的颜色通道是有几个颜色通道就分几个颜色平面存储。roi是IplROI结构体,该结构体包含了xOffset,yOffset,height,width,coi成员变量,其中xOffset,yOffset是x,y坐标,coi代表channel of interest(感兴趣的通道),非0的时候才有效。访问图像中的数据元素,分间接存储和直接存储,当图像元素为浮点型时,(uchar *) 改为 (float *): 
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(introw = 0; row < img->height; row++)
{
for(intcol = 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(introw = 0; row < img->height; row++)
{
for(intcol = 0; col < img->width; col++)
{
b = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 0]; 
g = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 1]; 
r = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 2];
}
}
 初始化使用IplImage *,是一个指向结构体IplImage的指针: 
IplImage * cvLoadImage(constchar* filename, int//load images from specified image 
IplImage * cvCreateImage(CvSize size, intdepth, intchannels); //allocate memory

2.CvMat

首先,我们需要知道,第一,在OpenCV中没有向量(vector)结构。任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行矩阵)。第二,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更抽象,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值。CvMat 的结构: 

typedef structCvMat 

inttype; 
intstep; 
int* refcount; 
union {
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; 
union {
introws;
intheight;
};
union {
intcols; 
intwidth;
};
} CvMat; 

 创建CvMat数据: 

View Code
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换。

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