将CvSeq保存到数组中

时间:2011-01-18 01:23:04

标签: opencv

我在OpenCV文档中有点迷失,我想将cvFindContours返回的CvSeq保存到一个数组中,从我的理解它将返回一个CvContour的seq但我找不到它包含的内容?它应该保存到哪个部分以后我可以稍后迭代它并说出调用cvBoundingRect等。

1 个答案:

答案 0 :(得分:8)

CvContour是一个与CvSeq具有相同字段的结构,还有一些其他字符串,其中最重要的是CvRect rect(请参阅include / opencv / cxtypes.h)。所以它真的归结为CvSeq是什么。

OpenCV源附带了一个名为 opencv.pdf 的文件,在p。 138(对于OpenCV 2.1)它表示CvSeq的定义如下:

#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;

假设您按照以下方式调用cvFindContours:

cvFindContours(img, storage, &contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

,其中contours在调用cvFindContours后将指向第一个轮廓。如果要获取其边界矩形,只需将其传递给cvBoundingRect即可。可以通过contours->h_next访问序列中的下一个轮廓。在轮廓树的情况下,也就是说,当轮廓可以在图像中的另一个轮廓内时,您可以通过contours->v_next访问当前轮廓的第一个内轮廓。下一个内部轮廓(如果存在)将为contours->v_next->h_next,依此类推。

如果要将序列转换为数组,可以使用cvCvtSeqToArray

您也可以使用从OpenCV 2.0开始的C ++接口,这似乎更好用。例如,CvSeq** contours的{​​{1}}参数变为cvFindContours