使用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
相关产品推荐
相关产品推荐

