我有一些代码可以读取一些yuv帧并返回单独的组件,我正在尝试将其集成到一些读取mp4文件并进行一些处理的代码中,调用的函数取决于形状的形式(宽度,高度,3(,为单独的y u v组件返回的内容只是(宽度, 高度(,那么我如何能够获得维度方面的额外 3 以及这个 3rd 维度中包含什么样的值?所做的一切都在python中
所以我的视频是1920,1080,
y, u, v = getComponents(video,60( #60 是帧
newFrame = modifyFrame(frames( # 这是来自原始代码,并期望数组形状为 (1920,1080,3(
如果我确实打印(y.shape(,我会得到(1920,1080(没有第三维,我需要输入形式采用modifyFrame方法所需的形式。也许有可能以某种方式组合 y、u、v 分量并获得我不确定的第三维
对不起,如果答案可能很明显,我是所有这些的新手
谢谢
你可以试试。
>>> y.shape, u.shape, v.shape
((1920, 1080), (1920, 1080), (1920, 1080))
>>> frame = np.r_[y,u,v]
>>> frame = frame.reshape(-1,frame.shape[1],3)
>>> frame.shape
(1920, 1080, 3)
它将要做的是堆叠y
u
帧并v
帧。 希望有帮助
您必须组合所有帧或为每个堆叠的 yuv 帧组合调用函数。这将取决于您的用例和性能要求
编辑
如果您的Y,U,V具有不同的形状,请尝试此操作。
>>> y.shape, u.shape, v.shape
((1080, 1920), (540, 960), (540, 960))
>>> u1 = np.pad(u, ((0, 540), (0, 960)), 'constant')
>>> v1 = np.pad(v, ((0, 540), (0, 960)), 'constant')
>>> u1.shape
(1080, 1920)
>>> v1.shape
(1080, 1920)
>>> frame = np.r_[y,u1,v1].reshape(-1,1920,3)
>>> frame.shape
(1080, 1920, 3)
更新
要找回您可以执行的值
>>> y2 = frame.T[0]
>>> y2.shape
(1080, 1920)
>>> u2 = frame.T[1][0:540,0:960]
>>> u2.shape
(540, 960)
>>> v2 = frame.T[2][0:540,0:960]
>>> v2.shape
(540, 960)
顺便说一句,对于第一部分,您还可以完成以下操作,这要容易得多:)
>>> u1 = np.pad(u, ((0, 540), (0, 960)), 'constant')
>>> v1 = np.pad(v, ((0, 540), (0, 960)), 'constant')
>>> frame = np.array([y,u1,v1]).T
>>> frame.shape
(1920, 1080, 3)
按尺寸划分,视频帧数据格式为 YUV 420
为了将 3 个矩阵Y
、U
和V
从 420 格式转换为三维YUV
矩阵,首先需要调整U
和V
的大小,使其分辨率与Y
相同,然后将它们堆叠成 3D 矩阵。
注:YUV形状惯例为(高,宽,3(,如(1080,1920,3(。
- 对于调整大小,您可以使用 cv2.resize
建议使用三次插值(比线性插值质量更好(。 - 对于 3D 堆叠,您可以使用 numpy dstack 功能。
下面是一个代码示例:
import cv2
import numpy as np
# Upscale u and v to be same resolution as y (1920 columns by 1080 rows)
u = cv2.resize(u, dsize=y.shape[::-1], interpolation=cv2.INTER_CUBIC) # Use shape[::-1], to reverse the order of shape to be (cols, rows)
v = cv2.resize(v, dsize=y.shape[::-1], interpolation=cv2.INTER_CUBIC)
# Stack y, u, v in the third dimension
yuv = np.dstack([y, u, v])