2012-04-27 265 views
1

我使用opencv C++ API進行計算機視覺應用,並使用cv :: Mat結構管理矩陣。 Opencv使用引用計數將創建的對象釋放爲cv :: Mat。 我也使用libshogun更具體的機器學習算法。幕府將軍擁有自己的矩陣結構,稱爲SGMatrix。 我從CV初始化SGMatrix ::墊這樣的:矩陣(dis)分配

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

我的問題是,當我使用另一個對象在幕府LIB,如:

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

其中將軍現在應該自己創建的矩陣與features,我得到一個錯誤,在運行時,當opencv試圖釋放cvmat已被釋放由幕府將軍。 我該如何處理?我不想克隆我的矩陣。

+0

注意:我試圖將ref添加到cvmat對象,但得到了相同的錯誤。從幕府,而不是從opencv。 *** glibc檢測到***/home/eric/dev /(...):double free或corruption(out):0x0000000000a2f1c0 *** ======= Backtrace:======== = /usr/local/lib/libshogun.so.12 – Eric 2012-04-27 14:22:04

回答

2

爲OpenCV外部的矩陣內部分配內存,可以使用Shogun或new/malloc。然後,通過使用其中一個構造函數創建矩陣,該構造函數的參數爲​​指向矩陣數據(您之前分配的)的指針void*。這會爲您的數據創建一個opencv標頭。

這樣,opencv知道它不擁有矩陣內的數據,並且在發佈cv::Mat對象時不會嘗試釋放它。

+0

錯誤來自幕府將軍。但我明白你的觀點。 – Eric 2012-04-27 15:16:14

+0

嗯,你實際上有兩個問題(1個虛假的重新分配在幕府,1個「如何防止opencv釋放我的有用數據」)。我有問題2的答案,仍然需要找到#1 ......也許幕府將修改背後的數據,或者刪除標題中的一些opencv字段,然後opencv會識別出錯。 – sansuiso 2012-04-27 15:23:14

3

一旦SGMatrix和simplefeature對象被銷燬,幕府將立即取消分配矩陣。爲了避免使用

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

這樣你就必須照顧內存釋放!