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

时间:2013-12-19 05:57:42

标签: 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(w x h)。使用维基百科(YUV420),我得出的结论是文件大小应为w * h * 1.5。由于Y分量对于每个像素具有1字节数据,并且U和V分量对于每4个像素(1 + 1/4 + 1/4 = 1.5)具有1字节数据。大。用Python做数学:

>>> 2592 * 1944 * 1.5
7558272.0

不幸的是,这不符合我的程序输出:

GREAT SUCCESS! 7589376

这会留下31104字节的差异。

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

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

2 个答案:

答案 0 :(得分:2)

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

具体来说:

  

请注意,保存在raspistillyuv中的图像缓冲区将填充到   水平大小可被16整除(因此可能有未使用的字节   每行的结尾使宽度可被16整除。缓冲也是   垂直填充可被16整除,而在YUV模式下,每个都可以整除   Y,U,V的平面以这种方式填充。

所以我对此的解释如下。 宽度为2592(可被16整除,因此可以)。 高度为1944,即可被16整除,因此增加了8 * 2592(也乘以1.5),从而增加了31104个额外字节。

虽然这种方式有助于文件的大小,但它并没有正确解释YUV输出的结构。我正在查看此说明,看看这是否提供了一个提示:http://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29_to_RGB888_conversion

从此我相信它如下:

Y频道:

  

2592 *(1944 + 8)= 5059584

U频道:

  

1296 *(972 + 4)= 1264896

V频道:

  

1296 *(972 + 4)= 1264896

总和:

  

5059584 + 2 * 1264896 = 7589376

这使得数字相加,所以只留下来确认这种解释是否正确。

我也在尝试进行YUV解码(用于图像比较),所以如果你能确认这是否真的与你在YUV文件中读到的内容相符,那么我们将非常感激。

答案 1 :(得分:0)

您必须仔细阅读本手册。缓冲区填充为16的倍数,但颜色数据是一半大小,因此您的图像大小需要为32的倍数,以避免填充打破外部软件的问题。