¿Cómo se elimina un cvseq en OpenCV?

Bradski afirma que "cuando desee eliminar una secuencia, puede utilizar cvClearSeq (), una rutina que borra todos los elementos de la secuencia".

SIN EMBARGO, esta función no devuelve los bloques asignados en el almacén de memoria ni al almacén ni al sistema.

Él dice que "Si desea recuperar esa memoria para algún otro propósito, debe borrar el almacenamiento de memoria a través de cvClearMemStore ()".

Esta función no parece existir:

error C3861: 'cvClearMemStore': identifier not found

En la errata del libro, establece que: "'cvClearMemStore' debería ser 'cvClearMemStorage'" pero esta función espera un puntero a CvMemStorage, no a CvSeq.

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

¿Alguna idea?

preguntado el 10 de mayo de 11 a las 14:05

2 Respuestas

Estoy convencido de que quiso decir cvClearMemStorage():

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

Texto copiado del encabezado: core / core_c.h

Como puede deducir del error, está pasando el tipo de datos incorrecto a esta función. Revisa los documentos de estas funciones para saber exactamente cómo llamarlas.

Intentaré 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 que muestran el uso de cvSeq. encontré esta Bastante interesante. Hay un enlace al código fuente en la parte inferior de la publicación.

contestado el 10 de mayo de 11 a las 18:05

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

Dice sobre CvMemStorage:

El almacenamiento de memoria es una estructura de bajo nivel que se utiliza para almacenar estructuras de datos en crecimiento dinámico, como secuencias, contornos, gráficos, subdivisiones, etc.

Su estructura cvSeq contiene un puntero a un CVMemStorage para decirle 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;

Entonces necesitarías llamar CvClearMemStorage y pasar el puntero al CvMemStorage de tu cvSeq objetarlo, lo que borrará el almacenamiento para su CvSeq objeto.

Está muy bien explicado en este .

contestado el 10 de mayo de 11 a las 18:05

Gracias. Pensé tanto. Sin embargo, cuando llamo a cvClearMemStorage obtengo el siguiente problema: stackoverflow.com/questions/5930985/… - kylestephens

+1: ¡Gracias por la explicación! Entonces, CvSeq es solo una especie de faceta para acceder a los elementos correctos en mem stoware. - Valentin Heinitz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.