在Linux中读取USB网络摄像头的输出

时间:2012-08-06 14:41:50

标签: c image jpeg webcam

我正在尝试使用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文件。在程序输出文件上输出linux上的file命令显示它是JPEG图像数据:JFIF标准1.01。该文件在图像查看器上可见,但有点饱和。

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

1 个答案:

答案 0 :(得分:7)

Sony EyeToy有一个OV7648传感器,带有非常流行的OV519桥接器。 OV519以JPEG格式输出帧 - 如果我从自己的相机中正确记得那是它支持的唯一格式。

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

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