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

次に、MEMPOOL を「userdata」パラメーターに渡します。

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

これは、ライブラリがユーザー コールバックを提供する標準的な方法です。

于 2012-05-22T14:56:06.283 に答える