我一直在尝试在Windows (Windows Subsystem for Linux, wsl)环境中安装OpenCV,事实证明这非常困难。
我想我已经非常接近了,但是在进入python时,import cv2
给出了以下错误:
ImportError: libopencv_core.so.3.1: cannot enable executable stack as shared object requires: Invalid argument
如何使库在堆栈上执行?
我的OpenCV *opencv*.so*
库文件位于/usr/local/lib/
。在正常的Linux环境中,我会使用
execstack -c /usr/local/lib/*opencv*.so*
但是,尽管我可以成功下载execstack
包,但它不是一个可以运行以允许在堆栈上执行的可识别命令。我怀疑这与Data Execution Prevention有关,Window版本的Exec-Shield可以防止stack smashing攻击。
但也许我只是太接近问题,不知道哪里出了问题。为什么我不能导入这个python包?我使用Python v3.4和OpenCV编译从最新的源代码(v.3.1)。
我解决了这个问题:tatsuya-y.hatenablog.com
我使用windows bash并通过conda install -c menpo opencv3=3.1.0
安装opencv然后我得到了这个(python 2.7)>>>import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libopencv_ccalib.so.3.1: cannot enable executable stack as shared object requires: Invalid argument
我用execstack
命令解决
sudo apt-get install execstack
sudo execstack -c $HOME/anaconda2/lib/libopencv_*
然后sudo apt-get install gtk2.0-0
问题解决了!>>> cv2.__version__
'3.1.0'
请记住,如果按照在线安装说明安装,opencv库将安装到/usr/local/lib。因此,命令应该是:
sudo execstack -c /usr/local/lib/libopencv_*
目前有很多事情根本无法工作,因为要么有未实现的系统调用(WSL只有部分覆盖,只有大约70%的系统调用被实现,其中一些只是部分实现),要么缺少套接字模式和选项(WSL还不支持Unix数据报套接字,尽管它应该在下一个内部构建中可用)。
如果你去github (BashOnWindows)并发布一个strace或搜索你的问题并找到它的副本,这是获得答案的最佳方式。这个项目的微软团队希望得到大量的反馈和bug测试。
要清楚,我是说你100%遇到了一些还没有实现的东西。但是,如果您查看.so文件的源代码,可能有一种方法可以禁用使用该系统调用的代码部分(因为Python是跨平台的,并且并非所有Linux系统调用都支持所有*nix操作系统)。
我也有同样的问题,但我能够通过重新安装它来修复它
$ sudo apt-get install execstack
和上面提到的Windows 10 build 14393.479
您可以使用execstack来安装opencv甚至导入lib。然而,对于视频捕获,如在cv2. videoccapture(0)中,bash for windows将无法工作。你需要安装一个完整的发行版