Anaconda下Jupyter Notebook执行OpenCV中cv2.imshow()报错(错误码为1272)网上解法汇总记录和最终处理方式

零、我设备的相关信息

  • 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
    • 可若真是这两个自带软件的问题,我就需要卸载这两个软件,避免被jupyter里的OpenCV匹配上,但考虑到①安装这俩软件我之前也挺费劲的,不是很愿意删除掉;②就算卸载,之后可能还需要用上这两个软件,到时候还是得处理这个问题,相当于卸载只是延迟了问题;③若卸载依旧仍未成功解决问题,我又徒增两个软件卸载干净与重安装的问题。
      • 于是我想着是否能更改已生成的OpenCV链接→就找到了MATLAB和QT对应的cmakelists.txt文件,尝试打开后修改OpenCV相关的版本依赖,但每个.txt文件都没有出现opencv这个关键词。
      • 于是我就想着是不是我自己没找全或者找对依赖文件(也就是OpenCV依赖信息并不存在cmakelists.txt文件里,所以我才找不到)→ 于是我想着既然我改不了,那我在环境变量中把Anaconda的环境变量配置全置顶,也能避免Anaconda的环境配置优先受到其他软件的影响。但事实证明,更改后依旧没有用。 在这里插入图片描述

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,最后终于正常显示结果在这里插入图片描述

三、总结版处理方式

  • 前提:确认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可能相关的环境配置。这两点都对最后解决问题提供了帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础篇 | 面向对象】--- 聊聊什么是多态(上篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、什么是多态二、多…

IIC总线上拉电阻计算

IIC总线上拉电阻计算 1. 概述2. 上拉电阻计算3. 总线传输速度与功率4. 实例计算 1. 概述 IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构&#xff…

【PowerQuery】Excel的PowerQuery的复制

在Excel中构建符合要求的PowerQuery连接之后,所有的PowerQuery 连接已经顺利的保存在Excel 工作簿当中,但是如何去查看已经保存的PowerQuery连接呢?图6.3 显示了查看PowerQuery连接。 Excel界面->数据页签->查询与连接 如果你的Power…

Redis从入门到精通(四:持久化)

持久化简介 什么是持久化 利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化 持久化用于防止数据的意外丢失,确保数据安全性 为什么持久化 redis是将数据存储在内存上的,一旦断电,或者因…

c++类与对象(中)

文章目录 前言一、构造函数1、构造函数介绍2、构造函数特性 二、析构函数1、析构函数介绍2、析构函数特性 三、拷贝构造函数1、拷贝构造函数介绍2、拷贝构造函数特征3、拷贝构造函数的应用 -- 求n天后的日期 四、赋值运算符重载1、运算符重载2、一些运算符重载的实现3、赋值运算…

安徽省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

安徽省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

Java生成微信小程序二维码,5种实现方式,一个比一个简单

文章目录 前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数mapbyte[]数组 源码下载 前言 先介绍一下项目场景,主要是通过微信小程序二维码裂变分享&#…

MySQL之数据类型

目录 一、MySQL数据类型分类 二、数值类型 1、整数类型 2、bit类型 3、小数类型 三、字符串类型 1、char 2、varchar 3、char和varchar比较 四、日期和时间类型 五、enum和set 一、MySQL数据类型分类 MySQL 数据类型可以大致分为以下三类: 数值类型:用于…

我的个人网站——宏夏Coding上线啦

网站地址:宏夏Coding Github地址:🔥🔥宏夏coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推…

Qt应用开发(基础篇)——普通按钮类 QPushButton QCommandLinkButton

一、前言 QPushButton类继承于QAbstractButton,是一个命令按钮的小部件。 按钮基类 QAbstractButton 按钮或者命令按钮是所有图形界面框架最常见的部件,当按下按钮的时候触发命令、执行某些操作或者回答一个问题,典型的按钮有OK,A…

C语言数组和指针笔试题(二)(一定要看)

目录 字符数组二例题1例题2例题3例题4例题5例题6例题7总结 字符数组三例题1例题2例题3例题4例题5例题6例题7 字符数组二 char arr[] {a,b,c,d,e,f} 1:printf("%d\n", strlen(arr)); 2:printf("%d\n", strlen(arr0)); 3:printf("%d\n", strlen(…

浅谈C++|STL之string篇

一.string的基本概念 本质 string是C风格的字符串,而string本质是一个字符串 string和char * 区别 char * 是一个指针string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。 特点 string类内部封装了很多成…

打造基于终端命令行的IDE,Termux配置Vim C++开发环境

Termux配置Vim C开发环境,打造基于终端命令行的IDE 主要利用VimCoc插件,配置C的代码提示等功能。 Termux换源 打开termux,输入termux-change-repo 找到mirrors.tuna.tsinghua.edu.cn,清华源,空格选中,回…

MySQL间隙锁深入分析

概念 什么是间隙锁? MySQL的间隙锁(gap lock)是一种锁定相邻数据间隔的机制。 触发时机? 当使用SELECT…FOR UPDATE或UPDATE语句时,MySQL会获取一个范围锁,包括指定条件内的所有数据行,并且还…

【算法系列 | 8】深入解析查找算法之—二分查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一…

UPS电源UL1778认证,不间断电源系统ul1778认证

UPS电源UL1778认证,不间断电源系统ul1778认证 UL认证-不间断电源系统ul1778认证范围: 不间断电源系统:UPS即不间断电源(Uninterruptible Power Supply),是一种含有储能装置的不间断电源。主要用于给部分对电源稳定性要求较高的设…

C++ std::future

std::future是用来接收一个线程的执行结果的,并且是一次性的。 共享状态shared state future可以关联一个共享状态,共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的,且这个结果只能设置一次。 创建future …

STM32纯中断方式发送接收数据(串行通信;keil arm5;)

除了main文件其他文件均无修改,正常运行--在keil arm5内

pta java版

7-1 厘米换算英尺英寸 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(footinch/12)0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。 思路: 1英尺12英…

每日一题 2596. 检查骑士巡视方案

难度:中等 很简单,从第 0 步开始模拟即可,唯一sb的就是测试用例中如果(0,0)处不为0的话就直接false,而不是去找0在哪 我的代码: class Solution:def checkValidGrid(self, grid: L…