2010-07-29 12 views
5

Muchas funciones en la versión más reciente de OpenCV requieren el uso de contenedores STL. Me encuentro con problemas al tratar de usarlos en un archivo Matlab MEX. Estoy compilando los archivos MEX desde dentro de Matlab. Tanto OpenCV como Matlab utilizan el indicador "/ MD" que es "DLL multiproceso" para la generación de código.Contenedores OpenCV, Matlab y STL

Compilador: MSVC++ 9.0 Matlab 2010a OpenCV más reciente de SVN, 2.11 Creo.

El código que estoy utilizando es muy simple:

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

Esto compila pero se bloquea cuando se ejecuta en un archivo de Matlab MEX. El bloqueo está dentro de OpenCV en vector :: resize. La interfaz anterior (sin contenedores STL) funciona bien, pero está en desuso. ¿Cómo puedo usar contenedores STL entre Matlab y OpenCV?

+0

¿Se cuelga cualquiera que sea la entrada? –

+0

Sí, parece bloquearse cualquiera que sea la entrada. – Petter

Respuesta

1

Hace mucho tiempo tuve problemas con Matlab < -> VS interop. Puede tratarse de una discrepancia de biblioteca de Microsoft en tiempo de ejecución visual de C++. Compruebe qué tiempo de ejecución lib necesita Mathlab y qué versión tiene su estudio visual. Recuerdo usar Depends para obtener las dependencias dll para mi programa. Verifique su pila de llamadas después de bloquearse (al conectar su depurador de msdev) podría darle algunas pistas.

Fue hace mucho tiempo, así que solo estoy dando pistas de lo que recuerdo.

+0

No he usado Spy ++ todavía. Me aseguré de que se utilizara el mismo compilador y de que se aprobaran los mismos conmutadores (/ MD), lo que creo sería suficiente para que usen la misma versión. – Petter

+0

Lo siento, dije Spy ++ en realidad es Depends (Dependency walker). Mira esto: http://msdn.microsoft.com/en-us/library/ms235265(VS.80).aspx –

+2

Comprueba si se cuelga dentro de un dll de Matlab o dentro de un dll de tiempo de ejecución de MS (adjuntando tu depurador) . –

0

Los datos en un vector todavía deben ser almacenados como un único bloque contiguo

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

debe darle 'c' punteros de estilo a los datos, trate de pasar éstos a Matlab

ver también: How does the C++ STL vector template store its objects in the Visual Studio compiler implementation?

+0

Has entendido mal mi problema. El problema no es pasar datos a Matlab. Es el hecho de que el código anterior falla. – Petter

2

Luché con este problema en los últimos dos días. El problema es el siguiente:
libmex.dll (y toda una Matlab) utiliza Microsoft.VC80.CRT (version = 8.0.50727.4053)
Pero su OpenCV utiliza Microsoft.VC90.CRT (versión 9.0.21022.8 =)

Para que pueda usar la versión anterior de VC (VS 2005 con SP1 hasta donde yo sé), o como solución alternativa, puede usar gcc (MINGW) (en este caso usan stl totalmente diferente, por lo que no pueden interferir)
Hice lo último y funciona, y funcionará con las próximas versiones de Matlab (con suerte).

1

Tuve un problema similar en los últimos días y pude resolver el problema con la ayuda de los amigos de MathWorks.

Desde el post original en http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error:

Usted probablemente está viendo una incompatibilidad entre la biblioteca STL y compilador o las opciones utilizadas por el archivo DLL precompilado y las utilizadas por MATLAB y el comando MEX. MATLAB 2009b se creó con MSVC 2005.

Puede solucionar el problema cambiando las opciones utilizadas por mex o creando su archivo mex directamente con MSVC. Un ejemplo de una opción que puede afectar las cosas es SECURE_SCL = 0. Comenzaría construyendo su programa de prueba con las opciones que MATLAB está usando para encontrar la opción problemática y luego trataré de eliminar esa opción al compilar el archivo mex.

Debido a este tipo de incompatibilidad, el uso de objetos stl en las API de bibliotecas compiladas de terceros suele ser una mala idea.

Siguiendo su consejo, he eliminado la opción SECURE_SCL = 0 desde el archivo de opciones mex en

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

Luego vuelve a compilar el archivo mex, ahora todo funciona de maravilla - la función devuelve el los datos correctos y el error de segmentación ya no ocurren.

Cuestiones relacionadas