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

Kha*_*ija 11 c webcam jpeg image

我正在用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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

thk*_*ala 7

索尼的EyeToy的具有相当流行OV519桥的OV7648传感器.OV519以JPEG格式输出帧 - 如果我从自己的相机中正确记得那是它支持的唯一格式.

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

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