OpenCV基础学习篇(二)


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值