gpt4 book ai didi

python - 尝试将 cvtColor 与 cv2.COLOR_YUV2BGR_Y422 一起使用时出错 - 错误:函数 cv::cvtColor 中的 (-215) scn == 2 && depth == 0

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:17 25 4
gpt4 key购买 nike

我想用 openCV 读取 YUV 视频。 YUV 视频为 1920*1080 并使用 YUV422 格式(我已经尝试使用 yuviewer 阅读此视频并且有效)

我正在使用带有 OpenCV 3.3.1 的 Anaconda 环境的 Python3.6.4

首先我尝试了这个脚本 https://stackoverflow.com/a/47815385/8236556但是这一行

cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_Y422)

给我这个错误。

  File "read-yuv-video.py", line 29, in <module>
bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_UYVY)
cv2.error: C:\ci\opencv_1512688052760\work\modules\imgproc\src\color.cpp:11228: error: (-215) scn == 2 && depth == 0 in function cv::cvtColor

尝试从 Y444 或 Y420 转换为 RGB 或 RGBA 或 GREY 时,我也遇到此错误。我在 google 或 stackoverflow 上没有发现完全相同的错误。我尝试重新安装 opencv 包,但没有成功。

在我下面的脚本中,除了最后一个之外,每个 cvtColor 都有效。我所说的工作是指它显示图像但颜色错误。

import numpy as np
import cv2

# filename = r'C:\myPath\voile.yuv'
filename = r'C:\myPath\credits.yuv'
yuv_file = open(filename, 'rb')
frame_len = 1920 * 1080 * 3/2
shape = (int(1080 * 1.5), 1920)
raw = yuv_file.read(int(frame_len))
yuv = np.frombuffer(raw, dtype=np.uint8)
yuv = yuv.reshape(shape)
yuv = cv2.resize(yuv, (0, 0), fx=0.5, fy=0.5)

cv2.imshow("raw yuv", yuv)
cv2.waitKey(0)

bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_NV21)
cv2.imshow("YUV2BGR_NV21", bgr)
cv2.waitKey(0)

bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_NV12)
cv2.imshow("YUV2BGR_NV12", bgr)
cv2.waitKey(0)

bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_I420)
cv2.imshow("YUV2BGR_I420", bgr)
cv2.waitKey(0)

bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_Y422)
cv2.imshow("YUV2BGR_Y422", bgr)
cv2.waitKey(0)

编辑

scn == 2 表示函数需要 2 channel 图像。我更改了这些行:

frame_len = 1920 * 1080 * 2 # 4 Bytes for 2 pixels
shape = (height, width, 2) # To have a 2 channels image (not really working obviously)

并且 cv2.cvtColor 不再抛出错误,但仍然无法正常工作。我认为我的 reshape 是完全错误的。

我的结果:

我手动查看了 numpy.array 并与 YUView 进行了比较,像素值和形状符合我的预期(Y 值然后是 U 然后是 V),但这不是 opencv 显示的内容。

为什么原始帧中Y矩阵下方有4张图片?

更准确地说,在我的案例中,cv2.cvtColor 函数的输入数据的形状应该如何?

最佳答案

由于 YUV 4:2:2 有一些变体,如果您能准确找到您的 YUV 格式会更容易。我使用罗技 Brio 网络摄像头通过 ffmpeg 拍摄 YUV 视频,它在 (YUY2/0x32595559), yuyv422 中提供了 YUV。这也是 YUV 4:2:2 但在字节顺序上有一些不同。

由于 YUV 4:2:2 的压缩比是 2/3,因此 1 个像素使用 2 个字节是正确的。这对我有用。

frame_len = int(width * height * 2)
shape = (height, width, 2)

并将 YUV 转换为 BGR(opencv 格式):

bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_YUY2)

关于python - 尝试将 cvtColor 与 cv2.COLOR_YUV2BGR_Y422 一起使用时出错 - 错误:函数 cv::cvtColor 中的 (-215) scn == 2 && depth == 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49361591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com