【问题标题】:Why is the Y-plane and the CbCr-plane reporting different sizes?为什么 Y 平面和 CbCr 平面报告的大小不同?
【发布时间】:2014-08-05 21:25:05
【问题描述】:
CVPixelBufferLockBaseAddress(pixelBuffer, 0);

const size_t lumaPlaneIndex = 0;
size_t lumaPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, lumaPlaneIndex);
size_t lumaPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, lumaPlaneIndex);

const size_t cbcrPlaneIndex = 1;
size_t cbcrPlaneWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, cbcrPlaneIndex);
size_t cbcrPlaneHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, cbcrPlaneIndex);

NSLog(@"lumaPlaneWidth: %zu", lumaPlaneWidth);
NSLog(@"lumaPlaneHeight: %zu", lumaPlaneHeight);
NSLog(@"cbcrPlaneWidth: %zu", cbcrPlaneWidth);
NSLog(@"cbcrPlaneHeight: %zu", cbcrPlaneHeight);

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

在运行 iOS 7 的 iPhone 5 上,前置摄像头的输出是:

lumaPlaneWidth: 1280
lumaPlaneHeight: 720
cbcrPlaneWidth: 640
cbcrPlaneHeight: 360

luma (Y) 平面是 CbCr 平面大小的两倍,这是为什么呢?

【问题讨论】:

  • 1280x720 为 720p。你为什么期望它是那个大小的一半?您是在询问以较低频率采样 Cb 和 Cr 吗?
  • @Tommy - 实际上你可能是对的,我很困惑为什么平面有不同的尺寸,我可能错误地认为亮度平面是错误的。我会重新提出问题。

标签: ios avfoundation video-capture video-processing


【解决方案1】:

人眼对亮度变化比对颜色变化更敏感。它可以以更高的频率识别它们,因此信息通常以更高的采样频率存储。动机只是人类感知的现实(另外,我想,还要考虑带宽:如果数据传输是免费的,您只需在物理上尽可能多地捕获)。

您获得的缓冲区的 Y(/亮度)通道以 Cb 和 Cr(/颜色)通道的四倍采样率进行采样。那是 4:1:1 chroma subsampling

此外,99.9999% 的数码相机使用滤色器进行拍摄(几乎总是特别是 Bayer filter),这意味着它们实际上并未在每个站点捕获全色,而是在相邻站点捕获单个主要组件,然后组合他们在数学上。如果您想要对真实信号进行非常好的估计,那么这个问题就变得不简单了。如果您希望某人只需要 4:1:1,那么将demosaic 直接转换为 4:1:1 会更便宜。这就是 API 不给你 4:4:4 的原因,不管它不知道你打算如何处理数据。

【讨论】:

  • 啊酷 - 谢谢你的回答。我知道亮度平面中有更多信息,因为 CR、CB 平面是交错的,例如:YYYYYYYYYYYYBRBRBRBRBRBR 然而,如果 CrCB 计划是每个维度的 1/2,那么是整个区域的 1/4 ,如果只有一半的平面是 Cr,一半是 Cb,那不是 8:1:1 吗? ...也许我错过了什么?
  • 另外,我刚刚在这里看到了您的答案:stackoverflow.com/a/8838723/296446,如果我理解正确,这通过位移索引来解释平面尺寸的大小,如下所示:uint8_t *cbCrBufferLine = &cbCrBuffer[(y >> 1) * cbCrPitch];
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多