你如何删除OpenCV中的cvseq?

时间:2011-05-10 14:04:51

标签: c++ c opencv

Bradski声明“如果要删除序列,可以使用cvClearSeq(),这是一个清除序列中所有元素的例程。”

但是,此函数不会将内存存储中已分配的块返回到存储或系统。

他说“如果你想为其他目的检索那个内存,你必须通过cvClearMemStore()清除内存存储”。

此功能似乎不存在:

error C3861: 'cvClearMemStore': identifier not found

在本书的勘误表中,它指出:“'cvClearMemStore'应该是'cvClearMemStorage'”但是这个函数需要一个指向CvMemStorage的指针,而不是CvSeq。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

我确信他的意思是cvClearMemStorage()

  

清除内存存储空间。这是唯一的方法(!!!)(除了cvRestoreMemStoragePos)      重用为存储分配的内存--cvClearSeq,cvClearSet ......      不要释放任何记忆。      子存储在清除时会将所有块返回给父级。

从标题中复制的文本:core / core_c.h

从错误中可以看出,您将错误的数据类型传递给此函数。 Check the docs 这些函数可以确切地知道如何调用它们。

我将尝试使用以下代码进行说明:

// 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 的使用。我发现this one非常有趣。帖子底部有源代码链接。

答案 1 :(得分:2)

看起来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个对象的存储空间

this页面上对此进行了很好的解释。