Bradski声明“如果要删除序列,可以使用cvClearSeq(),这是一个清除序列中所有元素的例程。”
但是,此函数不会将内存存储中已分配的块返回到存储或系统。
他说“如果你想为其他目的检索那个内存,你必须通过cvClearMemStore()清除内存存储”。
此功能似乎不存在:
error C3861: 'cvClearMemStore': identifier not found
在本书的勘误表中,它指出:“'cvClearMemStore'应该是'cvClearMemStorage'”但是这个函数需要一个指向CvMemStorage的指针,而不是CvSeq。
error C2664: 'cvClearMemStorage' : cannot convert parameter 1 from 'CvSeq *' to 'CvMemStorage *'
有什么想法吗?
答案 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页面上对此进行了很好的解释。