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

Camera YUV缓冲区末尾的额外字节-RaspberryPi,camera,raspberry-pi,yuv,Camera,Raspberry Pi,Yuv,我已经开始编辑RaspiStillYUV.c代码。我最终想要处理我收到的图像,但现在,我只是在努力理解它。为什么我要和YUV而不是RGB合作?所以我可以学到一些新东西。我对函数camera\u buffer\u callback做了一些小改动。我所做的一切如下: fprintf(stderr, "GREAT SUCCESS! %d\n", buffer->length); 正在替换的线路: bytes_written = fwrite(buffer->data, 1, buffer

我已经开始编辑RaspiStillYUV.c代码。我最终想要处理我收到的图像,但现在,我只是在努力理解它。为什么我要和YUV而不是RGB合作?所以我可以学到一些新东西。我对函数
camera\u buffer\u callback
做了一些小改动。我所做的一切如下:

fprintf(stderr, "GREAT SUCCESS! %d\n", buffer->length);
正在替换的线路:

bytes_written = fwrite(buffer->data, 1, buffer->length, pData->file_handle);
现在,尺寸应为代码中设置的
2592 x 1944
(宽x高)。通过对维基百科()的研究,我得出结论,文件大小应该是
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整除)。虽然我很想理解这个谜团,但我同意固定大小的块解释


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

此位置的文档支持您关于填充的理论:

具体而言:

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

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

虽然这有助于文件的大小,但它不能正确解释YUV输出的结构。我正在查看此描述,以了解这是否提供了一个开始的提示:

因此,我认为情况如下:

Y通道:

2592*(1944+8)=5059584

U频道:

1296*(972+4)=1264896

V频道:

1296*(972+4)=1264896

总金额为:

5059584+2*1264896=7589376

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


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

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

yuv缓冲区有未使用的尾随字节是很常见的,但我不知道raspberry的具体细节。对于其他看到这一点的人来说。我已经切换到SimpleCV和Python。我(不是太重)修改过的RaspiStillYUV代码在8秒内处理了大约10幅图像。SimpleCV每秒运行约7次。两个样本都是在没有额外处理的情况下采集的。您可以使用uv4l驱动程序将相机作为视频设备,以便与SimpleCV一起使用。我将在今晚启动pi时检查它,并随后确认。不过,这是有道理的。谢谢!