1.1OpenCV基本数据类型
最简单的数据类型就是Cvpoint结构体,它包含了整型的两个成员x,y。CvPoint2D32f和CvPoint3D32f是它的两个变体类型,它们都是浮点型。前者是指二维空间中的点,包含x,y成员;后者是指三维空间中的点,包含x,y,z三个成员。
CvSize与CvPoint很相似,但它的数据成员是整型的width和height,类似的,如果要用浮点型,则有变体类型CvSize2D32f。它常用来表示图像的尺寸。
CvRect类型派生于CvPoint和CvSize,是一个复合类型。包含x,y,width,height,表示图像的部分区域。
CvScalar类型包含四个整型成员,有一个单独的成员val,它是一个指向4个双精度浮点数数组的指针。
1.2矩阵和图像类型
图像中的每个像素都可一看成一个点,一幅图像在计算机的眼中便是一个矩阵。
首先应明白图像类中的派生关系:CvArr--->CvMat--->IplImage。
1.2.1CvMat矩阵结构
一个用于新建一个二维矩阵的例程具有以下原型:
cvMat* cvCreateMat(int rows,int cols,int type);
矩阵的创建有多种方法,做常见的使用cvCreateMat()。
矩阵数据的存取:一般有三种方法。
1)简单的方法。使用宏CV_MAT_ELEM(),返回提取出的元素的值。
CvMat* mat=cvCreateMat(5,5,CV_32FC1);
float element_3_2=CV_MAT_ELEM(*mat,float,3,2);
与之类似的有个宏CV_MAT_ELEM_PTR(),但是返回的是这个元素的指针。
2)麻烦的方法。使用cvPtr*D家族:cvPtr1D(),cvPtr2D(),cvPtr3D()···cvPtrND()。可接受CvArr*型的矩 指针参数,紧随其后的参数表示索引的整数值。
3)恰当的方法。很多时候,计算机视觉是一种运算密集型的任务,而使用函数接口往往不是最高效的办法
最好的办法就是定义自己的指针计算并且在矩阵中利用自己的方法。由于数据是按光栅扫描顺序存储的。
通道相互交错,所以对一个多通道矩阵,它们变化的速度仍然比较快。
1.2.2Ipllmage数据结构
它是一个CvMat对象。
typedef struct _IplImage
{
int nSize; /* IplImage大小 */
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel; /* 被OpenCV忽略 */
int depth; /* 像素的位深度,主要有以下支持格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S,
IPL_DEPTH_32F 和IPL_DEPTH_64F */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.只有cvCreateImage可以创建交叉存取图像 */
int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/
int BorderConst[4]; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
} IplImage;
其中比较重要的参数有,width, height, origin, dataOrder, ROI。
ROI是个很实用的参数。