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 文件的覆盖,进而导致接口不兼容的问题

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

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

相关推荐
IT_陈寒22 分钟前
Vue的响应式什么时候会失灵?这个坑我踩了
前端·人工智能·后端
Mark-Wang1 小时前
2026大厂AI Agent高频面试题Top50:题目+参考答案+追问陷阱
人工智能
五度易链-区域产业数字化管理平台1 小时前
WorkBuddy 实战:将带 MD5 签名的第三方 API 封装为 MCP 服务(企业模糊搜索接口案例)
大数据·人工智能·mcp
怪奇云呼军1 小时前
知识库也会注入指令?闪电智能VoiceAgent 如何防住 Prompt Injection
人工智能·python·算法·云计算·音视频
xushichang123_1 小时前
企业降本刚需下,云上模型蒸馏与轻量化部署怎么选?AWS“大模型教研+小模型推理” 路径
大数据·人工智能
EasyDSS2 小时前
开会不用装App:私有化音视频系统EasyDSS即时视频会议,浏览器点开就能聊,AI帮你写纪要
人工智能·音视频
阿里云大数据AI技术2 小时前
基于 EMR Serverless Ray 实现 Qwen 模型批量推理实践
人工智能·算法·agent
ZJU_统一阿萨姆2 小时前
【算子开发】环境搭建与第一个CUDA程序
开发语言·人工智能·系统架构
老登为啥喜欢吹AI2 小时前
继DSH之后!Codex Harness 也开源了!Rust 核心、三层架构、人机协作
人工智能