我有兴趣在我的系统上使用Kota Yamaguchi's mexopencv library,并遵循以下规范:
我git使用mexopencv网站上的命令克隆了最新的OpenCV修订版;这是版本084838d62a25fcb3eec9f610abf91b167bc6c2f5从星期六七月20日05:18:37 2013 -0700。
我运行了Matlab的mex -setup
命令,然后从Mathworks实现this workaround以使用Xcode 5作为我的mex编译器。
我使用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?
答案 0 :(得分:7)
我终于找到了我的问题,解决方案导致了其他问题,我最终能够解决。所以这里有一个完整的分步过程,我做了什么让mexopencv在我的系统上工作(一些步骤将从我原来的问题重复)。
mex -setup
修改新创建的〜/ .matlab / R2013b / mexopts.sh文件,如下所示:
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
。无论出于何种原因,旧版本的OpenCV(2.4.2)中的库都带有Matlab并且存在于该文件夹中(可能它们带有计算机视觉系统工具箱)。 [注意:可能没有必要执行此步骤]
/Applications/MATLAB_R2013b.app/bin/maci64/libopencv
,并将libopencv*.dylib
中的所有/Applications/MATLAB_R2013b.app/bin/maci64
个文件移动到该文件夹中。这可以防止链接器查找并意外链接到此旧版本的OpenCV。setenv('PATH', [getenv('PATH') ':/opt/local/bin']);
将macports的pkg-config命令添加到Matlab路径中为避免每次启动Matlab时都输入此命令,可以将其添加到startup.m
文件中。我的生活在~/Documents/MATLAB/startup.m
。mexopencv.make('clean', true);
以删除之前编译mexopencv的任何失败尝试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/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]))
让我知道这些步骤是否适合您,以及我是否跳过任何步骤或做出比以前更复杂的步骤。
我希望这有助于某人!我花了好几天时间梳理互联网,困扰着Kota,最终找到了正确的解决方案。