如何从yuv框架中获取形状(宽度,高度,3)的额外尺寸值



我有一些代码可以读取一些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)

它将要做的是堆叠yu帧并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 个矩阵YUV从 420 格式转换为三维YUV矩阵,首先需要调整UV的大小,使其分辨率与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])

最新更新