1

コンピューター ビジョン アプリケーションに opencv c++ API を使用し、cv::Mat 構造で行列を管理します。Opencv は参照カウントを使用して、作成されたオブジェクトを cv::Mat として解放します。より具体的な機械学習アルゴリズムには libshogun も使用します。Shogun には、SGMatrix と呼ばれる独自の行列構造があります。次のように cv::Mat から SGMatrix を初期化します。

cv::Mat cvmat(100,100,CV_32FC1,cv::Scalar(0.0)); 
SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols);

私の問題は、shogun lib で次のような別のオブジェクトを使用する場合です。

CSimpleFeatures<float>* features = new CSimpleFeatures<float>(sgmatrix);

ここで、shogun は で作成されたマトリックスを所有することになっていますが、実行時に、 shogun によって既にリリースされているものをfeaturesopencv がリリースしようとすると、エラーが発生します。cvmatどうすればこれを処理できますか? マトリックスを複製したくありません。

4

2 に答える 2

3

Shogun は、SGMatrix と simplefeature オブジェクトが破棄されるとすぐに行列の割り当てを解除します。その使用を避けるために

SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols, false);

このようにして、メモリの解放を処理する必要があります!

于 2012-12-06T16:33:58.747 に答える
2

Shogun または new / malloc を使用して、OpenCV の外部で行列の内部にメモリを割り当てます。void*次に、 (以前に割り当てた) 行列データへのポインターを引数として受け取るコンストラクターの 1 つを使用して、行列を作成します。これにより、データの opencv ヘッダーのみが作成されます。

そうすれば、opencv はマトリックス内のデータを所有していないことを認識し、cv::Matオブジェクトが解放されたときにそれを解放しようとしません。

于 2012-04-27T14:33:39.937 に答える