CvContour - это структура с теми же полями, что и CvSeq, плюс несколько других, наиболее важным из которых является прямоугольник CvRect (см. Include / opencv / cxtypes.h).Так что все сводится к тому, что такое CvSeq.
Существует файл с именем opencv.pdf , который поставляется с исходными кодами OpenCV, и на стр.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
.
Вы также можете использовать интерфейс C ++, начиная с OpenCV 2.0, который, кажется, лучше использовать.Например, параметр CvSeq** contours
для cvFindContours
становится vector<vector<Point> >& contours
.