python3下OPEN_CV库安装提示“DLL Load failed”的通用解决办法

问题描述

安装环境

Windows 7 64位
python版本 3.6.0
anaconda 版本4.3.1

问题说明

由于学习图象处理的需求,需要在当前的anaconda开发环境下安装一个opencv-python库。安装方法可以选择是直接在python命令行中使用pip3 install,或者从官网下载whl文件安装。
无论使用上述哪种安装手段,在安装完毕之后,在anaconda环境中执行"import cv2"时都会提示如下说明:
图1:anaconda中的错误提示

问题分析

原理思考

为了解决这个问题,调查了一大堆网页,发现大家的解决方法并不多,无非是下面这几种:
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动态链接关系的软件。我们将它下载下来,解压缩后如下所示:
图2depends软件

我们打开“cmd”容器,在容器中进入depends.exe所在路径,运行:depends.exe + pyd文件路径,如下:
图3 命令行运行depends
这里会弹出depends软件的容器,显示如下(注意我用红线圈住的位置):
图4 depends.exe的分析结果
上述显示容器中,左上角的窗口中清楚地显示出了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,状态显示已经变化了:
图5 depends的分析结果(更改后)
可以看出,此时“Module”窗口显示中已经没有缺失的dll了。最下面的窗口中也只剩下一个Warnning信息。

验证与总结

解决效果验证

打开anacnoda的spyder窗口,再次导入opencv库,结果如下:
图6 导入opencv库
可以看出,opencv库已经导入成功。
为了进一步验证,我们用cv2获取一帧数据,输出图像的尺寸,并用matplotlib显示图象:
图7 opencv库使用

总结

在这里,我们在anacnoda提示“DLL Load failed”的情况下,使用depends.exe对opencv-python下的cv2.cp36-win_amd64.pyd文件进行了分析,补充了缺失的文件。
同时我们也简单分析一下网上给出的常见答案,其实除了确认版本外,其它的意见都是补充缺失的dll文件。只不过都是建议补充一些常见的DLL(或者说是我们经常会缺失的dll)。我们在这里给出的解决方案则更加通用化,可以针对自己当前实际缺失的dll进行修正,而不是去盲目地下载各种各样的DLL文件。同时这次经验也证明,遇到问题如果在中文范围内找不到答案,还是要多看看国外的技术帖,集思广益。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值