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
|