使用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv

Dan*_*den 5 matlab xcode opencv mex

我有兴趣在我的系统上使用Kota Yamaguchi的mexopencv库,其规格如下:

  • OS X 10.9(小牛队)
  • Xcode 5
  • Matlab 2013b
  • OpenCV通过macport安装到/ opt/local/include/{opencv,opencv2}和/ opt/local/lib

我使用mexopencv网站上的命令git克隆了最新的OpenCV版本; 这是版本084838d62a25fcb3eec9f610abf91b167bc6c2f5从星期六七月20日05:18:37 2013 -0700.

我运行了Matlab的mex -setup命令,然后从Mathworks 实现了这个解决方法,使用Xcode 5作为我的mex编译器.

我使用Matlab命令将macports的pkg-config命令添加到路径中 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
Run Code Online (Sandbox Code Playgroud)

我不知道此时该做什么.是否可以在我的系统上构建mexopencv?

Dan*_*den 7

我终于弄明白了我的问题,解决方案导致了其他问题,我最终能够解决.所以这是一个完整的分步过程,我做了什么让mexopencv在我的系统上工作(一些步骤将从我原来的问题重复).

  1. http://www.cs.sunysb.edu/~kyamagu/mexopencv/获取mexopencv
  2. 实现Mathworks解决方法以使Matlab mex编译器与Xcode 5一起使用
  3. mex -setup从Matlab内部运行
  4. 修改新创建的〜/ .matlab/R2013b/mexopts.sh文件,如下所示:

    1. 将"-lstdc ++"的所有引用替换为"-lc ++"
    2. 将以下参数添加到CXXFLAGS变量:" - std = gnu ++ 11 -stdlib = libc ++".这两个步骤确保您使用C++ 11而不是C++ 98(感谢此堆栈溢出帖子).
    3. 您应该已经使用前面的步骤中的"10.8"替换了文本"10.7"的所有实例
    4. 改变线

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

    MLIBS="$TMW_ROOT/bin/$Arch/libmx.dylib $TMW_ROOT/bin/$Arch/libmex.dylib $TMW_ROOT/bin/$Arch/libmat.dylib"
    
    Run Code Online (Sandbox Code Playgroud)

    这可以确保编译器不会搜索$TMW_ROOT/bin/$Arch我的系统上评估的OpenCV库/Applications/MATLAB_R2013b.app/bin/maci64.无论出于何种原因,旧版本的OpenCV(2.4.2)中的库都带有Matlab并且存在于该文件夹中(可能它们带有计算机视觉系统工具箱).[ 注意:此步骤可能没有必要]

  5. 创建一个文件夹/Applications/MATLAB_R2013b.app/bin/maci64/libopencv,并将所有的libopencv*.dylib文件从/Applications/MATLAB_R2013b.app/bin/maci64该文件夹中.这可以防止链接器查找并意外链接到此旧版本的OpenCV.
  6. 使用Matlab命令将macports的pkg-config命令添加到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]))
Run Code Online (Sandbox Code Playgroud)

当我试图在此时运行它时,我收到以下错误消息:

>> 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
Run Code Online (Sandbox Code Playgroud)

问题是Matlab有自己版本的一些安装了macports的库,包含在其中/Applications/MATLAB_R2013b.app/bin/maci64,与之不同/opt/local/lib.默认情况下,Matlab尝试动态链接自己的库版本,这些版本不是OpenCV期望的版本,因此程序不会运行.

README.markdownmexopencv附带的文件中建议使用该解决方案.您需要告诉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]))
Run Code Online (Sandbox Code Playgroud)

让我知道这些步骤是否适合您,以及我是否跳过任何​​步骤或做出比以往更复杂的步骤.

我希望这可以帮助别人!我花了好几天时间梳理互联网并困扰着Kota,最终找到了正确的解决方案.