如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV——CvSeq动态结构序列

大图像的 OpenCV CvSeq 递归元素访问失败?

OpenCV 序列——如何创建点对序列?

Opencv的cvDilate函数

新手求助,如何用OpenCV去除小块的分散区域

新手求助,如何用OpenCV去除小块的分散区域