2010-07-29 17 views
5

Wiele funkcji w najnowszej wersji OpenCV wymaga użycia kontenerów STL. Występują problemy podczas próby użycia ich w pliku MEX programu Matlab. Kompiluję pliki MEX z poziomu Matlaba. Zarówno OpenCV, jak i Matlab używają flagi "/ MD", która jest "Multithreaded DLL" do generowania kodu.Kontenery OpenCV, Matlab i STL

Kompilator: MSVC++ 9.0 Matlab 2010a OpenCV najnowsze od SVN, 2.11 Myślę.

Kod używam jest bardzo prosta:

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

To kompiluje ale ulega awarii podczas uruchamiania w pliku Matlab MEX. Katastrofa znajduje się w OpenCV w wektorze :: resize. Stary interfejs (bez kontenerów STL) działa dobrze, ale jest przestarzały. Jak korzystać z kontenerów STL między Matlab a OpenCV?

+0

Czy zawiesza się niezależnie od danych wejściowych? –

+0

Tak, wydaje się, że zawiesza się bez względu na dane wejściowe. – Petter

Odpowiedz

1

Dawno temu miałem problemy z Matlabem < -> VS interop. Może to być jakaś rozbieżność biblioteki wykonawczej programu Microsoft Visual C++. Sprawdź, jakie biblioteki runtime są wymagane przez matlab i jaką wersję posiada twoje studio graficzne. Pamiętam użycie Depends, aby uzyskać zależność dll dla mojego programu. Sprawdź stos wywołań po awarii (dołączając swój debugger msdev) może dać ci kilka wskazówek.

To było dawno temu, więc po prostu dawałem wskazówki co pamiętam.

+0

Nie użyłem jeszcze Spy ++. Właśnie upewniłem się, że ten sam kompilator został użyty i że te same przełączniki (/ MD) zostały przekazane, co jednak wystarczyłoby, aby używały tej samej wersji. – Petter

+0

Przepraszam, że powiedziałem, że Spy ++ to tak naprawdę Depends (Dependency walker). Sprawdź to: http://msdn.microsoft.com/en-us/library/ms235265(VS.80).aspx –

+2

Sprawdź, czy ulegnie awarii wewnątrz biblioteki DLL Matlab lub w bibliotece MS Runtime (po podłączeniu debuggera) . –

0

Dane w wektorze powinna nadal być przechowywane jako pojedynczy ciągły blok

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

powinno dać „C” wskaźniki styl do danych, spróbuj przekazując je do matlab

zobacz także: How does the C++ STL vector template store its objects in the Visual Studio compiler implementation?

+0

Źle zrozumiałeś mój problem. Problemem nie jest przekazywanie danych do Matlaba. To fakt, że powyższy kod ulega awarii. – Petter

2

Walczyłem z tym problemem w ciągu ostatnich dwóch dni. Problem jest następujący:
libmex.dll (i cały Matlab) wykorzystuje Microsoft.VC80.CRT (wersja = 8.0.50727.4053)
Ale twój OpenCV wykorzystuje Microsoft.VC90.CRT (wersja = 9.0.21022.8)

Możesz więc użyć poprzedniej wersji VC (VS 2005 z dodatkiem SP1, o ile wiem), lub jako obejście, możesz użyć gcc (MINGW) (w tym przypadku używają zupełnie innego stla, więc nie mogą ingerować).
Zrobiłem to drugie i działa, i będzie działać z kolejnymi wersjami Matlab (mam nadzieję).

1

Miałem podobny problem w ciągu ostatnich kilku dni i udało mi się rozwiązać ten problem z pomocą przyjaznych ludzi z MathWorks.

Z oryginalnego wpisu w http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error:

Prawdopodobnie widząc niezgodność pomiędzy biblioteką stl i opcji kompilatora lub wykorzystywanych przez prekompilowany dll i te używane przez MATLAB i polecenia MEX. MATLAB 2009b został zbudowany z MSVC 2005.

Możesz być w stanie rozwiązać problem, zmieniając opcje używane przez mex lub budując swój plik mex bezpośrednio z MSVC. Przykładem opcji, która może mieć wpływ na rzeczy, jest SECURE_SCL = 0. Zacznę od zbudowania programu testowego z opcjami, których MATLAB używa do znalezienia problematycznej opcji, a następnie spróbuj usunąć tę opcję podczas budowania pliku mex.

Z powodu tego rodzaju niezgodności korzystanie z obiektów STL w api skompilowanych bibliotek stron trzecich jest zazwyczaj złym pomysłem.

Po jego rad, usunąłem opcję SECURE_SCL = 0 z pliku MEX opcje na

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

Następnie zrekompilowane plik mex, teraz wszystko działa jak czar - funkcja jest zwrócenie poprawny błąd danych i segmentacji już nie występuje.