OpenCV中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源中会常见。
1. IplImage
opencv中的图像信息头,该结构体定义:
{
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;
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 * cvCreateImage(CvSize size, intdepth, intchannels); //allocate memory
2.CvMat
首先,我们需要知道,第一,在OpenCV中没有向量(vector)结构。任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行矩阵)。第二,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更抽象,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值。CvMat 的结构:
{
inttype;
intstep;
int* refcount;
union {
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
union {
introws;
intheight;
};
union {
intcols;
intwidth;
};
} CvMat;
创建CvMat数据:
除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换。