Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv_Xcode_Matlab_Opencv_Mex - Fatal编程技术网

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

用Xcode 5和Matlab R2013b在OS X 10.9中编译mexopencv,xcode,matlab,opencv,mex,Xcode,Matlab,Opencv,Mex,我有兴趣在我的系统上使用以下规格: OSX10.9(小牛) Xcode 5 Matlab 2013b OpenCV通过macports安装到/opt/local/include/{OpenCV,opencv2}和/opt/local/lib 我使用mexopencv网站上的命令克隆了最新的OpenCV版本;这是版本084838d62a25fcb3eec9f610abf91b167bc6c2f5,自2013年7月20日星期六05:18:37-0700 我运行了Matlab的mex-setup命

我有兴趣在我的系统上使用以下规格:

  • OSX10.9(小牛)
  • Xcode 5
  • Matlab 2013b
  • OpenCV通过macports安装到/opt/local/include/{OpenCV,opencv2}和/opt/local/lib
我使用mexopencv网站上的命令克隆了最新的OpenCV版本;这是版本084838d62a25fcb3eec9f610abf91b167bc6c2f5,自2013年7月20日星期六05:18:37-0700

我运行了Matlab的
mex-setup
命令,然后从Mathworks实现,使用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
>> 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
架构x86_64的未定义符号: “cv::merge(std::vector const&,cv:_outputarrayconst&)”,引用自: MxArray::libMxArray.a(MxArray.o)中的toMat(int,bool)常量 “cv::split(cv::Mat const&,std::vector&)”,引用自: libMxArray.a(MxArray.o)中的MxArray::MxArray(cv::Mat const&,mxClassID,bool) ld:找不到架构x86_64的符号 叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用) mex:“+cv/CamShift.mexmaci64”的链接失败。 make:**[+cv/CamShift.mexmaci64]错误255

我不知道现在该怎么办。有可能在我的系统上构建mexopencv吗?

我终于解决了我的问题,解决了这个问题,我最终解决了其他问题。所以这里有一个完整的一步一步的程序,我是如何让mexopencv在我的系统上工作的(一些步骤将从我最初的问题中重复)

  • 把梅克索彭斯从
  • 实现以使Matlab mex编译器使用Xcode 5
  • 在Matlab中运行
    mex-setup
  • 修改新创建的~/.matlab/R2013b/mexopts.sh文件,如下所示:

  • 将“-lstdc++”的所有引用替换为“-lc++”
  • 向CXXFLAGS变量添加以下参数:“-std=gnu++11-stdlib=libc++”。这两个步骤确保您使用的是C++11而不是C++98(多亏了)
  • 您应该已经用前面步骤中的“10.8”替换了文本“10.7”的所有实例
  • 换线
  • MLIBS=“-L$TMW\u ROOT/bin/$Arch-lmx-lmex-lmat”

    这确保编译器不会在
    $TMW\u ROOT/bin/$Arch
    中搜索OpenCV库,在我的系统上,该库的计算结果为
    /Applications/MATLAB\u R2013b.app/bin/maci64
    。无论出于何种原因,旧版本OpenCV(2.4.2)中的库随Matlab一起提供,并保存在该文件夹中(可能随计算机视觉系统工具箱一起提供)。[注意:此步骤可能没有必要]

  • 创建一个文件夹
    /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
  • 确保运行
    mexopencv.Make('clean',true)以清除先前编译mexopencv时失败的任何尝试
  • 在Matlab中运行
    mexopencv.make
    ;它应该可以正常工作(带有一些警告),五分钟左右你就会有一个MEX编译版的OpenCV;祝贺但你还没做完
  • 我通过一个简单的单行测试尝试了OpenCV的安装:

    imshow(cv.Canny(rgb2gray(imread('peppers.png')), [10 100]))
    
    当我试图在此时运行它时,我收到以下错误消息:

    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
    
    >> 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附带的
    自述文件中建议了解决方案。您需要告诉Matlab不要使用自己版本的共享库,而是使用
    /opt/local/lib
    中的版本

    你可以用两种方法中的一种。首先,尝试运行您的程序,并记下产生错误的库的名称。然后,要么:

  • 在/Applications/MATLAB_r2013 b.app/bin/maci64中找到库文件,然后重命名或移动它。例如,将
    /Applications/MATLAB_r2013 b.app/bin/maci64/libtiff.5.dylib
    重命名为
    /Applications/MATLAB_r2013 b.app/bin/maci64/libtiff.5.dylib.bak
    。如果其他Matlab功能依赖于该库,这可能会产生意想不到的后果。为了让OpenCV在
    /opt/local/lib
    中找到正确的库,您不需要做任何其他事情
  • 关闭Matlab并从命令行启动它,首先设置
    DYLD\u INSERT\u库
    环境变量,如:

    DYLD\u INSERT\u库=/opt/local/lib/libtiff.5.dylib/Applications/MATLAB\u r2013 b.app/bin/MATLAB&

    在我的例子中,在我解决了
    libtiff.5.dylib
    的问题后,我也遇到了
    libfreetype.6.dylib
    的问题,因此我将其添加到
    DYLD\u INSERT\u LIBRARIES
    变量中,如下所示:

    DYLD\u INSERT\u库=/opt/local/lib/libtiff.5.dylib:/opt/local/lib/libfreetype.6.dylib/Applications/MATLAB\u r2013 b.app/bin/MATLAB&

  • 然后再次尝试运行您的程序。如果你得到一个