Компиляция mexopencv в OS X 10.9 с Xcode 5 и Matlab R2013b

Я заинтересован в использовании библиотеки mexopencv Кота Ямагучи со следующими характеристиками :

  • ОС Х 10.9 (Маверикс)
  • Xкод 5
  • Матлаб 2013b
  • OpenCV установлен через macports в /opt/local/include/{opencv,opencv2} и /opt/local/lib

Я клонировал последнюю версию OpenCV, используя команду на веб-сайте mexopencv; это версия 084838d62a25fcb3eec9f610abf91b167bc6c2f5 от сб 20 июля 05:18:37 2013 -0700.

Я запустил команду Matlab mex -setup, а затем применил этот обходной путь от Mathworks. использовать Xcode 5 в качестве компилятора mex.

Я добавил команду macports pkg-config в путь с командой Matlab setenv('PATH', [getenv('PATH') ':/opt/local/bin']);

Теперь при запуске mxopencv.make появляется следующее сообщение об ошибке компоновщика:

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

Я не уверен, что делать в этот момент. Можно ли собрать mexopencv в моей системе?


person Daniel Golden    schedule 04.11.2013    source источник
comment
В документации для Mac ничего нет. Но если make переходит в CamShift, это означает, что вы можете скомпилировать все остальные файлы раньше? Вы пытались удалить CamShift.cpp?   -  person Vuwox    schedule 04.11.2013
comment
Взгляните на это   -  person Vuwox    schedule 04.11.2013
comment
@AlexandreBizeau, если я удалю CamShift, я просто получу то же сообщение об ошибке в следующем файле, то есть в Canny. Другой пост, о котором вы упоминаете, предназначен для создания OpenCV в Xcode, а не для использования команды mex Matlab для создания mexopencv.   -  person Daniel Golden    schedule 05.11.2013
comment
Я заметил, что если я буду следовать шагам Mathworks для сборки с использованием Xcode 5, который включает в себя изменение моей копии mexopts.sh, но вместо этого устанавливает цель OS X 10.9 вместо 10.8, я получаю гораздо больше ошибок. Так что, может быть, что-то в mexopencv было скомпилировано для OS X 10.7, что несовместимо с моей целью 10.8?   -  person Daniel Golden    schedule 05.11.2013
comment
Это моя точная проблема. Мы можем быть единственными людьми с этой проблемой. Интересно, позволит ли выполнение всех частей установки Matlab мне скомпилировать/связать привязки, включенные в репозиторий разработки openCV на gitHub.   -  person user3120885    schedule 20.12.2013


Ответы (1)


Я наконец-то разобрался со своей проблемой, решение которой привело к другим проблемам, которые я в итоге смог решить. Итак, вот полная пошаговая процедура того, что я сделал, чтобы заставить mexopencv работать в моей системе (некоторые шаги будут повторяться из моего первоначального вопроса).

  1. Получите mexopencv с http://www.cs.sunysb.edu/~kyamagu/mexopencv/
  2. Реализуйте обходной путь Mathworks, чтобы заставить MEX-компилятор Matlab работать. с Xcode 5
  3. Запустите mex -setup из Matlab
  4. Измените только что созданный файл ~/.matlab/R2013b/mexopts.sh следующим образом:

    1. Replace all references of "-lstdc++" with "-lc++"
    2. Добавьте следующие аргументы в переменную CXXFLAGS: "-std=gnu++11 -stdlib=libc++". Эти два шага гарантируют, что вы используете С++ 11 вместо С++ 98 (благодаря это сообщение о переполнении стека).
    3. Вы должны были уже заменить все экземпляры текста «10.7» на «10.8» из предыдущего шага.
    4. Изменить строку

    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). [Примечание: этот шаг может не понадобиться]

  5. Создайте папку /Applications/MATLAB_R2013b.app/bin/maci64/libopencv и переместите все libopencv*.dylib файлы из /Applications/MATLAB_R2013b.app/bin/maci64 в эту папку. Это не позволяет компоновщику найти и случайно связать эту старую версию OpenCV.
  6. Добавьте команду macports pkg-config в путь к Matlab с помощью команды Matlab setenv('PATH', [getenv('PATH') ':/opt/local/bin']); Чтобы не вводить эту команду каждый раз при запуске Matlab, вы можете добавить ее в свой файл startup.m. Моя живет в ~/Documents/MATLAB/startup.m.
  7. Убедитесь, что вы запустили mexopencv.make('clean', true); в Matlab, чтобы стереть все предыдущие неудачные попытки компиляции mexopencv.
  8. Запустите 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.

Вы можете сделать это одним из двух способов. Во-первых, попробуйте запустить вашу программу и обратите внимание на имя библиотеки, которая выдает ошибку. Затем либо:

  1. Найдите файл библиотеки в /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.
  2. Закройте 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
comment
Я получаю сообщение об ошибке при запуске mexopencv.make; In file included from src/MxArray.cpp:6: include/MxArray.hpp:14:10: fatal error: 'opencv2/opencv.hpp' file not found #include "opencv2/opencv.hpp Подробнее об ошибке здесь: pastie.org/private/wstqunwnwqhfm547qxlkw - person melwil; 12.02.2014