OpenCV 版本不兼容导致的问题

问题和解决方案

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

python 复制代码
"""
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

错误信息如下

python 复制代码
...(略)
    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 文件的覆盖,进而导致接口不兼容的问题

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

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

相关推荐
知识鱼丸1 小时前
自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
人工智能
憨猪在度假2 小时前
Rk3588芯片介绍(含数据手册)
人工智能
西猫雷婶3 小时前
python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配
人工智能·python·opencv·计算机视觉
2301_793069823 小时前
OpenCV 图像旋转
人工智能·opencv·计算机视觉
纠结哥_Shrek3 小时前
基于最近邻数据进行分类
人工智能·分类·数据挖掘
kakaZhui4 小时前
【llm对话系统】大模型 Llama 源码分析之 Flash Attention
人工智能·chatgpt·aigc·llama
kakaZhui4 小时前
【llm对话系统】大模型 Llama 源码分析之并行训练方案
人工智能·chatgpt·aigc·llama
Melancholy 啊4 小时前
细说机器学习算法之ROC曲线用于模型评估
人工智能·python·算法·机器学习·数据挖掘
爱研究的小牛5 小时前
Deepseek技术浅析(二):大语言模型
人工智能·机器学习·语言模型·自然语言处理·aigc