我在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,grab); fclose(camera); fclose(grab); return 0; }
程序工作时编译(gcc -o snap camera.c).令我吃惊的是输出文件不是原始数据转储,而是JPEG文件.文件命令在程序输出文件的linux上的输出显示为JPEG图像数据:JFIF Standard 1.01.该文件在图像查看器上可见,虽然有点饱和.
如何或为什么会发生这种情况?我没有在源或程序中使用任何JPEG编码库.相机输出JPEG本机吗?网络摄像头是由罗技制造的Sony Playstation 2 EyeToy.该系统是Debian Linux.
解决方法
Sony EyeToy具有OV7648传感器,具有非常受欢迎的OV519桥. OV519以JPEG格式输出帧,如果我从我自己的摄像机正确地记录了它支持的唯一格式.
像这样的摄像机需要应用程序支持,或需要在发送给用户空间之前解压缩帧的特殊驱动程序.显然,在您的情况下,驱动程序以原始格式提供JPEG帧,这就是为什么您在输出中获取JPEG数据.
BTW,你应该看看Video4Linux2 API在Linux上访问视频设备的正确方法 – 一个简单的open()/ read()/ close()通常是不够的?