我终于弄清楚了我的问题,解决了这个问题,导致了其他问题,我最终能够解决这些问题。因此,这是我为使 mexopencv 在我的系统上工作所做的完整的分步过程(某些步骤将从我的原始问题中重复)。
- 从http://www.cs.sunysb.edu/~kyamagu/mexopencv/获取 mexopencv
- 实施Mathworks 解决方法以使 Matlab mex 编译器与 Xcode 5 一起工作
mex -setup
在 Matlab 中运行
修改新建的~/.matlab/R2013b/mexopts.sh文件如下:
- 将“-lstdc++”的所有引用替换为“-lc++”
- 将以下参数添加到 CXXFLAGS 变量:“-std=gnu++11 -stdlib=libc++”。这两个步骤确保您使用的是 C++11 而不是 C++98(感谢此堆栈溢出帖子)。
- 您应该已经用前面步骤中的“10.8”替换了文本“10.7”的所有实例
- 换行
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"
这确保编译器不会搜索 OpenCV 库$TMW_ROOT/bin/$Arch
,在我的系统上,这些库的计算结果为/Applications/MATLAB_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 命令将 macports 的 pkg-config 命令添加到 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
.
DYLD_INSERT_LIBRARIES
关闭 Matlab 并通过首先设置环境变量从命令行启动它,例如:
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]))
让我知道这些步骤是否对您有用,以及我是否跳过了任何步骤或使任何事情变得比必须的更复杂。
我希望这可以帮助别人!我花了几天时间梳理互联网并打扰 Kota 终于找到了正确的解决方案。