3

是否可以为 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 中使用自定义内存池了!

4

1 回答 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 的指针)!

而这仅仅是开始。有关 alloc/dealloc 语义,请参阅文档。您应该使用正确的签名编写 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);
}

然后在 'userdata' 参数中传递您的 MEMPOOL:

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

这是库提供用户回调的标准方式。

于 2012-05-22T14:56:06.283 回答