零、我设备的相关信息
- Python 3.8.8
- Anaconda3 2021.05
- 查询匹配
python3.8.*
的OpenCV匹配版本为:4.1.* — 4.2.*
,我最后安装4.2.0.32
版本 - 如下我记录了 “从发现问题,到不断试错,最后解决问题” 的完整过程,以备自己复盘使用,大家不愿费时的可直接查看总结版的处理方式记录
一、问题起源
- 学校计算机视觉课要求完成实验,里头涉及OpenCV的使用,但对于
cv2.imshow()
语句总是会报错 - 报错信息如下:
-
cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1272: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage''
-
错误码:1272
二、试错过程
- 我网页检索相关错误的处理方式总结如下:
2.1 Anaconda之前没通过正规下载OpenCV的方式导致的问题(×)
- 实验课第一节课老师叫我们安装OpenCV包,我没安装OpenCV的印象,但却发现anaconda里已有OpenCV,所以猜测多半是去年做课设的时候,提前安装过了。但可能当时着急用,没有通过正规安装,直接把别人下载好的包文件添加到根目录的
site-packages
下,可能是没复制完全所以导致报错里显示找不到window.cpp
- 对于该条可能性错误,我处理方式:卸载原有的opencv-python,重新安装了,但并未解决问题
2.2 只安装了OpenCV,没匹配安装如下四个包(×)
- ①opencv-python(只包含主模块)
- ②opencv-contrib-python(包含main和contrib模块)
- ③opencv-python-headless(与opencv-python相同,但没有GUI功能)
- ④opencv-contrib-python-headless(与opencv-contrib-python相同,但没有GUI功能)
- 对于该条可能性错误,我处理方式:
- 一开始把这四个包全安装了最新版本,但安装后还是报错
- 所以又继续找问题,说是可能第①个包opencv-python下载要匹配python版本,而其余②③④也要匹配①的版本
- 于是我又根据python版本下载了各自匹配的四个包,但都并没有解决问题
- 并且最后查询多个博客分享后得知,并不需要四个包都下载,一般留一个①即可,于是我都卸载了留下①
opencv-python=4.2.0.32
2.3 Anaconda使用不当,导致设置错乱(×)
- 我留下了
opencv-python=4.2.0.32
后,它依旧报错,并且报错原因和原来一致,甚至发现报错里显示的依旧是最新版opencv-python=4.8.0
,可是conda list
查询后明明版本已经更改,如若继续同样错误,也应该是显示当前conda list
里的版本吧? - 对于该条可能性错误,我处理方式:
- 我寻思可能因为课设时,对Anaconda使用不当,不知道哪里被我设置错乱了。我想着实在不行彻底卸载重装大法,总能清理掉之前错误的设置,解决掉设置错乱吧!
- 于是有了我这篇博客:Anaconda彻底卸载及重安装
- 但可惜的是卸载重装后,依旧是这样的问题。
2.4 opencv版本匹配到别的软件上了(×)
- 对于卸载重装后错误显示依旧未有任何变化,并且其他cv2的使用正常的情况让我怀疑jupyter里的opencv用的不是我下载的,我猜想是否我把刚下载的匹配版opencv下载到另个环境里,导致用的不是我刚刚下载的匹配版opencv。
- 对于该条可能性错误,我处理方式:
- 卸载了opencv,直接尝试
import cv2
可以执行,并未出错。 - 于是我顺着这条方向找到了这篇文章:因OpenCV版本不一致所引发的报错。我理解讲的大致讲的是在Anaconda里安装OpenCV包之前,Anaconda就匹配上其他软件自带的OpenCV了,而其他软件里OpenCV出错了,所以导致Anaconda引用使用时也出错了。
- 我觉得这个思路能很好解释了“为什么Anaconda里再怎么下载安装相关的包都对问题造成不了影响和变化”。解释了为什么不管版本是不是最新4.8,或者不管有没有安装OpenCV,它出错都是报同个版本4.8,也都能正常导入
import cv2
。 - 于是我通过everthing的全盘检索,找到了所有自带有OpenCV的软件,其中显眼的是:
MATLAB和Qt
。
- 我觉得这个思路能很好解释了“为什么Anaconda里再怎么下载安装相关的包都对问题造成不了影响和变化”。解释了为什么不管版本是不是最新4.8,或者不管有没有安装OpenCV,它出错都是报同个版本4.8,也都能正常导入
- 可若真是这两个自带软件的问题,我就需要卸载这两个软件,避免被jupyter里的OpenCV匹配上,但考虑到①安装这俩软件我之前也挺费劲的,不是很愿意删除掉;②就算卸载,之后可能还需要用上这两个软件,到时候还是得处理这个问题,相当于卸载只是延迟了问题;③若卸载依旧仍未成功解决问题,我又徒增两个软件卸载干净与重安装的问题。
- 于是我想着是否能更改已生成的OpenCV链接→就找到了MATLAB和QT对应的
cmakelists.txt
文件,尝试打开后修改OpenCV相关的版本依赖,但每个.txt文件都没有出现opencv
这个关键词。 - 于是我就想着是不是我自己没找全或者找对依赖文件(也就是OpenCV依赖信息并不存在
cmakelists.txt
文件里,所以我才找不到)→ 于是我想着既然我改不了,那我在环境变量中把Anaconda的环境变量配置全置顶,也能避免Anaconda的环境配置优先受到其他软件的影响。但事实证明,更改后依旧没有用。
- 于是我想着是否能更改已生成的OpenCV链接→就找到了MATLAB和QT对应的
- 卸载了opencv,直接尝试
2.5 查看python解释器环境(√)
- 由于2.4中提及的三点考虑因素,我依旧不愿意卸载MATLAB和Qt,想着是否还有其他可循的思路。我首先通过以上的试错,可总结如下几点确定的信息:
- ① 想成功执行
cv2.imshow()
语句,仅需opencv-python
包即可 - ② 报错信息中的
OpenCV(4.8.0)
与Anaconda一点关系没有(在Anaconda中怎么下载安装opencv或卸载都无用) - ③ 使用出错的
OpenCV(4.8.0)
不在Anaconda相关的路径下 - 基于如上三点的考虑,我确认了目前解决问题的方向是:找到
OpenCV(4.8.0)
到底是谁的引用
- ① 想成功执行
- 因此我再次使用everthing进行全盘对opencv关键字的检索,发现除了MATLAB和Qt,还有两个目录下出现了opencv,而如下两个都是系统相关的并不是某个软件自带→于是我动摇了2.4中,jupyter的引用是由于MATLAB和Qt导致的猜想。
- 并且在问题检索的过程里,我查询到了以下两条命令,是用于查看Python 解释器相关的系统环境参数
import os os.sys.path
- 查询结果如下:
- 对结果的分析:由于总结③中说明了“使用出错的
OpenCV(4.8.0)
不在Anaconda相关的路径下”,所以直接不必看Anaconda3的路径,筛选后只剩下红框出来的系统用户路径。 - 于是顺着该路径进入文件夹后,发现目录下的存在一个cv2文件夹,并且时间显示为
23-07-02
符合opencv4.8.0
版本的时间。我怀疑找到了问题所在,但不确定于是并未直接删除该文件,仅是转移到另个位置(同时转移过程中,系统提示我文件夹中的cv2.pyd
文件正在被使用,我当时是并未退出jupyter的,所以就更相信问题与这个文件夹有关了。)
- 问题被解决:
- 当移除该目录下的cv2文件夹后,我再次运行
import cv2
显示找不到该库,我知道问题被解决了(因为我当时完全卸载了Anaconda中的opencv-python包,而Anaconda终于对该问题有了影响) - 我按照python匹配的版本,下载安装了opencv-python,最后终于正常显示结果
- 当移除该目录下的cv2文件夹后,我再次运行
三、总结版处理方式
- 前提:确认Anaconda中怎么更改opencv-python版本,甚至直接卸载opencv-python,Anaconda里
import cv2
都能正常运行,且报错时的版本都不变,就可以考虑如下解决方式: - ①通过如下命令,查看Python 解释器相关的系统环境参数
import os
os.sys.path
- ②不必考虑Anaconda有关路径,直接进入你对应显示的用户路径(和我图里的不一样,你得找你自己的)
- ③找到,并把cv2文件剪切到其他地方去(先别删除,以防不是这个导致的)
- 若提示
cv2.pyd
文件正在被使用不能移动,就关闭jupyter后单独把这个文件再移动一下,总之得让这个目录下不存在cv2这个文件夹了
- 若提示
- ④移除后,再次运行,即可正常执行
cv2.imshow()
四、反思总结
- 当问题发生时:
- ①虽然最好能找到出现同样错误的人的总结,根据他们的处理方式一步步执行并纠错。这是最保险的(因为中间可能出现的错别人走过了)、也是最迅速的(因为只要照做即可)。但必须考虑到,很多错误并不是很常见的,因此网上并非能这么容易找到,刚好和你问题一致并且很完美的解决处理;并且即使问题报错信息一致,但导致的原因可能千差万别,因此同个问题,别人适用的解决方式,给你未必适用(所以才会有了解决问题过程中的不断试错)
- ② 所以要学会配合每个错误提示与博客他人的分析,追根溯源找到你自己问题出错的本质原因,发现本质原因后,就要适当根据具体情况调整浏览器的检索方式
- 比如我一开始可能是直接把报错信息复制粘贴到浏览器中搜索
- 后期我发现出错的opencv版本对应不上Anaconda,我就检索opencv版本错乱原因
- 并且最终我得以解决问题的重要命令:
os.sys.path
,也不是靠一开始的搜索就找到的,也是后面零零碎碎问题查找中对于处理相关的问题,别人提供的思路。
- ③ 合理评估每个可能解决途径背后需要承担的风险,不能看到什么可能解决的路径就完全不考虑后果地去走通尝试一下
- 比如卸载MATLAB和Qt,当时情况下只有这条路能走,但这种情况下就要考虑一下卸载后若依旧无法解决问题的风险我是否能承担
- 若一些可能走的路风险太大,就可以先总结一下试错过程中得到的正确信息,并总结接下来问题解决的方向(在试错过程里一定要时刻都很明确自己目前要解决的问题!很明确自己现在在干什么!别把自己绕晕),清楚自己的底气和方向之后,再去思考有没有别的路可以尝试摸索的
- ④ 自己处理不来的时候,就向他人寻求帮助
- 我习惯自己处理问题,但这个问题我实在找不通路的情况下,就总结了自己试错的收获与接下来的方向后,向老师提出的询问,最后老师的处理方式虽然并未走通,但沟通的过程中能帮助你总结其他试错得到的信息、也有几率能开拓思路。
- 比如我和老师的沟通中,老师提出了“opencv根本就没在anaconda路径下”的判断与尝试多考虑考虑opencv可能相关的环境配置。这两点都对最后解决问题提供了帮助。