OpenCV 版本不兼容导致的问题

news/2025/1/30 21:04:57/

问题和解决方案

今天运行如下代码,发生了意外的错误,代码如下,其中输入的 frame 来自于 OpenCV 开启数据流的读取

"""
cap = cv2.VideoCapture(RTSP_URL)
print("链接视频流完成")
while True:ret, frame = cap.read()
"""def render_result_in_frame(frame, recognize_result: RecognizeResult):# 将 OpenCV 图像转换为 PIL 图像frame_pil = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(frame_pil)for item in recognize_result:# 绘制矩形框draw.rectangle([(item.x1, item.y1), (item.x2, item.y2)],outline=(0, 255, 0),width=2)# 绘制中文文本text = f"姓名: {item.name}"draw.text((item.x1, item.y1 - 40),text,font=FONT,fill=(0, 255, 0, 0))  # fill 参数是颜色 (R, G, B, A)# 将 PIL 图像转换回 OpenCV 格式frame = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)return frame

错误信息如下

...(略)person_image_rgb = cv2.cvtColor(person_image, cv2.COLOR_BGR2RGB)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'cvtColor'
> Overload resolution failed:
>  - src is not a numpy array, neither a scalar
>  - Expected Ptr<cv::UMat> for argument 'src'

查了很久也没有查到原因,因为这个函数输入是一个 opencv 读取的视频帧,忽然想到,在安装依赖的时候,我先安装了一次 opencv-python 的 4.11.0.86 版本,又安装了一次 opencv-python-headless 的 4.7.0 版本,这正好和错误信息中的 4.7.0 对应。

随后升级了 opencv-python-headless 的版本,问题就被解决了

原因分析

那么首先要搞懂的就是,opencv-python 和 opencv-python-headless 的关系是什么呢?

查阅了如下资料(【完整版】opencv-python-headless、opencv-python和opencv-contrib-python区别和联系),发现还有一个 opencv-contrib-python 的版本,三者的比较大体如下

  • opencv-python-headless:具备OpenCV核心图像与视频处理功能,像图像滤波、视频帧提取等,但无GUI功能,适合服务器端或无需显示图像的后台数据处理任务
  • opencv-python:拥有OpenCV完整核心功能,除处理图像视频外还支持GUI,能创建窗口显示图像、实现交互,适用于本地交互式开发与调试
  • opencv-contrib-python:涵盖核心功能及扩展模块,提供深度学习、高级特征提取等额外算法,适用于科研及需高级功能的开发场景

这三者有一个很坑的地方就是他们都会安装到 cv2 大路径下,并且相互有重叠的文件

那么当先安装 opencv-python 后,再安装另一个版本的 opencv-python-headless,就有可能发生 py 文件的覆盖,进而导致接口不兼容的问题

尽量安装单一版本;如果非要安装多个版本,要保证版本一致

以上只是个人的一些分析,如果有分析不正确的地方,欢迎在评论区留言


http://www.ppmy.cn/news/1567981.html

相关文章

团体程序设计天梯赛-练习集——L1-022 奇偶分家

前言 这几道题都偏简单一点&#xff0c;没有什么计算&#xff0c;10分 L1-022 奇偶分家 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数…

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…

3-scala的类

Scala中的类是用于创建对象的蓝图&#xff0c;其中包含了方法、常量、变量、类型、对象、特质、类&#xff0c;这些统称为成员。类型、对象和特质将在后面的文章中介绍。 类定义 一个最简的类的定义就是关键字class标识符&#xff0c;类名首字母应大写。 class Userval user…

蓝桥杯算法笔记|前缀和3382、3419

&#xff01;前倾回顾 &#xff08;一&#xff09;进制转换 任意进制转化成十进制 int x0;//存放结果 int k;//k存放当前进制 int a[];//存放当前数拆解成的每位数 for(int i0;i<a.size();i){xx*ka[i]; } cout<<x<<\n 十进制转化成任意进制 string s;//存放结…

c++-------------------------继承

1.继承的概念和定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产⽣新的类&#xff0c;称派⽣类。继承 呈…

数据结构---哈希表

基本概念 哈希函数&#xff08;Hash Function&#xff09;是一种将输入的数据&#xff08;通常是任意大小的&#xff09;映射到固定大小的输出&#xff08;通常是一个固定长度的值&#xff09;的函数。这个输出值通常称为“哈希值”&#xff08;Hash Value&#xff09;或“哈希…

CLion入门2.0(优雅进行STM32和ESP32开发)(船新版本)

CLion入门2.0(优雅进行STM32和ESP32开发)(船新版本) 文章目录 CLion入门2.0(优雅进行STM32和ESP32开发)(船新版本)0.前言1.准备工作1.1.安装CLion1.2.下载STM32环境依赖1.2.1.STM32CubeMX1.2.2.OpenOCD1.2.3.MinGW1.2.4.GNU Arm Embedded Toolchain 1.3.下载ESP32环境依赖1.3.1…

AI软件栈:LLVM分析(一)

文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …