2013-11-04 2 views
5

Ich bin interessiert Kota Yamaguchi's mexopencv library auf meinem System mit den folgenden Spezifikationen in Verwendung:in OS X 10.9 mit Xcode 5 und Matlab R2013b Kompilieren mexopencv

  • OS X 10.9 (Mavericks)
  • Xcode 5
  • Matlab 2013B
  • OpenCV über MacPorts installiert/opt/local/include/{opencv, opencv2} und/opt/local/lib

I git klonte die letzte OpenCV-Revision mit dem Befehl auf der mexopencv-Website; Dies ist Version 084838d62a25fcb3eec9f610abf91b167bc6c2f5 von Sat Jul 20 05:18:37 2013 -0700.

Ich habe Matlab's mex -setup Befehl ausgeführt und dann von Mathworks implementiert, um Xcode 5 als meinen mex Compiler zu verwenden.

Ich habe Macports' pkg-config-Befehl an den Pfad mit dem Matlab Befehl setenv('PATH', [getenv('PATH') ':/opt/local/bin']);

Nun mxopencv.make ergibt die folgende Linker Fehlermeldung ausgeführt wird:

Undefined symbols for architecture x86_64: 
    "cv::merge(std::vector<cv::Mat, std::allocator<cv::Mat> > const&, cv::_OutputArray const&)", referenced from: 
     MxArray::toMat(int, bool) const in libMxArray.a(MxArray.o) 
    "cv::split(cv::Mat const&, std::vector<cv::Mat, std::allocator<cv::Mat> >&)", referenced from: 
     MxArray::MxArray(cv::Mat const&, mxClassID, bool) in libMxArray.a(MxArray.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

    mex: link of ' "+cv/CamShift.mexmaci64"' failed. 

make: *** [+cv/CamShift.mexmaci64] Error 255 

Ich bin nicht sicher, was an diesem Punkt zu tun. Ist es möglich, mexopencv auf meinem System zu bauen?

+0

Es gibt nichts in der Dokumentation für Mac. Aber wenn die make zu CamShift geht, bedeutet das, dass du alle anderen Dateien vorher kompilieren kannst? Haben Sie versucht, CamShift.cpp zu entfernen? – Vuwox

+0

Werfen Sie einen Blick auf [diese] (http://stackoverflow.com/questions/16078512/undefined-symbols-for-architecture-x86-64-error-when-linking-opencv-in-xcode) – Vuwox

+0

@AlexandreBizeau, wenn Ich entferne CamShift, ich bekomme nur die gleiche Fehlermeldung in der nächsten Datei, die Canny ist. Der andere Post, den Sie erwähnen, ist für den Aufbau von OpenCV in Xcode, nicht für die Verwendung von Matlabs Befehl mex zum Erstellen von mexopencv. –

Antwort

7

Ich habe endlich mein Problem herausgefunden, dessen Lösung zu anderen Problemen führte, die ich schließlich lösen konnte. Also hier ist eine komplette Schritt-für-Schritt-Prozedur von dem, was ich getan habe, um mexopencv an meinem System arbeiten zu lassen (einige Schritte werden von meiner ursprünglichen Frage wiederholt).

  1. Get mexopencv von http://www.cs.sunysb.edu/~kyamagu/mexopencv/
  2. die Mathworks workaround Umsetzung der Matlab mex Compiler die Arbeit mit Xcode 5
  3. Run mex -setup aus Matlab
  4. Ändern Sie die neu erstellte ~/.matlab/R2013b erhalten/mexopts.sh Datei wie folgt:

    1. Ersetzen Sie alle Verweise von "-lstdC++" mit "-lC++"
    2. Fügen Sie der CXXFLAGS-Variablen die folgenden Argumente hinzu: "-std = gnu ++ 11 -stdlib = libC++". Diese zwei Schritte stellen sicher, dass Sie C++ 11 anstelle von C++ 98 verwenden (dank this stack overflow post).
    3. Sie bereits alle Instanzen des Textes "10.7" mit "10.8" haben sollte
    4. Ändern Sie die Zeile

    MLIBS="-L$TMW_ROOT/bin/$Arch -lmx -lmex -lmat"

    zu

    MLIBS="$TMW_ROOT/bin/$Arch/libmx.dylib $TMW_ROOT/bin/$Arch/libmex.dylib $TMW_ROOT/bin/$Arch/libmat.dylib" 
    

    Dies ist aus einem früheren Schritt ersetzt stellt sicher, dass der Compiler in $TMW_ROOT/bin/$Arch nicht nach OpenCV-Bibliotheken sucht, was auf meinem System ergibt. Aus irgendeinem Grund, Bibliotheken aus einer älteren Version von OpenCV (2.4.2) kommen mit Matlab und leben in diesem Ordner (vielleicht kommen sie mit der Computer Vision System Toolbox).[Hinweis: dieser Schritt nicht notwendig sein]

  5. Erstellen Sie einen Ordner /Applications/MATLAB_R2013b.app/bin/maci64/libopencv und all die libopencv*.dylib Dateien aus /Applications/MATLAB_R2013b.app/bin/maci64 in diesen Ordner verschieben. Dies verhindert, dass der Linker diese ältere Version von OpenCV findet und versehentlich verknüpft.
  6. Fügen Sie den Befehl pkg-config von macports dem Matlab-Pfad mit dem Matlab-Befehl hinzu setenv('PATH', [getenv('PATH') ':/opt/local/bin']); Um zu vermeiden, dass Sie diesen Befehl jedes Mal eingeben, wenn Sie Matlab starten, können Sie dies Ihrer startup.m Datei hinzufügen. Meine lebt in ~/Documents/MATLAB/startup.m.
  7. Stellen Sie sicher, dass Sie mexopencv.make('clean', true); in Matlab laufen alle früheren mexopencv
  8. Run mexopencv.make in Matlab zu kompilieren versucht zu löschen fehlgeschlagen; es sollte funktionieren (mit einigen Warnungen) und in fünf Minuten oder so wirst du eine MEX kompilierte Version von OpenCV haben; Herzliche Glückwünsche! Aber du bist noch nicht fertig.

habe ich versucht, meine Installation von OpenCV aus mit einem einfachen Einzeiler Test:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

Als ich es an dieser Stelle zu laufen versuchte, bekam ich folgende Fehlermeldung:

>> imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])); 
Error using cv.Canny 
Invalid MEX-file '/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64': dlopen(/Users/dgolden/software/cpp/mexopencv/+cv/Canny.mexmaci64, 6): Library not loaded: 
/opt/local/lib/libtiff.5.dylib 
    Referenced from: /opt/local/lib/libopencv_highgui.2.4.dylib 
    Reason: Incompatible library version: libopencv_highgui.2.4.dylib requires version 8.0.0 or later, but libtiff.5.dylib provides version 6.0.0 

Das Problem ist, dass Matlab eine eigene Version einiger macports-installierter Bibliotheken hat, die in enthalten sind, die sich von denen in /opt/local/lib unterscheiden. Standardmäßig versucht Matlab, seine eigenen Versionen der Bibliotheken, die nicht die von OpenCV erwarteten Versionen sind, dynamisch zu verknüpfen, sodass das Programm nicht ausgeführt wird.

Die Lösung wird in der README.markdown Datei empfohlen, die mit mexopencv enthalten ist. Sie müssen Matlab mitteilen, dass Sie keine eigene Version der gemeinsam genutzten Bibliotheken verwenden und stattdessen die Versionen von /opt/local/lib verwenden sollen.

Sie können dies auf zwei Arten tun. Versuchen Sie zunächst, Ihr Programm auszuführen, und notieren Sie den Name der Bibliothek, die einen Fehler verursacht. Dann entweder:

  1. Suchen Sie die Bibliotheksdatei in /Applications/MATLAB_R2013b.app/bin/maci64 und benennen Sie sie um oder verschieben Sie sie. Z. B., benennen Sie /Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib zu /Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib.bak um. Dies kann unbeabsichtigte Konsequenzen haben, wenn andere Matlab-Funktionen von dieser Bibliothek abhängen. Sie sollten nichts anderes tun müssen, damit OpenCV in /opt/local/lib die richtige Bibliothek findet.
  2. Schließen Matlab und es von der Kommandozeile starten, indem zuerst die DYLD_INSERT_LIBRARIES Umgebungsvariable, wie:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

    In meinem Fall, nachdem ich das Problem mit libtiff.5.dylib gelöst, ich hatte auch ein Problem mit libfreetype.6.dylib, so fügte ich hinzu, dass auf die DYLD_INSERT_LIBRARIES Variable, wie:

    DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib /Applications/MATLAB_R2013b.app/bin/matlab &

Versuchen Sie dann, das Programm erneut auszuführen. Wenn Sie einen anderen Fehler in der Bibliotheksversion erhalten, wiederholen Sie die Schritte, und benennen Sie die Bibliotheken von oder verschieben Sie sie um oder fügen Sie der Variablen DYLD_INSERT_LIBRARIES die korrekten Bibliothekspfade hinzu. Irgendwann sollte es funktionieren!

Nachdem ich alle diese Schritte befolgt, konnte ich erfolgreich mein Matlab Befehl auszuführen:

imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100])) 

Lassen Sie mich wissen, ob diese Schritte getan oder nicht für Sie arbeiten, und ob ich irgendwelche Schritte übersprungen oder machte alles komplizierter als es sein musste.

Ich hoffe, das hilft jemandem! Ich verbrachte mehrere Tage damit, das Internet zu durchforsten und Kota zu stören, bis ich endlich die richtige Lösung gefunden hatte.

+0

Ich erhalte einen Fehler beim Ausführen von mexopencv.make; 'In einer Datei enthalten von src/MxArray.cpp: 6: include/MxArray.hpp: 14: 10: schwerwiegender Fehler: Datei 'opencv2/opencv.hpp' nicht gefunden #include" opencv2/opencv.hpp' Weitere Informationen über der Fehler hier: http://pastie.org/private/wstqunwnwqhfm547qxlkw – melwil

+0

Suchen ein bisschen nach dem Problem, ich fand https://github.com/kyamagu/mexopencv/issues/90.Running make von der Kommandozeile in der üblichen Weise scheint nach der Ausführung der Schritte 1 bis 5 für mich zu arbeiten. Wenn ich mich nicht melde, hat es für mich funktioniert. – melwil

Verwandte Themen