2013-12-19 31 views
2

我已经开始编辑RaspiStillYUV.c代码。我最终想要处理我收到的图像,但现在,我只是在努力理解它。为什么我使用YUV而不是RGB?所以我可以学到新的东西。我对功能camera_buffer_callback做了一些小修改。所有我做的是以下几点:在代码中设置YUV缓冲区结尾的额外字节 - RaspberryPi

现在,尺寸应2592 x 1944(宽x高):这是更换

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

线。关闭维基百科(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字节的差异。

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

我的问题是如果我失去了一些东西。在这种格式下超出预期大小的额外字节是否有意义?他们应该被忽略吗?我的计算关闭了吗?

+2

这是相当普遍的yuv缓冲区有未使用的尾随字节,但我不知道树莓特定的细节。 –

+0

对于其他人看到这一点。我已经切换到SimpleCV和Python。我的(不是太重)改进的RaspiStillYUV代码在8秒内完成了大约10张图片。 SimpleCV正在做〜7每秒。两个样本都是在没有额外处理的情况下进行的您可以使用uv4l驱动程序将相机作为视频设备使用,以便与SimpleCV一起使用。 – douggard

回答

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 Channel特别:

1296 *(972 + 4)= 1264896

给予的总和:

5059584 + 2 * 1264896 = 7589376

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

我也试图做YUV解码(用于图像比较),所以如果您可以确认这是否确实对应于您在YUV文件中读取的内容,这将非常感谢。

+0

今晚我会检查它,当我启动我的pi和后续与确认。这是有道理的。非常感谢! – douggard

0

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