首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Linux中读取USB网络摄像头的输出

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

Stack Overflow用户
提问于 2012-08-06 22:41:50
回答 1查看 22.1K关注 0票数 11

我在C中用fread和fwrite做了一点实验,所以我用C语言写了这个小程序,用来从摄像头中获取数据,并将其转储到一个文件中。以下是源文件:

代码语言:javascript
运行
复制
#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?摄像头是由罗技公司生产的索尼PlayStation2 EyeToy。系统是Debian Linux。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-07 00:09:55

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

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11830517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档