本人小菜,哈哈哈
最近用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);