2011-01-18 30 views
6

Estoy un poco perdido en los documentos de OpenCV, me gustaría guardar CvSeq devuelto por cvFindContours a una matriz, por lo que entiendo que devolverá una secuencia de CvContour s pero no pude encontrar lo que contiene? ¿Qué partes de él debería guardar para más tarde? Puedo más tarde puedo iterar a través de él y decir call cvBoundingRect etc.Guardar CvSeq en una matriz

Respuesta

8

Un CvContour es una estructura con los mismos campos que un CvSeq, más algunos otros, el más importante de que es un rectificador CvRect (vea include/opencv/cxtypes.h). Entonces realmente se reduce a lo que es un CvSeq.

Hay un archivo llamado opencv.pdf que viene con las fuentes OpenCV, y en la p. 138 (para OpenCV 2.1) se dice que CvSeq se define como sigue:

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

Digamos que se llama cvFindContours así:

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

, donde contours estará apuntando al primer contorno después de llamar cvFindContours . Si desea obtener su rectángulo delimitador, simplemente páselo al cvBoundingRect. Se puede acceder al siguiente contorno de la secuencia a través del contours->h_next. En el caso de los árboles de contorno, es decir, cuando un contorno puede estar dentro de otro contorno en la imagen, puede acceder al primer contorno interno del contorno actual a través del contours->v_next. El siguiente contorno interno, si existe, sería contours->v_next->h_next, y así sucesivamente.

Si desea convertir una secuencia en una matriz, puede usar cvCvtSeqToArray.

También puede utilizar la interfaz C++ a partir de OpenCV 2.0 que parece ser más agradable de usar. Por ejemplo, el parámetro CvSeq** contours a cvFindContours se convierte en vector<vector<Point> >& contours.

Cuestiones relacionadas