为什么Y平面和CbCr平面报告的尺寸不同?

时间:2014-08-05 21:25:06

标签: ios avfoundation video-capture video-processing

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);

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

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

亮度(Y)平面是CbCr平面尺寸的两倍,为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

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

此外,99.9999%的数码相机使用彩色滤光片(几乎总是Bayer filter捕获),这意味着它们实际上并不捕获每个站点的全彩色,而是捕获相邻位置的单个主要组件。然后用数学方法将它们组合起来如果你想要真正好的估计真实信号,这个问题就变得非常重要了。如果你期望某人只需要4:1:1那么demosaic直接以4:1:1更便宜。这就是为什么API没有给你4:4:4,不管它不知道你打算用数据做什么。