OpenCV基础学习篇(二)

来源:互联网 发布:下载苹果版助赢软件 编辑:程序博客网 时间:2024/05/16 05:36


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是个很实用的参数。

0 0