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