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

标签 xcode matlab opencv mex

我对在以下规范的系统上使用Kota Yamaguchi's mexopencv library感兴趣:

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

  • 我使用mexopencv网站上的命令git克隆了最新的OpenCV版本。这是2013年7月20日星期六05:18:37的版本084838d62a25fcb3eec9f610abf91b167bc6c2f5。

    我运行了Matlab的mex -setup命令,然后通过Mathworks实现了this workaround,以将Xcode 5用作我的mex编译器。

    我使用Matlab命令setenv('PATH', [getenv('PATH') ':/opt/local/bin']);将macports的pkg-config命令添加到了路径中

    现在,运行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?

    最佳答案

    我终于弄清楚了我的问题,解决该问题导致了其他问题,最终我得以解决。因此,这是一个完整的分步过程,介绍了如何使mexopencv在系统上工作(我的原始问题中将重复一些步骤)。

  • http://www.cs.sunysb.edu/~kyamagu/mexopencv/
  • 获取mexopencv
  • 实现Mathworks workaround以使Matlab mex编译器与Xcode 5一起
  • 从Matlab内运行mex -setup
  • 修改新创建的〜/.matlab/R2013b/mexopts.sh文件,如下所示:
  • 用“-lc++”替换“-lstdc++”的所有引用
  • 将以下参数添加到CXXFLAGS变量:“-std = gnu++ 11 -stdlib = libc++”。这两个步骤可确保您使用的是C++ 11而不是C++ 98(感谢this stack overflow post)。
  • 您应该已经从较早的步骤
  • 中将文本“10.7”的所有实例替换为“10.8”
  • 更改行
  • 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"
    

    这样可以确保编译器不会在$TMW_ROOT/bin/$Arch中搜索OpenCV库,在我的系统上,该库的计算结果为/Applications/MATLAB_R2013b.app/bin/maci64。无论出于何种原因,来自Matlab的旧版OpenCV(2.4.2)中的库都位于该文件夹中(也许它们与计算机视觉系统工具箱一起提供)。 [注意:可能不需要此步骤]
  • 创建一个/Applications/MATLAB_R2013b.app/bin/maci64/libopencv文件夹,并将所有libopencv*.dylib文件从/Applications/MATLAB_R2013b.app/bin/maci64移至该文件夹。这样可以防止链接程序发现并意外链接到此旧版本的OpenCV。
  • 使用Matlab命令setenv('PATH', [getenv('PATH') ':/opt/local/bin']);将macports的pkg-config命令添加到Matlab路径避免每次启动Matlab时都输入此命令,可以将其添加到startup.m文件中。我的生活在~/Documents/MATLAB/startup.m中。
  • 确保您在Matlab中运行mexopencv.make('clean', true);来清除以前任何失败的编译mexopencv的尝试
  • 在Matlab中运行mexopencv.make;它应该可以正常工作(带有一些警告),并且在五分钟左右的时间内,您将获得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期望的版本,因此该程序无法运行。

    该解决方案在mexopencv随附的README.markdown文件中提出。您需要告诉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]))
    

    让我知道这些步骤是否对您有用,以及我是否跳过了任何步骤或使事情变得比必须的复杂。

    我希望这可以帮助别人!我花了几天的时间梳理Internet并打扰Kota终于找到正确的解决方案。

    关于xcode - 使用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773916/

    相关文章:

    ios - 乱舞问题 : Xcode 7 and Swift Language

    c++ - dyld : Library not loaded: lib/libopencv_core. 3.0.dylib 原因:找不到图片

    python - OpenCV:阈值操作,结果异常

    ios - 为Xcode 11中的旧源代码启用自动布局

    ios - 如何使用搜索栏输入文本并过滤选择?

    matlab - RANSAC 多元回归

    Matlab:arrayfun、cellfun、spfun 和 structfun 与简单的 for 循环

    algorithm - 梯度下降不会返回线性函数的错误预测

    python - 为什么我使用 OpenCV 将 RGB 图像转换为灰度图像时得到绿色图像?

    ios - 表格 View 不会推送到下一个 View