尽管有 Homebrew 以及 conda,在 macOS 上安装 OpenCV 却依然未必容易,经常发生各种各样的 bug。鉴于我已经过了整天折腾环境的年纪,本文就怎么简单怎么来,为大家提供一个最简单的安装方案。
使用 Google 搜一下如何用 conda 安装预编译的 OpenCV 就会发现很多文章讲的是使用 menpo 频道的方法。然而实际操作就会发现这个方法不能安装 Python 3 兼容的 OpenCV。经过一番探索,发现 conda-forge 频道的 OpenCV 是可以和 Python 3 兼容的,并且 OpenCV 的版本也很新。
先搜索一下有哪些包可用:
conda search -c conda-forge --spec 'opencv=3*'
截至本文撰写的时间,最新版本为 3.4.1。
那就安装上它:
conda install -c conda-forge opencv
结束。
开玩笑。要是这么简单我就不会写这篇博文了。现在运行 python -c 'import cv2' 的话,会报一个错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(/usr/local/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libintl.8.dylib
Referenced from: /usr/local/anaconda3/lib/libharfbuzz.0.dylib
Reason: image not found
找不到 libintl.8.dylib。因为 El Capitan 开始引入了 SIP,添加 DYLD_* 的环境变量经常搞出来各种问题。那么就用一个简单粗暴的方式解决问题好了。
搜索一下 libintl.8.dylib 这个文件是不是存在:
locate libintl.8.dylib
在我的系统中,gettext-0.19.8.1-0 包里有这个动态链接库,位于 /usr/local/anaconda3/pkgs/gettext-0.19.8.1-0/lib/libintl.8.dylib。直接把它复制到系统的链接库路径:
cp /usr/local/anaconda3/pkgs/gettext-0.19.8.1-h15daf44_3/lib/libintl.8.dylib /usr/local/lib
再次测试一下 python -c 'import cv2',嗯又报错了:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dlopen(/usr/local/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libx264.138.dylib
Referenced from: /usr/local/anaconda3/lib/libavcodec.57.dylib
Reason: image not found
这次搜索后发现系统里没有 libx264.138.dylib 这个库。从 GitHub 上搜索一下,找到了解决方案:
conda install -c conda-forge x264=20131218
这次大功告成。