You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Google Colab中用Pygame与OpenCV给视频加文字无显示问题求助

解决Google Colab中Pygame+OpenCV给视频加文字不显示的问题

你的代码核心问题是操作逻辑顺序错误,加上格式不匹配,导致文字根本没被合并到输出帧中,以下是具体问题分析和修正方案:

问题根源

  • 操作顺序颠倒:你先把文字画到Pygame的screen表面,但随后又用原始OpenCV帧创建了新的pygame_frame,最终导出的是这个不带文字的原始帧,文字完全没被纳入处理流程。
  • 颜色通道不匹配:OpenCV读取的帧是BGR格式,而Pygame使用RGB格式,直接转换会导致颜色错乱,也可能间接影响文字显示。
  • 无效的窗口操作:Colab是无图形界面环境,pygame.display.set_mode()和pygame.display.flip()属于无效操作,没必要依赖Pygame窗口处理帧。
  • 重复初始化资源:每次循环都创建字体对象,既浪费资源也无必要。

修正后的代码

import pygame
import cv2
import os
from google.colab.patches import cv2_imshow

# 读取视频
cap = cv2.VideoCapture(os.path.join('sample_data', 'BACKGROUND.mp4'))

# 获取视频参数
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 自动获取原视频FPS,避免手动设置偏差
fps = cap.get(cv2.CAP_PROP_FPS) if cap.get(cv2.CAP_PROP_FPS) > 0 else 30
frames_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 初始化视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('/content/drive/MyDrive/teste.mp4', fourcc, fps, (width, height))

# 提前初始化Pygame字体和文字(仅执行一次)
pygame.init()
font = pygame.font.SysFont('Arial', 50)
# 预渲染文字表面,提升循环效率
text_surface = font.render("This is a test", True, (255, 255, 255))
text_pos = (94, 479)

def edit():
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        # 1. 将OpenCV的BGR帧转换为Pygame兼容的RGB格式
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        pygame_frame = pygame.surfarray.make_surface(frame_rgb.swapaxes(0, 1))

        # 2. 在当前帧上绘制文字
        pygame_frame.blit(text_surface, text_pos)

        # 3. 将带文字的Pygame帧转换回OpenCV的BGR格式
        frame_with_text = pygame.surfarray.array3d(pygame_frame).swapaxes(0, 1)
        frame_with_text = cv2.cvtColor(frame_with_text, cv2.COLOR_RGB2BGR)

        # 写入输出视频
        out.write(frame_with_text)

        # 预览帧
        cv2_imshow(frame_with_text)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()

edit()

关键修改说明

  1. 调整处理流程:先把原始帧转换成Pygame格式,再在该帧上绘制文字,最后转换回OpenCV格式,确保文字被包含在输出帧中。
  2. 颜色格式转换:添加BGR↔RGB的格式转换,匹配两个库的颜色通道要求。
  3. 移除无效操作:删除Colab中无用的Pygame窗口创建和刷新代码。
  4. 优化资源初始化:把字体和文字渲染移到循环外,避免重复创建资源,提升处理速度。

内容的提问来源于stack exchange,提问作者Máyra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:58:10