2012-04-27 5 views
1

私はコンピュータビジョンアプリケーションにopencv C++ APIを使用していますが、私はcv :: Mat構造で行列を管理しています。 Opencvはrefカウントを使って、作成されたオブジェクトをcv :: Matとして解放します。 私は、より具体的な機械学習アルゴリズムのためにlibshogunも使用しています。 Shogunには、SGMatrixという独自の行列構造があります。 私はCVからSGMatrixを初期化::マットを次のように:私はのような将軍のlibに別のオブジェクトを使用する場合マトリックス(dis)割り当て

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

私の問題がある:将軍が作成行列を所有することになりましたはずの

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

featuresで、実行時にopencvがshogunによってすでにリリースされたcvmatを解放しようとすると、エラーが発生します。 どうすれば対応できますか?私は行列をクローンしたくない。

+0

注:cvmatオブジェクトにrefを追加しようとしましたが、同じエラーが発生しました。ショーグンから、opencvからではありません。 *** glibcが見つかりました***/home/eric/dev /(...):ダブルフリーまたは破損(アウト):0x0000000000a2f1c0 *** =======バックトレース:======== = /usr/local/lib/libshogun.so.12 – Eric

答えて

2

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

そのようにして、opencvは行列内のデータを所有していないことを知り、cv::Matオブジェクトが解放されたときに解放しようとしません。

+0

エラーは将軍に由来します。しかし、私はあなたのポイントを見ます。 – Eric

+0

さて、あなたは実際に2つの問題を抱えています(shogunでは1つの偽の割り当て解除、1つは「opencvが私の有用なデータを解放するのを防ぐ方法」です)。私は問題#2の答えがまだ#1のために見つける必要がある...たぶんショーグンはあなたの背後にあるデータを変更している、またはヘッダーのいくつかのopencvフィールドを消去し、opencvは何かが間違っていることを識別します。 – sansuiso

3

ショーグンは、SGMatrixとsimplefeatureオブジェクトが破棄されるとすぐにマトリックスの割り当てを解除します。その使用を避けるには

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

このようにして、メモリの割り当てを解除する必要があります。