Сохранить CvSeq в массив - PullRequest
6 голосов
/ 18 января 2011

Я немного потерян в документах OpenCV, я хотел бы сохранить CvSeq, возвращенный cvFindContours, в массив, из того, что я понимаю, он вернет последовательность CvContour s, но я не смог найти, что в ней содержится? какие его части я должен сохранить в дальнейшем, позже я смогу выполнить итерацию и сказать вызов cvBoundingRect и т. д.

1 Ответ

8 голосов
/ 18 января 2011

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...