问题描述
安装环境
Windows 7 64位
python版本 3.6.0
anaconda 版本4.3.1
问题说明
由于学习图象处理的需求,需要在当前的anaconda开发环境下安装一个opencv-python库。安装方法可以选择是直接在python命令行中使用pip3 install,或者从官网下载whl文件安装。
无论使用上述哪种安装手段,在安装完毕之后,在anaconda环境中执行"import cv2"时都会提示如下说明:
问题分析
原理思考
为了解决这个问题,调查了一大堆网页,发现大家的解决方法并不多,无非是下面这几种:
1、确保下载的opencv版本与python版本对应(这个是基本要求,我已经确定了版本一致)
2、下载Visual C++ Redistributable for Visual Studio 2015;
3、从python中下载python.dll(对于python3来说是python3.dll),放到anacnoda路径下;
上述方法都试过了,发现还是不行。
由于网站上给出的解决方法都不超出这些范围,因此折腾了半天后都没有什么收获。只好重新回去研究问题。我是这样考虑的:
既然给出的提示是“DLL load failed:找不到指定的模块”,那么肯定是有dll文件没有找到。那么我们是不是可以直接从这里入手,调查一下当前到底缺失了哪个dll呢?
调查DLL缺失情况
从一个github上的英文技术贴中得到了灵感(链接:https://github.com/skvark/opencv-python/issues/36)。
这个贴子中提到:opev-python库的dll依赖关系存储在下述文件中:
…\Anaconda3\Lib\site-packages\cv2\cv2.cp36-win_amd64.pyd。
这里的pyd文件就是python语言的dll文件。用UE这类文件查看器直接查看只能得到一堆二进制乱码。需要下载专用工具才能打开。我在这里选择了一个很好用的小软件:depends。这是一个专门用于查看DLL动态链接关系的软件。我们将它下载下来,解压缩后如下所示:
我们打开“cmd”容器,在容器中进入depends.exe所在路径,运行:depends.exe + pyd文件路径,如下:
这里会弹出depends软件的容器,显示如下(注意我用红线圈住的位置):
上述显示容器中,左上角的窗口中清楚地显示出了opencv-python中各级DLL的依赖关系。次下的“Module”窗口中显示各个DLL的状态。其中可以清晰地看到,有2个dll文件:api-ms-win-downlevel-shlwapi-l1-1-0.dll和IEShims.dll,是处于缺失状态的。
最下面的窗口中则直接显示“Error:At least one required implicit or forwarded dependency was not found”。很显然地,我们猜想当前opencv-python库不能正常使用,就是因为缺失了这两个dll文件。
解决方法
既然已经知道了缺什么文件,那么剩下的事情就很简单了。我们从网上下载上述2个dll文件(注意与开发环境对应,下载win x64版本),把它们放到anacnoda安装路径下。
此时再次查看depends,状态显示已经变化了:
可以看出,此时“Module”窗口显示中已经没有缺失的dll了。最下面的窗口中也只剩下一个Warnning信息。
验证与总结
解决效果验证
打开anacnoda的spyder窗口,再次导入opencv库,结果如下:
可以看出,opencv库已经导入成功。
为了进一步验证,我们用cv2获取一帧数据,输出图像的尺寸,并用matplotlib显示图象:
总结
在这里,我们在anacnoda提示“DLL Load failed”的情况下,使用depends.exe对opencv-python下的cv2.cp36-win_amd64.pyd文件进行了分析,补充了缺失的文件。
同时我们也简单分析一下网上给出的常见答案,其实除了确认版本外,其它的意见都是补充缺失的dll文件。只不过都是建议补充一些常见的DLL(或者说是我们经常会缺失的dll)。我们在这里给出的解决方案则更加通用化,可以针对自己当前实际缺失的dll进行修正,而不是去盲目地下载各种各样的DLL文件。同时这次经验也证明,遇到问题如果在中文范围内找不到答案,还是要多看看国外的技术帖,集思广益。