2012-08-06 72 views
10

我正在用fread和fwrite在C中进行一点点试验。于是我用C编写了这个小程序,以便从网络摄像头获取数据并将其转储到文件中。以下是来源:在Linux中读取USB摄像头的输出

#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 Standard 1.01。该文件可以在图像查看器上查看,尽管有点饱和。

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

+1

很可能摄像机输出的JPEG文件。 – doron 2012-08-06 14:59:19

回答

7

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

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

顺便说一句,你真的应该看看在Video4Linux2 API为在Linux上访问视频设备的正确方法 - 一个简单的open()/read()/close()一般是不够的......