11

我在 C 中尝试了一些 fread 和 fwrite。所以我用 C 编写了这个小程序来从网络摄像头获取数据并将其转储到文件中。以下是来源:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 307200 // number of pixels (640x480 for my webcam)
int main() {
    FILE *camera, *grab;
    camera=fopen("/dev/video0", "rb");
    grab=fopen("grab.raw", "wb");
    float data[SIZE];
    fread(data, sizeof(data[0]), SIZE, camera);
    fwrite(data, sizeof(data[0]), SIZE, grab);
    fclose(camera);
    fclose(grab); 
    return 0;
}

该程序在编译时工作 ( gcc -o snap camera.c)。令我惊讶的是,输出文件不是原始数据转储,而是 JPEG 文件。filelinux上程序输出文件上的命令输出显示它是JPEG图像数据:JFIF Standard 1.01。该文件可以在图像查看器上查看,尽管有点饱和。

这如何或为什么会发生?我没有在源代码或程序中使用任何 JPEG 编码库。相机是否本机输出JPEG?网络摄像头是由罗技制造的 Sony Playstation 2 EyeToy。该系统是 Debian Linux。

4

1 回答 1

8

Sony EyeToy有一个 OV7648 传感器和非常流行的 OV519 桥接器。OV519 以 JPEG 格式输出帧——如果我没记错的话,这是它支持的唯一格式。

像这样的相机需要应用程序支持,或者需要在传送到用户空间之前解压缩帧的特殊驱动程序。显然,在您的情况下,驱动程序以其原始形式提供 JPEG 帧,这就是您在输出中获取 JPEG 数据的原因。

顺便说一句,你真的应该看看Video4Linux2 API以了解在 Linux 上访问视频设备的正确方法——简单open()/read()/close()的通常是不够的......

于 2012-08-06T16:09:55.177 回答