Я наконец-то разобрался со своей проблемой, решение которой привело к другим проблемам, которые я в итоге смог решить. Итак, вот полная пошаговая процедура того, что я сделал, чтобы заставить mexopencv работать в моей системе (некоторые шаги будут повторяться из моего первоначального вопроса).
- Получите mexopencv с http://www.cs.sunysb.edu/~kyamagu/mexopencv/
- Реализуйте обходной путь Mathworks, чтобы заставить MEX-компилятор Matlab работать. с Xcode 5
- Запустите
mex -setup
из Matlab
Измените только что созданный файл ~/.matlab/R2013b/mexopts.sh следующим образом:
- Replace all references of "-lstdc++" with "-lc++"
- Добавьте следующие аргументы в переменную CXXFLAGS: "-std=gnu++11 -stdlib=libc++". Эти два шага гарантируют, что вы используете С++ 11 вместо С++ 98 (благодаря это сообщение о переполнении стека).
- Вы должны были уже заменить все экземпляры текста «10.7» на «10.8» из предыдущего шага.
- Изменить строку
MLIBS="-L$TMW_ROOT/bin/$Arch -lmx -lmex -lmat"
to
MLIBS="$TMW_ROOT/bin/$Arch/libmx.dylib $TMW_ROOT/bin/$Arch/libmex.dylib $TMW_ROOT/bin/$Arch/libmat.dylib"
Это гарантирует, что компилятор не будет искать библиотеки OpenCV в $TMW_ROOT/bin/$Arch
, что в моей системе оценивается как /Applications/MATLAB_R2013b.app/bin/maci64
. По какой-то причине библиотеки из более старой версии OpenCV (2.4.2) поставляются с Matlab и живут в этой папке (возможно, они поставляются с набором инструментов Computer Vision System Toolbox). [Примечание: этот шаг может не понадобиться]
- Создайте папку
/Applications/MATLAB_R2013b.app/bin/maci64/libopencv
и переместите все libopencv*.dylib
файлы из /Applications/MATLAB_R2013b.app/bin/maci64
в эту папку. Это не позволяет компоновщику найти и случайно связать эту старую версию OpenCV.
- Добавьте команду macports pkg-config в путь к Matlab с помощью команды Matlab
setenv('PATH', [getenv('PATH') ':/opt/local/bin']);
Чтобы не вводить эту команду каждый раз при запуске Matlab, вы можете добавить ее в свой файл startup.m
. Моя живет в ~/Documents/MATLAB/startup.m
.
- Убедитесь, что вы запустили
mexopencv.make('clean', true);
в Matlab, чтобы стереть все предыдущие неудачные попытки компиляции mexopencv.
- Запустите
mexopencv.make
в Matlab; он должен работать правильно (с некоторыми предупреждениями), и примерно через пять минут у вас будет MEX-скомпилированная версия OpenCV; поздравляю! Но вы еще не закончили.
Я попробовал свою установку OpenCV с помощью простого однострочного теста:
imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100]))
Когда я попытался запустить его в этот момент, я получил следующее сообщение об ошибке:
>> 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
Проблема в том, что у Matlab есть собственная версия некоторых установленных macports библиотек, содержащихся в /Applications/MATLAB_R2013b.app/bin/maci64
, которые отличаются от тех, что в /opt/local/lib
. По умолчанию Matlab пытается динамически связать свои собственные версии библиотек, которые не являются версиями, ожидаемыми OpenCV, поэтому программа не запускается.
Решение предлагается в файле README.markdown
, включенном в состав mexopencv. Вам нужно сообщить Matlab, чтобы он не использовал свою собственную версию разделяемых библиотек, а вместо этого использовал версии из /opt/local/lib
.
Вы можете сделать это одним из двух способов. Во-первых, попробуйте запустить вашу программу и обратите внимание на имя библиотеки, которая выдает ошибку. Затем либо:
- Найдите файл библиотеки в /Applications/MATLAB_R2013b.app/bin/maci64 и переименуйте или переместите его. Например, переименуйте
/Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib
в /Applications/MATLAB_R2013b.app/bin/maci64/libtiff.5.dylib.bak
. Это может иметь непредвиденные последствия, если другие функции Matlab зависят от этой библиотеки. Вам не нужно ничего делать, чтобы OpenCV нашел правильную библиотеку в /opt/local/lib
.
Закройте Matlab и запустите его из командной строки, сначала установив переменную среды DYLD_INSERT_LIBRARIES
, например:
DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib /Applications/MATLAB_R2013b.app/bin/matlab &
В моем случае, после того как я решил проблему с libtiff.5.dylib
, у меня также возникла проблема с libfreetype.6.dylib
, поэтому я добавил это в переменную DYLD_INSERT_LIBRARIES
, например:
DYLD_INSERT_LIBRARIES=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib /Applications/MATLAB_R2013b.app/bin/matlab &
Затем попробуйте снова запустить вашу программу. Если вы получили еще одну ошибку версии библиотеки, продолжайте повторять и либо переименовывать/перемещать библиотеки из /Applications/MATLAB_R2013b.app/bin/maci64
, либо добавлять правильные пути к библиотекам в переменную DYLD_INSERT_LIBRARIES
. В конце концов, это должно работать!
После того, как я выполнил все эти шаги, я смог успешно запустить свою команду Matlab:
imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100]))
Дайте мне знать, сработали ли эти шаги для вас или нет, и пропустил ли я какие-либо шаги или сделал что-то более сложным, чем должно было быть.
Я надеюсь, что это поможет кому-то! Я провел несколько дней, прочесывая Интернет и беспокоя Коту, чтобы, наконец, прийти к правильному решению.
person
Daniel Golden
schedule
05.11.2013