OpenCV的自定义内存分配器

4

是否可以为OpenCV 2.3.1设置自定义分配器?我已经创建了一个内存池,希望OpenCV使用该内存池来满足其需要。

如果可以的话,如何实现?

更新:

自上次回答以来,我进行了一些开发,但仍然存在一些问题。以下是我现在拥有的代码:

CvAllocFunc allocCV() 
{ 
     return (CvAllocFunc) MEMPOOL->POOLalloc(sz); 
}

CvFreeFunc deallocCV()
{
    return (CvFreeFunc) MEMPOOL->POOLfree(ptr);
}

...

cvSetMemoryManager(allocCV(),deallocCV(),data);

现在,我的问题是,我如何访问要分配和释放的数据的大小和指针?
刚刚发现:我正在使用的OpenCV版本(2.3.1)在使用cvSetMemoryManager时会出错。原因在于它的源代码中:
void cvSetMemoryManager( CvAllocFunc, CvFreeFunc, void * )
{
    CV_Error( -1, "Custom memory allocator is not supported" );
}

我对此感到非常失望。我猜我不能再使用自定义内存池与OpenCV了!
1个回答

1

直接从文档中获取

http://opencv.willowgarage.com/documentation/c/core_utility_and_system_functions_and_macros.html#setmemorymanager

使用

void cvSetMemoryManager(CvAllocFunc allocFunc=NULL, CvFreeFunc freeFunc=NULL, void* userdata=NULL)

函数。

你的代码

cvSetMemoryManager(allocCV(),deallocCV(),data);

是错误的。

看看会发生什么:你调用 allocCV 和 deallocCV 函数(它们返回一些指针,被静默转换为 cvAllocFunc)!

而这只是个开始。查看分配/释放语义的文档。你应该编写具有正确签名的 allocCV/deallocCV。

void* CV_CDECL allocCV(size_t size, void* userdata)
{
     return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLalloc(size);
}

int CV_CDECL deallocCV(void* pptr, void* userdata)
{
    return ((YourMemPoolTypeWhichIDoNotKnow*)userdata)->POOLfree(pptr);
}

然后将您的MEMPOOL传递到“userdata”参数中:

cvSetMemoryManager(&allocCV, &deallocCV, (void*)MEMPOOL);

这是图书馆提供用户回调的标准方式。


我已经尝试过了,但是无法使其工作。我不知道是我做错了什么,还是因为OpenCV的版本问题。我正在使用OpenCV 2.3.1,而该函数来自2.1,我没有找到适用于我的版本的等效函数。 - André
好的,我尝试了上面的方法,编译没有错误,但在运行时,当它尝试运行cvSetMemoryManager时,会抛出异常。类似于:0x7c...处的第一次机会异常:有什么想法吗? - André
有很多原因可能导致这种情况。你是在 DLL 中使用 OpenCV 吗?请检查 DLL 和你的项目是否具有相同的运行时库。 - Viktor Latypov
我正在进行的项目使用了OpenCV,并且运行良好,但是当我尝试执行cvSetMemoryManager时,它会抛出一个错误...不过,这可能是我的代码有问题。谢谢你的帮助。 - André
我正在查看2.4.2版本的代码,并发现cvSetMemoryManager()除了抛出字符串为“不支持自定义内存分配器”的异常之外,什么也没做。嗯...看起来维护者已经在2.x左右删除了这个功能。:( - Joonhwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接