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).
- Get mexopencv von http://www.cs.sunysb.edu/~kyamagu/mexopencv/
- die Mathworks workaround Umsetzung der Matlab mex Compiler die Arbeit mit Xcode 5
- Run
mex -setup
aus Matlab
Ändern Sie die neu erstellte ~/.matlab/R2013b erhalten/mexopts.sh Datei wie folgt:
- Ersetzen Sie alle Verweise von "-lstdC++" mit "-lC++"
- 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).
- Sie bereits alle Instanzen des Textes "10.7" mit "10.8" haben sollte
- Ä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]
- 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.
- 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
.
- Stellen Sie sicher, dass Sie
mexopencv.make('clean', true);
in Matlab laufen alle früheren mexopencv
- 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:
- 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.
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.
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
Werfen Sie einen Blick auf [diese] (http://stackoverflow.com/questions/16078512/undefined-symbols-for-architecture-x86-64-error-when-linking-opencv-in-xcode) – Vuwox
@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. –