2011-05-10 12 views
5

Bradski afirma que "Cuando desee eliminar una secuencia, puede usar cvClearSeq(), una rutina que borra todos los elementos de la secuencia".¿Cómo se elimina un cvseq en OpenCV?

SIN EMBARGO, esta función no devuelve bloques asignados en el almacén de memoria a la tienda o al sistema.

Él dice que "Si desea recuperar esa memoria para otro fin, debe borrar el almacén de memoria a través de cvClearMemStore()".

Esta función no parece existir:

error C3861: 'cvClearMemStore': identifier not found 

En la fe de erratas para el libro, se afirma que: " 'cvClearMemStore' debe ser 'cvClearMemStorage'", pero esta función espera un puntero a CvMemStorage, no CvSeq.

error C2664: 'cvClearMemStorage' : cannot convert parameter 1 from 'CvSeq *' to 'CvMemStorage *' 

¿Alguna idea?

Respuesta

8

Estoy convencido de que quería decir cvClearMemStorage():

Borra la memoria de almacenamiento. Esta es la única forma (!!!) (además de cvRestoreMemStoragePos) de reutilizar la memoria asignada para el almacenamiento - cvClearSeq, cvClearSet ... no libere ninguna memoria. Un almacenamiento secundario devuelve todos los bloques al padre cuando se borra.

texto copiado de la cabecera: núcleo/core_c.h

Como se puede deducir a partir del error, está de paso del tipo de datos incorrecto para esta función. Check the docs de estas funciones para saber exactamente cómo llamarlas.

Voy a tratar de ilustrar con el siguiente código:

// Create variable to hold the memory allocated for calculations 
CvMemStorage* storage = 0; 

// Allocate the memory storage. Param 0 will set the block size to a default value - currently it is about 64K. 
storage = cvCreateMemStorage(0); 

IplImage* gray = NULL; 
// <insert code to load a gray image here> 

/* Retrieves contours from the binary image and returns the number of retrieved contours. 
* cvFindContours will scan through the image and store connected contours in "storage". 
* "contours" will point to the first contour detected. 
*/ 
CvSeq* contours = 0; 
cvFindContours(gray, storage, &contours); 

// Clear the memory storage which was used before 
cvClearMemStorage(storage); 

// Release memory 
cvReleaseMemStorage(&storage); 

Hay algunos tutoriales por ahí que muestra el uso de cvSeq. Encontré this one bastante interesante. Hay un enlace al código fuente en la parte inferior de la publicación.

2

Parece que la estructura CVMemStorage se utiliza como una estructura básica de bajo nivel para crear espacio para almacenar cosas.

que dice acerca de CvMemStorage:

almacenamiento de memoria es una estructura de bajo nivel utilizado para almacenar dynamicly crecientes estructuras de datos tales como secuencias, contornos, gráficos, subdivisiones, etc.

Su struct cvSeq contiene un puntero a CVMemStorage para indicarle dónde está almacenado.

#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 */ \ //HERE!!! pointer to storage 
    CvSeqBlock* free_blocks; /* free blocks list */ \ 
    CvSeqBlock* first; /* pointer to the first sequence block */ 

typedef struct CvSeq 
{ 
    CV_SEQUENCE_FIELDS() 
} CvSeq; 

Así que había necesidad de llamar CvClearMemStorage y pasar el puntero a la CvMemStorage de su objeto cvSeq a ella, que despejará el almacenamiento para su objeto CvSeq.

Está muy bien explicado en la página this.

+0

gracias. Pensé tanto. Sin embargo, cuando llamo a cvClearMemStorage consigo el siguiente problema: http://stackoverflow.com/questions/5930985/cvcreatememstorage-not-working-in-second-object-instance – kylestephens

+0

+1: ¡Gracias por la explicación! Entonces, CvSeq es solo un tipo de faceta para acceder a los elementos correctos en el servidor de memoria. –

Cuestiones relacionadas