2010-07-29 7 views
5

OpenCV 최신 릴리스의 많은 기능에는 STL 컨테이너가 필요합니다. Matlab MEX 파일에서 문제를 해결하려고 할 때 문제가 발생합니다. 나는 Matlab에서 MEX 파일을 컴파일 중이다. OpenCV와 Matlab은 코드 생성을 위해 "다중 스레드 DLL"인 "/ MD"플래그를 사용합니다.OpenCV, Matlab 및 STL 컨테이너

컴파일러 : MSVC++ 9.0 Matlab 2010a OpenCV 최신 SVN, 2.11이라고 생각합니다.

내가 사용하고있는 코드는 매우 간단하다 : 이것은 컴파일

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

하지만 충돌이 matlab에 MEX 파일에서 실행할 때. 크래시는 vector :: resize의 OpenCV 내에 있습니다. 이전 인터페이스 (STL 컨테이너 없음)는 잘 작동하지만 더 이상 사용되지 않습니다. MATLAB과 OpenCV간에 STL 컨테이너를 어떻게 사용할 수 있습니까?

+0

입력이 무엇이든간에 충돌이 발생합니까? –

+0

네, 입력 내용이 무엇이든간에 충돌이있는 것 같습니다. – Petter

답변

1

오래 전에 나는 Matlab < -> VS interop에 문제가있었습니다. 그것은 몇 가지 마이크로 소프트 비주얼 C + + 런타임 라이브러리 불일치가있을 수 있습니다. 어떤 런타임 lib가 matlab에 필요하고 Visual Studio에 어떤 버전이 있는지 확인하십시오. 나는 Depends를 사용하여 내 프로그램에 대한 DLL 종속성을 얻은 것을 기억합니다. 충돌 후 (msdev 디버거를 첨부하여) 콜 스택을 확인하면 몇 가지 힌트를 얻을 수 있습니다.

오래 전 이었으므로 나는 내가 기억하는 것을 암시하고 있습니다. 벡터에서

+0

아직 Spy ++를 사용하지 않았습니다. 나는 단지 같은 컴파일러가 사용되고 동일한 스위치 (/ MD)가 통과되었음을 확인했다. 그러나 나는 그것들이 동일한 버전을 사용하기에 충분할 것이다. – Petter

+0

죄송합니다. Spy ++라고 말하면 실제로 Depends (Dependency walker)입니다. 이것을 확인하십시오 : http://msdn.microsoft.com/en-us/library/ms235265(VS.80).aspx –

+2

Matlab dll 또는 MS 런타임 DLL에서 디버거를 연결하여 충돌하는지 확인하십시오. . –

0

데이터는 여전히

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

당신을 제공해야 하나의 연속 블록으로 저장해야 할 데이터에 'C'스타일의 포인터는, 이러한

을 MATLAB에에 전달하려고도 참조 : How does the C++ STL vector template store its objects in the Visual Studio compiler implementation?

+0

당신은 내 문제를 오해했습니다. 문제는 Matlab에 데이터를 전달하지 않는다는 것입니다. 위의 코드가 충돌한다는 것이 사실입니다. – Petter

2

나는 지난 이틀 동안이 바로 그 문제로 싸웠다. 문제는 이것이다 :
libmex.dll (그리고 전체 matlab에)는 Microsoft.VC80.CRT 사용 (버전 = 8.0.50727.4053)
하지만 당신을 OpenCV가 Microsoft.VC90.CRT 사용 (버전 = 9.0.21022.8)

그래서 이전 버전의 VC (VS 2005 with SP1)를 사용하거나 회피 방법으로 gcc (MINGW)를 사용할 수 있습니다 (이 경우 완전히 다른 stl을 사용하므로 방해 할 수 없음).).
나는 후자를 만들었지 만 작동하고, 다음 버전의 Matlab (잘하면)에서 작동 할 것이다.

1

지난 몇 일간 비슷한 문제가 있었으며 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에서 사용하는 옵션을 변경하거나 MSVC로 mex 파일을 직접 작성하여이 문제를 해결할 수 있습니다. 상황에 영향을 미칠 수있는 옵션의 한 가지 예는 SECURE_SCL = 0입니다. MATLAB이 문제가되는 옵션을 찾는데 사용하는 옵션으로 테스트 프로그램을 작성한 다음 mex 파일을 빌드 할 때 해당 옵션을 제거해보십시오.

api의 제 3 자 컴파일 라이브러리에있는 stl 객체의 이러한 종류의 비 호환성 때문에 일반적으로 나쁜 생각입니다. MEX 옵션 그런 다음 MEX 파일을 컴파일 C:\Users\ThePit\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat

에서 파일에서 자신의 조언에 따라

, 내가 SECURE_SCL = 0 옵션을 제거, 지금 모든 매력처럼 작동 - 함수가 반환된다 올바른 데이터 및 분할 오류가 더 이상 발생하지 않습니다.

관련 문제