最近打算学一下OpenCV,就去官网下了最新版(3.2.0)的安装文件。说是安装文件,其实只是个自解压缩文件,解压完后需要手动复制相关文件到指定的位置。OpenCV本身是用C++写的,但支持Python绑定,所以我也只是打算在Python下学习OpenCV。官方的安装文件包里面只有针对Python2.7的预编译包,而我用的是Python3.6,这使得我怀疑OpenCV只支持Python2系列,多少感到有些郁闷,用惯了Python3就不太想回到Python2了,但上网一查得知,OpenCV从3.0系列就支持Python3了,只是官方的预编译包没自带而已,需要用户亲自编译,真是麻烦……
我是在Anaconda下用的Python,所以就想Anaconda会不会带有OpenCV,但查了一下,结果是没有。又上网查了下,发现pip可以安装OpenCV的Python版本(https://pypi.python.org/pypi/opencv-python),于是就在Anaconda的命令行下输入:
pip install opencv-python
这里的“安装”倒是顺利(其实也只是复制一个预编译包到Python目录),但在Python中用import
命令的话就会出现“未找到dll文件”的错误。上网查了下这个问题,很多回答说是未安装Visual C++ 2015运行时导致的,可是我已经安装了Visual Studio 2015,所以不是这个方面的dll找不到。于是我用Dependency Walker工具查了下OpenCV的Python模块(cv2.cp36-win_amd64.pyd),发现它需要一个名为“Python3.dll”的库文件。开始我以为Python3.dll同Python36.dll是等价的,但把Python36.dll复制一份并把文件名改为Python3.dll之后,在Python中导入OpenCV时Python会崩溃,看来这个预编译包做得并不好,它引用了一个在正常安装中不会出现的dll文件。
PIP的方式无法安装后就只好回到编译OpenCV源文件的老路上了。OpenCV源文件是用CMake构建的,这还算比较方便。下载并安装好CMake,在cmake-gui中设定好文件目录和一些选项后进行“Configure”。这里又遇到一个蛋痛的问题,CMake在Configure中需要下载ffmpeg的dll,可是这一步总是“网络超时”,查看CMake配置的源文件,也找不到能直接下到该dll的网址。网上有人说可以到OpenCV的GitHub主页上下,可我在OpenCV的GitHub主页上并没看到有这个dll的下载。又在网上搜了半天,发现OpenCV的GitHub上还有一个名为opencv_3rdparty的目录,在该目录下的“Branch”里选择ffmpeg/master_20161202(这个分支日期对应当前的OpenCV版本),然后进入ffmpeg目录就可以看到opencv_ffmpeg.dll和opencv_ffmpeg_64.dll两个文件了,从这里可以直接下载。下载后将文件复制到OpenCV源代码目录中的相应位置,按CMake的配置要求,需要在 “3rdparty/ffmpeg/downloads” 目录下建立以各个文件MD5码为名的目录,并把相应文件复制进去。接下来还有一个需要下载的模块ippicv也是同理。
解决好了以上两个模块的下载问题,后面的构建和编译过程就十分顺利了,生成的OpenCV-Python模块可以在Python3.6环境下正常导入和使用。