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 分钟前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
openFuyao3 分钟前
openFuyao亮相KubeCon Europe 2026 携InferNex套件深耕AI云原生推理领域
人工智能·云原生
剑穗挂着新流苏3124 分钟前
203_深度学习的第一步:线性回归模型与 SGD 优化算法实战
人工智能·深度学习·机器学习
泯泷19 分钟前
当AI排行榜成为一场数字游戏
人工智能·产品
神一样的老师20 分钟前
【RT-Thread Titan Board 开发板】家庭AI相框
人工智能
智算菩萨34 分钟前
【OpenGL】10 完整游戏开发实战:基于OpenGL的2D/3D游戏框架、物理引擎集成与AI辅助编程指南
人工智能·python·游戏·3d·矩阵·pygame·opengl
刘简爱学习44 分钟前
弱监督互斥多类脑肿瘤图像分割的类间可分离性损失
人工智能·深度学习·计算机视觉
AI英德西牛仔1 小时前
AI复制的文字带星号
人工智能·ai·chatgpt·豆包·deepseek·ds随心转
卖报的大地主1 小时前
扩散薛定谔桥(Diffusion Schrödinger Bridge)
人工智能
向成科技1 小时前
当“超轻量AI”遇上“最强国产芯”
人工智能·物联网·ai·芯片·国产化·硬件·主板