Как удалить cvseq в OpenCV? - PullRequest
5 голосов
/ 10 мая 2011

Брадски заявляет, что «Когда вы хотите удалить последовательность, вы можете использовать cvClearSeq (), процедуру, которая очищает все элементы последовательности.»

ОДНАКО, эта функция не возвращает выделенные блоки в хранилище памяти ни хранилищу, ни системе.

Он говорит, что «если вы хотите извлечь эту память для каких-то других целей, вы должны очистить хранилище памяти с помощью cvClearMemStore ()».

Эта функция не существует:

error C3861: 'cvClearMemStore': identifier not found

В сообщении о книге говорится, что: "cvClearMemStore" должно быть "cvClearMemStorage", но эта функция ожидает указатель на CvMemStorage, а не CvSeq.

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

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 10 мая 2011

Я убежден, что он имел в виду cvClearMemStorage():

Очищает память.Это единственный способ (!!!) (кроме cvRestoreMemStoragePos) повторно использовать память, выделенную для хранилища - cvClearSeq, cvClearSet ... не освобождать память.Дочернее хранилище возвращает все блоки к родительскому при очистке.

Текст, скопированный из заголовка: core / core_c.h

Как вы можете заметить из ошибки, выпередают неверный тип данных этой функции. Проверьте документы этих функций, чтобы точно знать, как их вызывать.

Я попытаюсь проиллюстрировать приведенный ниже код:

// 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);

Существует несколько учебных пособий, в которых показано использование cvSeq .Я нашел этот довольно интересным.Внизу поста есть ссылка на исходный код.

2 голосов
/ 10 мая 2011

Похоже, структура CVMemStorage используется в качестве базовой низкоуровневой структуры для создания пространства для хранения вещей.

Это говорит о CvMemStorage:

Память памяти низкого уровня структура, используемая для динамического хранения растущие структуры данных, такие как последовательности, контуры, графики, подразделения и т. д.

Ваш struct cvSeq содержит указатель на CVMemStorage, чтобы сообщить ему, где он хранится.

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

Так что вам нужно будет вызвать CvClearMemStorage и передать ему указатель на CvMemStorage вашего cvSeq объекта, что очистит хранилище для вашего CvSeq объекта.

Это действительно хорошо объяснено на этой странице.

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