【OpenCV】基本数据类型、IplImage数据结构

(一)基本数据类型

OpenCV中有多种基本数据类型,虽然这些数据类型在C语言中不是基本类型,但结构都非常简单,在”OpenCV/cxcore/include“目录下的cxtypes.h文件下可以查看其详细定义。

(1)CvPoint

其中最简单的就是CvPoint。CvPoint是一个包含整型成员x,y的简单结构体。CvPoint有两个变体,就是CvPoint2D32f和CvPoint3D32f,两者都是浮点型。举个简单的例子:

CvPoint2D32f *center=cvPoint2D32f(src->width/4,src->height/2);

(2)CvSize

CvSize类型与CvPoint非常相似,但它的数据成员是整型的width和weight,如果希望使用浮点类型,可以选用CvSize的变体类型CvSize2D32f。举个简单的例子:

CvSize *p=cvSize(width,height);

(3)CvScalar

CvScalar类型非常重要,它包含4个整型,在很多时候我们都要用到这个数据类型,当内存不是问题时,CvScalar经常用来代替1,2或者3个实数成员。CvScalar有一个单独的成员val,它是个指向4个双精度浮点数数组的指针。

所有这些数据类型具有以其名称来定义的构造函数,例如cvSize(),cvScalar(),cvPoint2D32f()等等,注意它与数据类型名称的微小区别。这些构造函数都非常有用,因为这样不仅使代码更容易编写,而且更易于阅读。

下面给出个总结表格,这样看起来更清楚点:

这里写图片描述

(二) IplImage数据结构

其实这里,我本来想在讨论完矩阵之后再来讨论这部分内容的,但是估计矩阵的讨论要占很大的篇幅,准备在接下来的那篇博文里另作讨论。从本质上讲,IplImage是一个CvMat对象,但它还有其他一些成员变量将矩阵解释为图像。下面是IplImage的结构:

typedef struct_IplImage{
    int             nSize;
    int             ID;
    int             nChannel;
    int             alphaChannel;
    int             depth;
    char            colorModel[4];
    char            channelSeq[4];
    int             dataOrder;
    int             origin;
    int             align;
    int             width;
    int             height;
    struct_IplROI*  roi;
    struct_IplImage*  maskROI;
    void*           imageId;
    struct _IplTileInfo*   tileInfo;
    int              imageSize;
    char*            imageData;
    int              widthStep;
    int              BorderMode[4];
    int              BorderConst[4];
    char*            imageDataOrigin;   
}IplImage;

关于上述的那些变量有些很重要,有些则显得并不那么重要。下面我们就从其中挑选些重要的进行讨论。

在上述的变量中,其中最为重要的是width和height,其次是depth和nchannels,这些变量参数经常要用到和被访问。在图像中,我们将往往将深度和通道数分开处理,而在矩阵中,我们往往同时表示它们。可用的深度值如下表所示:

这里写图片描述

通道数nchannels可以取值1,2,3,4

随后两个重要成员是origin和dataOrder。origin变量可以有两种取值:IPL_ORIGIN_TL或者是IPL_ORIGIN_BL,分别设置坐标原点的位置于图像的左上角或者左下角。在计算机视觉领域中,一个重要的错误来源就是原点位置的定义不统一。

dataOrder的取值可以是IPL_DATA_ORDER_PIXEL或者是IPL_DATA_ORDER_PLANE,前者指明数据是将像素点不同通道的值交错排列在一起,后者是将所有像素同通道值排在一起,形成通道平面,再把平面排列起来。

最后一个实用的参数是ROI,ROI的思想是:一旦设定ROI,通常作用于整幅图像的函数便会只对ROI所表示的子图像进行操作。如果IplImage变量中设置了ROI,则所有的OpenCV函数就会使用该ROI变量。

若要去访问图像中的数据,我们可以采用指针的方式去遍历图像,比如src->width或者是src->height(注:src是IplImage类型的指针)。

在接下来的博文里,我们将重点来讨论图像中的涉及到的矩阵问题。这有一篇很好的博文,对OpenCV中涉及到的IplImage等介绍的很详细,方便大家查询,链接如下:

http://blog.csdn.net/gubenpeiyuan/article/details/8776542

发布了35 篇原创文章 · 获赞 41 · 访问量 39万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览