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

使用Pygame与OpenCV调用摄像头显示时触发TypeError错误

错误原因与解决方案

错误原因

你直接将cv2.VideoCapture摄像头对象传给了Pygame的blit()方法,但blit()要求第一个参数必须是pygame.Surface类型,这就是报错的核心原因。

解决步骤

要在Pygame窗口显示摄像头画面,需要完成以下转换流程:

  • 从摄像头读取单帧图像
  • 将OpenCV的BGR色彩空间转换为Pygame的RGB色彩空间
  • 将图像数据转换为Pygame可识别的Surface对象
  • (可选)调整图像尺寸以匹配窗口或需求

修改后的完整代码

import pygame 
import cv2
import numpy as np

pygame.init()

# 设置窗口宽高
WIDTH, HEIGHT = 1280, 720
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Camera Feed in Pygame")

# 背景颜色
color = (0, 0, 0)

# 0代表内置摄像头
camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 700)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 900)

def draw_window():
    # 填充背景色
    WINDOW.fill(color)

    # 读取摄像头帧
    ret, frame = camera.read()
    if ret:
        # 转换色彩空间:OpenCV BGR -> Pygame RGB
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # 转换为Pygame Surface(需要转置图像维度)
        frame_surface = pygame.surfarray.make_surface(np.transpose(frame_rgb, (1, 0, 2)))
        # 可选:缩放图像以适应窗口(这里按窗口等比例缩放)
        frame_surface = pygame.transform.scale(frame_surface, (WIDTH, HEIGHT))
        # 将Surface绘制到窗口
        WINDOW.blit(frame_surface, (0, 0))

    # 更新显示
    pygame.display.update()


FPS = 30
def mainWindow():
    # 保持窗口开启
    run = True 
    clock = pygame.time.Clock()
    while run: 
        # 限制帧率
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        draw_window()

    # 释放摄像头资源
    camera.release()
    # 关闭窗口
    pygame.quit()


# 主程序
mainWindow()

关键修改点说明

  • 添加ret, frame = camera.read():读取摄像头当前帧,ret用于判断读取是否成功
  • 色彩空间转换:cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),OpenCV默认用BGR存储图像,而Pygame使用RGB格式
  • 图像维度转置:np.transpose(frame_rgb, (1, 0, 2)),OpenCV帧维度为(高度, 宽度, 通道),Pygame需要(宽度, 高度, 通道)
  • 释放摄像头资源:退出循环时调用camera.release(),避免系统资源泄漏

内容的提问来源于stack exchange,提问作者Saltbottle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:55:30