OpenCV安装成功,但是无法导入 cv2 的指定模块 — Ubuntu Anaconda 环境一键安装 opencv

1. 问题

OpenCV安装成功,但是无法导入 cv2 的指定模块 – Ubuntu Anaconda 环境,具体是安装好 opencv-python 4.1.0.25 后,准备导入模块 cv2.ximgproc.guideFilter 时,仍然报错,

ModuleNotFoundError: No module named ‘cv2.ximgproc’

并且已经安装好 opencv-contrib-python 4.1.0.25 。

2. 分析

在翻阅别人的博客,大概都是认为问题出在了 安装了多个版本的 opencv-python 和 opencv-contrib-python,CV2的库冲突,其中 opencv-contrib-python 是 opencv-python 的拓展版本,有opencv 的一些附加功能,是对 opencv 的补充。

他们的解决方案大致是先将所有的 opencv-python 和 opencv-contrib-python 先卸载,再只安装 opencv-contrib-python 和 opencv-python ,就可以解决他们的问题。

pip uninstall opencv-contrib-python opencv-python

注意,这里安装的 opencv-contrib-python 和 opencv-python 一般是你所需的指定版本,一般先安装 opencv-python,再安装 opencv-contrib-python。一般使用 pip install XXX 安装,conda install XXX 只能安装 opencv-python ,无法安装 opencv-contrib-python 。

pip install opencv-contrib-python==4.1.0.25

或者

pip install opencv-python==4.1.0.25
pip install opencv-contrib-python==4.1.0.25

但是在我创建的 conda 虚拟环境中,这种方法依旧没能解决我遇到的问题。即使使用 conda list 查看已经安装好了指定版本的 opencv-python 和 opencv-contrib-python,依旧无法导入需要的模块 cv2.ximgproc.guideFilter 。

其中,模块 cv2.ximgproc.guideFilter 用于导向滤波。

参考链接:
1
2
3

3.解决

有博客认为:pip 安装和 conda 安装的 python 依赖包有不匹配的地方,所以建议采用离线的方式安装 opencv-python 和 opencv-contrib-python 的 .whl 文件 。

首先在卸载完成 opencv-python 和 opencv-contrib-python 以后,去 opencv 的镜像文件网站下载我们需要的版本,在 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/ 下载所需的 opencv-contrib-python ,在 https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/ 下载所需的 opencv-python ,



再离线安装,

pip install /home/xxx/opencv_contrib_python-4.1.0.25-cp36-cp36m-manylinux1_x86_64.whl
pip install /home/xxx/opencv_python-4.1.0.25-cp36-cp36m-manylinux1_x86_64.whl

其中要注意的是 cp36 表示 python 环境是 3.6 版本,manyliunx 表示系统平台内核是基于 liunx 。

很遗憾,这种方法依旧还是未能成功导入模块 cv2.ximgproc 。在我创建的 conda 虚拟环境中,使用 conda list 查看,即使显示已经安装好了指定版本的 opencv-python 和 opencv-contrib-python,依据无法导入需要的模块 cv2.ximgproc.guideFilter 。

最后发现了问题所在,创建的虚拟环境下对应的 opencv-python 和 opencv-contrib-python 安装包文件夹下竟然基本是空,而其它依赖包安装文件夹下有非常多的 .py 文件。

先定位 opencv-python 依赖包安装的文件夹,

pip show opencv-python

显示自己创建的虚拟换环境中,opencv-python 所在的安装路径为
/home/XXX/anaconda3/envs/自己创建的虚拟环境名/python3.6/site-packages/cv2/

这说明,表面上使用 conda list 显示是 安装了 opencv-python,但是实际上并没有安装成功,只是在虚拟环境下存在相关的安装文件夹,但是里面并没有文件。我知道 conda 是可以直接复制虚拟环境中依赖包的安装文件来进行移植环境的,于是我直接在之前安装过 opencv-python 和 opencv-contrib-python 的另外的虚拟环境中复制了opencv-python 和 opencv-contrib-python 的安装文件到我现在需要的用虚拟环境中,解决了我遇到的问题,我知道这种解决方式治标不治本,但没有找到更好的解决方法,比如 一条类似 pip install XXX 的指令就解决我上面遇到的问题。希望路过的大佬能帮我指出问题的根本所在,这样可以让遇到了和我一样问题的其他人能少浪费时间。

我现在个人感觉问题出还是出在使用 pip 语句和 conda 语句安装依赖包时,版本发生了冲突,尽管离线方式安装也没成功。

本文所用 conda 版本是 4.5.11

conda --version

4. 其它尝试

看到有别的博客是通过直接在 opencv 的 Github 上面源码安装,我这里没试,感觉很麻烦,大家可以试试能不能行。

另外,重新创建了一个虚拟环境,python 版本是 3.6 ,只安装 opencv-python 和 opencv-contrib-python,也是不行,在相关依赖包的安装文件夹下是空的,没有相关的 .py 文件。

最后我再试一试使用 conda install XXX 命令,能否安装上。

在创建的新的虚拟环境下,conda 命令安装 opencv

conda install -c https://conda.anaconda.org/menpo opencv3

或者安装最新版本的opencv ,上面语句安装的是 opencv 3.x.x版本,下面是是安装 4.X.X 版本。

conda install -c https://conda.anaconda.org/menpo opencv

查找你需要的版本,

conda search opencv -c conda-forge

或者通过以下方式查找 anaconda 官网中所有版本的 opencv 。

conda search -c https://conda.anaconda.org/menpo opencv*

很遗憾,虽然安装上了安装包 opencv ,能导入 cv2.ximgproc 模块, 但是还是没能跑同代码,是 opencv 的版本不对。anaconda 官网的 opencv 版本有限,我需要的是 opencv 4.X.X 的版本,我创建的虚拟环境的 python 是 3.6 版本。可是 anaconda 官网的 opencv 4.X.X python 需要 大于或等于 3.7 。所以不管是用 conda install -c https://conda.anaconda.org/menpo opencv 还是 conda install -c https://conda.anaconda.org/menpo opencv3 ,anaconda 给我匹配的可以安装的最新版本的 opencv 版本是 3.4.2

希望我上面的环境配置过程,能帮到屏幕前的你。

更正:
1、上面提到的 cv2.ximgproc.guideFilter 不是一个模块 。 cv2.ximgproc 是一个模块,guideFilter 是该模块的一个函数。
2、 conda 是安装 opencv3 或者 opencv ,不是安装 opencv-python 和 opencv-contrib-python 。

5. 总结

最后总算是实现了一键安装 opencv ,

pip install opencv-python

或者

conda install opencv

一般,上述语句安装,都是安装的匹配你 python 版本的 opencv 最新版本。

上述问题主要在于:conda 创建的虚拟环境中 python 版本;你所需的 opencv 版本;还有 conda 和 pip 安装匹配的问题。

首先,我们使用 conda 创建虚拟环境,是希望通过 anaconda 来统一管理各个依赖包,包括不同依赖包之间的版本匹配。

然后,存在一个问题就是,conda 中可以下载到的依赖包可能有限,比如 pip 可以下到几乎所有的 python 依赖包,但是 conda 中并没有那么多的依赖包(当然也是很多的,只有个别的包 pip 有,但是 conda 没有),所以 你在 conda 创建的虚拟环境中 使用 pip install xxx 时需要特别注意这一点,即使你 pip install opencv-python == 4.1.0.25 ,但是 conda 里面并没有这个版本,所以导致 你使用 pip install opencv-python ==4.1.0.25 安装时,相关安装文件夹下是空的,但是你使用 conda list 显示安装了 opencv-python,其实并没有安装成功。

还有就是,在你使用 conda install opencv 安装时,比如 你 创建 的虚拟环境 的 python 版本为 3.6 ,那么 就不允许你下载 4.1.0.25 版本的 opencv ,python 版本为 3.6 ,那么你能在 conda 中下载到的 最新的 opencv 版本是 3.4.2 。你如果要下载 4.1.0.25 版本的 opencv , 那么 你创建虚拟环境时应该 将 python 版本设置为大于 3.7

最后,还有一点需要注意的是,使用 pip install opencv-python==指定版本 时要慎重,首先你要确定 anaconda 确实有你指定的版本存在,你可以通过 conda search -c https://conda.anaconda.org/menpo opencv* 来查询,如果你创建的虚拟环境中的 python 版本 和 你指定的 opencv-python 版本不匹配则会出现 安装的是空文件的情况,并不会报错(很难让人发现问题所在),虽然 conda list 还会显示 你安装了 你指定的 opencv-python 版本,实际是你安装过,但并没有成功。

如果 你是使用 conda install opencv-python==指定版本,那么要是 conda 中没有你指定的版本,则会直接报错,如果有指定版本,则会安装 和你的 python 版本匹配的最新的 opencv 版本。这个时候你还要考虑 这个最新版本 的 opencv 是否是所需的,比如 给你安装的是 最新版本的 opencv 4.5.5 ,但是 你实际需要的是 3.4.2 版本,你在使用 opencv 时,可能会由于版本功能差异导致报错,其实并不是代码的问题,只是 opencv 版本不匹配导致。

希望能解决你在安装 opencv 时遇到的问题。

参考链接:
1
2
3
4
5
6
7
8
9

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(1)
青葱年少的头像青葱年少普通用户
上一篇 2022年5月9日
下一篇 2022年5月10日

相关推荐