zoukankan      html  css  js  c++  java
  • opencv数据结构总结

    OpenCV里面用到了很多图像相关的数据结构,熟练掌握它们是学习图像的基础。微笑

    1、IplImage

    IplImage

    IplImage 
    IPL 图像头 

    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 and IPL_DEPTH_64F 可支持 */
    char colorModel[4]; /* 被OpenCV忽略 */
    char channelSeq[4]; /* 同上 */
    int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
    cvCreateImage只能创建交叉存取图像 */
    int origin; /* 0 - 顶—左结构,
    1 - 底—左结构 (Windows bitmaps 风格) */
    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;
    IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集: 

    alphaChannel 在OpenCV中被忽略。 
    colorModel 和channelSeq 被OpenCV忽略。OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。
    dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。
    align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。 
    不支持maskROI 。处理MASK的函数把他当作一个分离的参数。MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。 
    tileInfo 不支持。 
    BorderMode和BorderConst是不支持的。每个 OpenCV 函数处理像素的邻近的像素,通常使用单一的固定代码边际模式。 
    除了上述限制,OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1)精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。

    2、CvMat

    CvMat

    CvMat 
    多通道矩阵 

    typedef struct CvMat
    {
    int type; /* CvMat 标识 (CV_MAT_MAGIC_VAL), 元素类型和标记 */
    int step; /* 以字节为单位的行数据长度*/
    int* refcount; /* 数据引用计数 */
    union
    {
    uchar* ptr;
    short* s;
    int* i;
    float* fl;
    double* db;
    } data; /* data 指针 */
    #ifdef __cplusplus
    union
    {
    int rows;
    int height;
    };
    union
    {
    int cols;
    int width;
    };
    #else
    int rows; /* 行数 */
    int cols; /* 列数*/
    #endif
    } CvMat;

    3、CvArr

    CvArr

    CvArr 
    不确定数组 

    typedef void CvArr;
    CvArr* 仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如 IplImage*, CvMat* 甚至 CvSeq*. 最终的数组类型是在运行时通过分析数组头的前4 个字节判断。

    4、CvPoint2D32f

    CvPoint2D32f

    CvPoint2D32f 
    二维坐标下的点,类型为浮点 

    typedef struct CvPoint2D32f
    {
    float x; /* X坐标, 通常以0为基点*/
    float y; /* Y坐标, 通常以0为基点*/
    }
    CvPoint2D32f;
    /* 构造函数 */
    inline CvPoint2D32f cvPoint2D32f( double x, double y );
    /* 从CvPoint转换来 */
    inline CvPoint2D32f cvPointTo32f( CvPoint point );

    5、CvPoint

    CvPoint

    CvPoint 
    二维坐标系下的点,类型为整型 

    typedef struct CvPoint
    {
    int x; /* X坐标, 通常以0为基点 */
    int y; /* y坐标, 通常以0为基点 */
    }
    CvPoint;
    /* 构造函数 */
    inline CvPoint cvPoint( int x, int y );
    /* 从 CvPoint2D32f类型转换得来 */
    inline CvPoint cvPointFrom32f( CvPoint2D32f point )

    6、CvRect

    CvRect

    CvRect 
    矩形框的偏移和大小 

    typedef struct CvRect
    {
    int x; /* 方形的最左角的x-坐标 */
    int y; /* 方形的最上或者最下角的y-坐标 */
    int width; /* 宽 */
    int height; /* 高 */
    }
    CvRect;
    /* 构造函数*/
    inline CvRect cvRect( int x, int y, int width, int height );

    7、CvHistogram

    CvHistogram

    CvHistogram
    多维直方图 

    typedef struct CvHistogram
    {
    int type;
    CvArr* bins;
    float thresh[CV_MAX_DIM][2]; /* for uniform histograms */
    float** thresh2; /* for non-uniform histograms */
    CvMatND mat; /* embedded matrix header for array histograms */
    }
    CvHistogram;

    8、CvMemStorage

    CvMemStorage
    Growing memory storage 

    typedef struct CvMemStorage
    {
    struct CvMemBlock* bottom;/* first allocated block */
    struct CvMemBlock* top; /* the current memory block - top of the stack */
    struct CvMemStorage* parent; /* borrows new blocks from */
    int block_size; /* block size */
    int free_space; /* free space in the top block (in bytes) */
    } CvMemStorage;
    内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型 ---bottom 域指的是列首,top 域指的是当前指向的块但未必是列尾.在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在 top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间 -- free_space 指的是top块剩馀的空字节数。

    新分配的内存缓冲区(或显式的通过 cvMemStorageAlloc 函数分配,或隐式的通过 cvSeqPush, cvGraphAddEdge等高级函数分配)总是起始于当前块(即top块)的剩馀那部分,如果剩馀那部分能满足要求(够分配的大小)。分配后,free_space 就减少了新分配的那部分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩馀空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被置为当前块(新的top块) -- free_space 被置为先前分配的整个块的大小。

    如果已经不存在空的存储块(即:top块已是列尾),则必须再分配一个新的块(或从parent那继承,见 cvCreateChildMemStorage)并将该块加到列尾上去。于是,存储器(memory storage)就如同栈(Stack)那样, bottom指向栈底,(top, free_space)对指向栈顶。栈顶可通过 cvSaveMemStoragePos保存,通过 cvRestoreMemStoragePos 恢复指向, 通过 cvClearStorage 重置。 

    9、CvSeq

    CvSeq
    可动态增长元素序列(OpenCV_1.0已发生改变,详见cxtypes.h) Growable sequence of elements 

    #define CV_SEQUENCE_FIELDS()
    int flags; /* micsellaneous flags */
    int header_size; /* size of sequence header */
    struct CvSeq* h_prev; /* previous sequence */
    struct CvSeq* h_next; /* next sequence */
    struct CvSeq* v_prev; /* 2nd previous sequence */
    struct CvSeq* v_next; /* 2nd next sequence */
    int total; /* total number of elements */
    int elem_size;/* size of sequence element in bytes */
    char* block_max;/* maximal bound of the last block */
    char* ptr; /* current write pointer */
    int delta_elems; /* how many elements allocated when the sequence grows (sequence granularity) */
    CvMemStorage* storage; /* where the seq is stored */
    CvSeqBlock* free_blocks; /* free blocks list */
    CvSeqBlock* first; /* pointer to the first sequence block */


    typedef struct CvSeq
    {
    CV_SEQUENCE_FIELDS()
    } CvSeq;
    结构CvSeq是所有OpenCV动态数据结构的基础。在1.0版本中,将前六个成员剥离出来定义成一个宏. 通过不同寻常的宏定义简化了带有附加参数的结构 CvSeq 的扩展。为了扩展 CvSeq, 用户可以定义一新的数据结构或在通过宏CV_SEQUENCE_FIELDS()所包括的 CvSeq 的域后在放入用户自定义的域。

    有两种类型的序列 -- 稠密序列和稀疏序列。稠密序列都派生自 CvSeq, 它们用来代表可扩展的一维数组 -- 向量,栈,队列,双端队列。数据间不存在空隙(即:连续存放)-- 如果元素从序列中间被删除或插入新的元素到序列中(不是两端),那么此元素后边的相关元素会被移动。稀疏序列都派生自 CvSet,后面会有详细的讨论。它们都是由节点所组成的序列,每一个节点要么被占用空间要么是空,由 flag 标志指定。这些序列作为无序的数据结构而被使用,如点集,图,哈希表等。

    域 header_size(结构的大小) 含有序列头部节点的实际大小,此大小大于或等于 sizeof(CvSeq).当这个宏用在序列中时,应该等于 sizeof(CvSeq),若这个宏用在其他结构中,如CvContour,结构的大小应该大于sizeof(CvSeq); 域 h_prev, h_next, v_prev, v_next 可用来创建不同序列的层次结构。域 h_prev, h_next 指向同一层次结构前一个和后一个序列,而域 v_prev, v_next指向在垂直方向上的前一个和后一个序列,即:父亲和子孙。

    域 first 指向第一个序列快,块结构在后面描述。 

    域 total 包含稠密序列的总元素数和稀疏序列被分配的节点数。 

    域 flags 的高16位描述(包含)特定的动态结构类型(CV_SEQ_MAGIC_VAL 表示稠密序列,CV_SET_MAGIC_VAL 表示稀疏序列),同时包含形形色色的信息。

    低 CV_SEQ_ELTYPE_BITS 位包含元素类型的 ID(标示符)。大多数处理函数并不会用到元素类型,而会用到存放在 elem_size 中的元素大小 。如果序列中包含 CvMat 中的数据,那么元素的类型就与 CvMat 中的类型相匹配, 如:CV_32SC2 可以被使用为由二维空间中的点序列, CV_32FC1用为由浮点数组成的序列等。通过宏 CV_SEQ_ELTYPE(seq_header_ptr) 来获取序列中元素的类型。处理数字序列的函数判断: elem.size 等同于序列元素的大小。除了与 CvMat 相兼容的类型外,还有几个在头 cvtypes.h 中定义的额外的类型。 

    10、CvBox2D

    CvBox2D
    旋转的二维盒子 

    typedef struct CvBox2D
    {
    CvPoint2D32f center; /* 盒子的中心 */
    CvSize2D32f size; /* 盒子的长和宽 */
    float angle; /* 水平轴与第一个边的夹角,用弧度表示*/
    }
    CvBox2D;

    11、CvConvexityDefect

    用来描述一个简单轮廓凸性缺陷的结构体

    typedef struct CvConvexityDefect
    {
        CvPoint* start; /* 缺陷开始的轮廓点 */
        CvPoint* end; /* 缺陷结束的轮廓点 */
        CvPoint* depth_point; /* 缺陷中距离凸形最远的轮廓点(谷底) */
        float depth; /* 谷底距离凸形的深度*/
    } CvConvexityDefect;
    

    Picture. 手部轮廓的凸形缺陷.

  • 相关阅读:
    Win32 开发
    Corners in C#
    swfupload在IE8下显示正常,但是单击添加按钮无反应
    Windows Script Host(WSH)
    研磨设计模式 之 中介者模式(Mediator)
    Pure GPU Computing Platform : NVIDIA CUDA Tutorial
    BattleField 2142引擎图形程序员小访谈
    利用SAH实现kD树快速分割模型实践
    给大家看一下德国的家居装潢技术,在装修房子的朋友可以欣赏一下
    Python与Microsoft Office自动化操作
  • 原文地址:https://www.cnblogs.com/wuyuankun/p/3596571.html
Copyright © 2011-2022 走看看