如何在 OpenCV 中删除 cvseq?
Posted
技术标签:
【中文标题】如何在 OpenCV 中删除 cvseq?【英文标题】:How do you delete a cvseq in OpenCV? 【发布时间】:2011-05-10 14:04:51 【问题描述】:Bradski 指出“当你想删除一个序列时,你可以使用 cvClearSeq(),一个清除序列中所有元素的例程。”
但是,此函数不会将内存存储中分配的块返回给存储或系统。
他说“如果你想为其他目的检索该内存,你必须通过 cvClearMemStore() 清除内存存储”。
这个函数似乎不存在:
error C3861: 'cvClearMemStore': identifier not found
在本书的勘误表中,它指出:“'cvClearMemStore' 应该是'cvClearMemStorage'”但是这个函数需要一个指向 CvMemStorage 的指针,而不是 CvSeq。
error C2664: 'cvClearMemStorage' : cannot convert parameter 1 from 'CvSeq *' to 'CvMemStorage *'
有什么想法吗?
【问题讨论】:
【参考方案1】:我确信他的意思是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 很有趣。文章底部有源代码链接。
【讨论】:
【参考方案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
并将指向 cvSeq
对象的 CvMemStorage
的指针传递给它,这将清除您的 CvSeq
对象的存储空间。
this 页面上的解释非常好。
【讨论】:
谢谢。我也是这么想的。但是,当我调用 cvClearMemStorage 时出现以下问题:***.com/questions/5930985/… +1:感谢您的解释!因此,CvSeq 只是访问 mem stoware 中正确元素的一种方面。以上是关于如何在 OpenCV 中删除 cvseq?的主要内容,如果未能解决你的问题,请参考以下文章