2012-05-22 70 views
2

是否可以爲OpenCV 2.3.1設置自定義分配器?我創建了一個內存池,我希望OpenCV使用它所需的池。用於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

從一文檔

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); 
} 

,然後通過你的內存池的「用戶數據」參數:

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

這是一個庫來提供用戶回調的標準方法。

+0

我已經嘗試過了,但是我無法啓動它。我不知道我是否做錯了什麼,或者是否因爲opencv的版本。我使用的是OpenCV 2.3.1,該功能來自2.1,我沒有找到與我的版本 –

+0

相同的內容然後發佈您的代碼。我們無法猜出什麼是錯的。 –

+0

我已更新我的問題。感謝您的時間和耐心 –