Контейнеры OpenCV, Matlab и STL - PullRequest
5 голосов
/ 29 июля 2010

Многие функции в последней версии OpenCV требуют использования контейнеров STL.Я сталкиваюсь с проблемами при попытке использовать их в файле Matlab MEX.Я компилирую MEX-файлы из Matlab.И OpenCV, и Matlab используют флаг "/ MD", который является "Многопоточным DLL" для генерации кода.

Компилятор: MSVC ++ 9.0 Matlab 2010a OpenCV последний из SVN, 2.11 Я думаю.Я использую очень просто:

vector<KeyPoint> keypoints_vec;
SurfFeatureDetector surf;
surf.detect(cvImg,keypoints_vec);

Это компилируется, но вылетает при запуске в файле Matlab MEX.Сбой находится в OpenCV в vector :: resize.Старый интерфейс (без контейнеров STL) работает нормально, но не рекомендуется.Как я могу использовать контейнеры STL между Matlab и OpenCV?

Ответы [ 4 ]

2 голосов
/ 09 марта 2011

Я боролся с этой самой проблемой в последние два дня. Проблема заключается в следующем:
libmex.dll (и весь Matlab) использует Microsoft.VC80.CRT (версия = 8.0.50727.4053)
Но ваш OpenCV использует Microsoft.VC90.CRT (версия = 9.0.21022.8)

Таким образом, вы можете использовать предыдущую версию VC (VS 2005 с SP1, насколько я знаю), или в качестве обходного пути, вы можете использовать gcc (MINGW) (в этом случае они используют совершенно разные stl, поэтому вмешиваться).
Я сделал последнее, и оно работает, и оно будет работать со следующими версиями Matlab (надеюсь).

1 голос
/ 14 июня 2011

У меня была похожая проблема в последние несколько дней, и я смог решить эту проблему с помощью дружественных людей из MathWorks.

Из оригинального сообщения на http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error:

Вы, вероятно, видите несовместимость между библиотекой stl и параметрами компилятора, используемыми вашей предварительно скомпилированной dll, и теми, которые используются MATLAB и командой MEX.MATLAB 2009b был создан с MSVC 2005.

Вы можете решить проблему, изменив параметры, используемые mex, или создав свой mex-файл напрямую с помощью MSVC.Одним из примеров опции, которая может влиять на вещи, является SECURE_SCL = 0.Я хотел бы начать с построения вашей тестовой программы с параметрами, которые использует MATLAB для поиска проблемного параметра, а затем попытаться удалить этот параметр при создании файла mex.

Из-за такого рода несовместимости использование объектов stl в API-интерфейсахсторонние скомпилированные библиотеки обычно плохая идея.

Следуя его совету, я удалил опцию SECURE_SCL = 0 из файла опций mex по адресу

C:\Users\ThePit\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat

Затем перекомпилировал mex файл, теперь все работает как чудо - функция возвращает правильные данные и ошибка сегментации больше не возникает.

1 голос
/ 29 июля 2010

Давным-давно у меня возникли проблемы с взаимодействием Matlab <-> VS.Это может быть какое-то несоответствие Microsoft Visual C ++ во время выполнения библиотеки.Проверьте, какая библиотека lib требует времени выполнения и какую версию имеет ваша визуальная студия.Я помню, как использовал Depends, чтобы получить зависимости dll для моей программы.Проверьте ваш стек вызовов после сбоя (подключив отладчик msdev), он может дать вам некоторые подсказки.

Это было давно, поэтому я просто даю подсказки о том, что я помню.

0 голосов
/ 29 июля 2010

Данные в векторе по-прежнему должны храниться в виде единого непрерывного блока.

std::vector<int> data;
int *array = &data[0]; 
int *array = &data.front(); 

Если вам нужно дать указатели в стиле 'c', попробуйте передать их в matlab

смтакже: Как векторный шаблон STL C ++ хранит свои объекты в реализации компилятора Visual Studio?

...