camera - YUV 缓冲区末尾的额外字节 - RaspberryPi

标签 camera raspberry-pi yuv

我已经开始编辑 RaspiStillYUV.c 代码。我最终想要处理我收到的图像,但现在,我只是努力理解它。为什么我使用 YUV 而不是 RGB?这样我就可以学到新东西。我对函数 camera_buffer_callback 做了一些微小的更改。我所做的一切如下:

fprintf(stderr, "GREAT SUCCESS! %d\n", buffer->length);

要替换的行:

bytes_written = fwrite(buffer->data, 1, buffer->length, pData->file_handle);

现在,尺寸应为代码中设置的 2592 x 1944(宽 x 高)。根据维基百科 ( YUV420 ),我得出的结论是文件大小应为 w * h * 1.5。由于 Y 分量每个像素有 1 个字节的数据,U 和 V 分量每 4 个像素有 1 个字节的数据(1 + 1/4 + 1/4 = 1.5)。伟大的。用 Python 进行数学计算:

>>> 2592 * 1944 * 1.5
7558272.0

不幸的是,这与我的程序的输出不一致:

GREAT SUCCESS! 7589376

这会留下 31104 字节的差异。

我认为缓冲区是以固定大小的 block 分配的(输出大小可以被 512 整除)。虽然我想了解这个谜团,但我对固定大小块的解释很满意。

我的问题是我是否遗漏了什么。超出预期大小的额外字节在此格式中有意义吗?他们应该被忽视吗?我的计算有问题吗?

最佳答案

此位置的文档支持您关于填充的理论:http://www.raspberrypi.org/wp-content/uploads/2013/07/RaspiCam-Documentation.pdf

具体:

Note that the image buffers saved in raspistillyuv are padded to a horizontal size divisible by 16 (so there may be unused bytes at the end of each line to made the width divisible by 16). Buffers are also padded vertically to be divisible by 16, and in the YUV mode, each plane of Y,U,V is padded in this way.

所以我对此的解释如下。 宽度是 2592(可以被 16 整除,所以这是可以的)。 高度为 1944,距离可被 16 整除还差 8,因此添加了额外的 8*2592(也乘以 1.5),从而为您提供了 31104 个额外字节。

虽然这种方法有助于减小文件的大小,但它并不能正确解释 YUV 输出的结构。我正在查看此描述,看看这是否提供了开始的提示:http://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29_to_RGB888_conversion

据此我认为如下:

Y channel :

2592 * (1944+8) = 5059584

U channel :

1296 * (972+4) = 1264896

V channel :

1296 * (972+4) = 1264896

给出总和:

5059584 + 2*1264896 = 7589376

这使得数字相加,所以剩下的就是确认这个解释是否正确。

我还尝试进行 YUV 解码(用于图像比较),因此如果您可以确认这是否确实与您在 YUV 文件中读取的内容相对应,我们将不胜感激。

关于camera - YUV 缓冲区末尾的额外字节 - RaspberryPi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20674415/

相关文章:

python - TCP 客户端无法连接到 TCP 服务器

linux - 无需 dyndns 即可从世界各地访问树莓派

ffmpeg - 将 YUV420SP 转换为 YUV420P

c# - 我应该在 C# 应用程序中存储 WIA 设备还是只存储 WIA 设备 ID?

android - 限制 Android 摄像头

python - Numpy 导入失败

android - 为什么MediaCodec的解码器输出的不是统一的YUV格式(如YUV420P)?

android - Android 上的 VideoGrabber OF_PIXELS_RGB 渲染不正确

javascript - 在 webRTC 中切换摄像头

javascript - 用javascript控制我的电脑摄像头?