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

使用OpenCV读取YUV422视频时cv2.cvtColor报错求助

解决OpenCV读取YUV422(1920×1080)视频的报错问题

嘿,我来帮你搞定这个OpenCV读取YUV422视频的麻烦!先拆解下你遇到的两个报错根源:第一个error: (-215) scn == 2 && depth == 0,本质是cv2.cvtColor要求输入图像必须是2通道(scn=2)且8位无符号整数格式(depth=0),但你传入的yuv变量不符合这个要求;第二个COLOR_YUV2BGR_UYVY的报错,也是因为数据的维度、通道数或者排列格式没对应上。

结合你的环境(Python3.6.4+Anaconda+OpenCV3.3.1),给你一套完整的解决方案:

步骤1:正确读取YUV422原始数据

YUV422(UYVY格式)的每帧字节数是宽度×高度×2(每个像素对应2字节,按UYVY交替排列),必须严格按这个字节数读取单帧数据:

import cv2
import numpy as np

# 视频固定参数
width = 1920
height = 1080
frame_byte_size = width * height * 2  # YUV422每帧的总字节数

# 打开YUV原始文件
with open("your_video.yuv", "rb") as yuv_file:
    while True:
        # 读取单帧的全部字节数据
        frame_raw_data = yuv_file.read(frame_byte_size)
        if not frame_raw_data:
            break  # 文件读取完毕,退出循环
        
        # 将字节数据转为numpy数组,指定格式为uint8(必须和OpenCV要求匹配)
        yuv_frame = np.frombuffer(frame_raw_data, dtype=np.uint8)
        # 关键一步:将数组调整为(height, width, 2)的2通道形状
        yuv_frame = yuv_frame.reshape((height, width, 2))

步骤2:正确转换为BGR格式

现在你的yuv_frame已经是符合要求的2通道数组了,接下来根据视频的实际格式选择转换标志(你用yuviewer确认过是UYVY,所以选对应标志):

# 针对UYVY格式的YUV422,使用这个转换标志
bgr_frame = cv2.cvtColor(yuv_frame, cv2.COLOR_YUV2BGR_UYVY)

# 如果你的视频是YUYV格式(另一种YUV422排列),才用下面这个
# bgr_frame = cv2.cvtColor(yuv_frame, cv2.COLOR_YUV2BGR_YUYV)

步骤3:验证转换结果

转换完成后,你可以显示或者保存帧来确认效果:

# 显示转换后的BGR帧
cv2.imshow("YUV422 to BGR", bgr_frame)
# 按q键退出播放
if cv2.waitKey(25) & 0xFF == ord('q'):
    break

# 释放所有OpenCV窗口资源
cv2.destroyAllWindows()

为啥之前会报错?

  • 你之前的yuv变量大概率没有正确reshape为(height, width, 2),导致通道数不是2,触发了scn == 2的断言错误;
  • 另外如果读取的字节数不是正好一帧的大小,会导致数组形状异常,同样会让转换失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:13:34