2012-04-27 2 views
1

Я использую opencv C++ API для приложения для компьютерного зрения, и я управляю матрицами cv :: Mat структурой. Opencv использует ref counting для освобождения созданного объекта как cv :: Mat. Я использую также libshogun для более конкретных алгоритмов машинного обучения. Сёгун имеет собственную структуру матриц SGMatrix. инициализирую SGMatrix от сорта :: Mat так:Матрица (dis) allocation

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 или коррупция (out): 0x0000000000a2f1c0 *** ======= Backtrace: ======== = /usr/local/lib/libshogun.so.12 – Eric

ответ

2

Выделите память для внутренней части матрицы вне OpenCV либо с помощью Shogun, либо с помощью нового/malloc. Затем создайте матрицу, используя один из конструкторов, который принимает в качестве аргумента указатель void* на данные матрицы (которые вы выделили ранее). Это создает только заголовок opencv для ваших данных.

Таким образом, opencv знает, что у него нет данных внутри матрицы, и он не будет пытаться освободить его, когда объект cv::Mat будет выпущен.

+0

Ошибка возникает из сёгуна. Но я вижу вашу точку зрения. – Eric

+0

Ну, у вас есть 2 проблемы (1 ложное освобождение в сёгуне, 1 для «как предотвратить opencv от выпуска моих полезных данных»). У меня есть ответ на проблему №2, все еще нужно найти для # 1 ... Может быть, сёгун изменяет данные за вашей спиной или стирает некоторые поля opencv в заголовке, а opencv затем указывает, что что-то идет не так. – sansuiso

3

Сёгун будет деблокировать матрицу, как только SGMatrix и простой объект будут уничтожены. Во избежание использования

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

Таким образом, вам необходимо позаботиться об освобождении памяти!