我已经开始编辑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整除)。虽然我想了解这个谜,但我对固定大小的块解释很好。
我的问题是我是否遗漏了什么。超出预期大小的额外字节是否对此格式有意义?他们应该被忽视吗?我的计算结束了吗?
答案 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的倍数,以避免填充打破外部软件的问题。