opencv中CvSeq的取点用法

来源:互联网 发布:护考软件排行 编辑:程序博客网 时间:2024/05/16 03:47

本人小菜,哈哈哈

最近用Opencv中的查找边缘函数:int cvFindContours(  CvArr* image, 

CvMemStorage* storage, 

CvSeq** first_contour,

int header_size=sizeof(CvContour),

int mode=CV_RETR_LIST,

int method=CV_CHAIN_APPROX_SIMPLE, 

CvPoint offset=cvPoint(0,0) ); 

学习了关于里面CvSeq结构的用法,CvSeq结构在Opencv中的源码如下面所示:

    #define CVgSEQUENCE\_FIELDS() \
    int flags; /* micsellaneous flags */ \
    int header_size; /* 序列头的大小 */ \
    struct CvSeq* h_prev; /* 前一个序列 */ \
    struct CvSeq* h_next; /* 后一个序列 */ \
    struct CvSeq* v_prev; /* 第二级前一个序列 */ \
    struct CvSeq* v_next; /* 第二级后一个序列 */ \

    #define CV_SEQUENCE_FIELDS()                                              \
    CV_TREE_NODE_FIELDS(CvSeq);                               

    int total; /* 元素的总个数 */ \
    int elem_size;/* 元素的尺寸 */ \
    char* block_max;/* 上一块的最大块 */ \
    char* ptr; /* 当前写指针 */ \
    int delta_elems; /*序列中快的大小
                        (序列粒度) */
 \
    CvMemStorage* storage; /*序列的存储位置 */ \
    CvSeqBlock* free_blocks; /* 未分配的块序列 */ \
    CvSeqBlock* first; /* 指向第一个快序列 */

    typedef struct CvSeq
  {
       CV_SEQUENCE_FIELDS()
  }
  CvSeq;

要取CvSeq结构体中的点可用:

CvPoint *pt1;

int num; /* 指向结构体CvSeq的序号 */

pt1 = (CvPoint*)cvGetSeqElem(cont, num);

于是,取CvSeq弧的两端点与中间点分别为:

cur_uint->Point1    = (CvPoint*)cvGetSeqElem(cont, 0);

cur_uint->Point2    = (CvPoint*)cvGetSeqElem(cont, total/2);
cur_uint->Point3    = (CvPoint*)cvGetSeqElem(cont, total);

1 0
原创粉丝点击