一、内核设置

Linux内核中已经带有很完善的USB摄像头驱动,支持几乎所有的USB摄像头,我们只需要配置内核,选择上相应的Sensor型号即可。

配置内核,支持USB摄像头:
    Device Drivers --->
<*> Multimedia support --->
<*> Video For Linux
[*] Enable Video For Linux API (DEPRECATED)
[*] Video capture adapters --->
[*] V4L USB devices --->
<*> USB Video Class (UVC)
[*] UVC input events device support
[*] GSPCA based webcams --->
到这里,我们就可以选择所需要的USB摄像头驱动,当然也可以选择所有的USB摄像头驱动支持(这样编译出的内核会比较大)
GSPCA是一个万能摄像头驱动程序,进入GSPCA based webcams进行选择。
 
插入USB摄像头(我使用的UVC摄像头),会提示:
usb 1-1.1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1.1: New USB device found, idVendor=0ac8, idProduct=3450
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1.1: Product: Deasy USB2.0 Camera
usb 1-1.1: Manufacturer: Vimicro Corp.
uvcvideo: Found UVC 1.00 device Deasy USB2.0 Camera (0ac8:3450)
input: Deasy USB2.0 Camera as 
/devices/platform/s3c2410-ohci/usb1/1-1/1-1.1/1-1.1:1.0/input/input3
 
它的设备名称是:/dev/video0
USB摄像头一般都是基于V4L2架构的,需要编写V4L2架构的程序来操作摄像头

二、编写V4L2的应用程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <getopt.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h> #include <asm/types.h>
#include <linux/videodev2.h> #define CAMERA_DEVICE "/dev/video0"
#define CAPTURE_FILE "frame.jpg" #define VIDEO_WIDTH 640
#define VIDEO_HEIGHT 480
#define VIDEO_FORMAT V4L2_PIX_FMT_YUYV
#define BUFFER_COUNT 4 typedef struct VideoBuffer {
void *start;
size_t length;
}VideoBuffer; int fd; //摄像头文件描述符 void open_camera(char *path);
void get_camera_info();
void get_vedio_info(); //打开设备
void open_camera(char *path)
{
fd = open(CAMERA_DEVICE, O_RDWR, );
if(fd < ) {
printf("Open %s failed\n", CAMERA_DEVICE);
exit(EXIT_FAILURE);
}
} //获取驱动信息
void get_camera_info()
{
struct v4l2_capability cap;
ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
if(ret < ) {
printf("VIDIOC_QUERYCAP failed (%d)\n", ret);
return ret;
}
// Print capability informations
printf("Capbility Informations:\n");
printf("*\tdriver: %s\n", cap.driver);
printf("*\tcard: %s\n", cap.card);
printf("*\tbus_info: %s\n", cap.bus_info);
printf("*\tversion: %08X\n", cap.version);
printf("*\tcapabilities: %08X\n", cap.capabilities);
} //获取视频格式
void get_vedio_info()
{
struct v4l2_format fmt;
memset(&fmt, , sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ret = ioctl(fd, VIDIOC_G_FMT, &fmt);
if(ret < ) {
printf("VIDIOC_G_FMT failed (%d)\n", ret);
return ret;
}
// Print Stream Format
printf("Stream Format Informations:\n");
printf("*\ttype: %d\n", fmt.type);
printf("*\twidth: %d\n", fmt.fmt.pix.width);
printf("*\theight: %d\n", fmt.fmt.pix.height); char fmtstr[];
memset(fmtstr, , );
memcpy(fmtstr, &fmt.fmt.pix.pixelformat, );
printf("*\tpixelformat: %s\n", fmtstr);
printf("*\tfield: %d\n", fmt.fmt.pix.field);
printf("*\tbytesperline: %d\n", fmt.fmt.pix.bytesperline);
printf("*\tsizeimage: %d\n", fmt.fmt.pix.sizeimage);
printf("*\tcolorspace: %d\n", fmt.fmt.pix.colorspace);
printf("*\tpriv: %d\n", fmt.fmt.pix.priv);
// printf("*\traw_data: %s\n", fmt.fmt.raw_data); /* 显示所有支持的格式 */
struct v4l2_fmtdesc fmtdesc;
fmtdesc.index = ;
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
printf("Support format:\n");
while(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) != -) {
printf("\t%d.%s\n", fmtdesc.index+, fmtdesc.description);
fmtdesc.index++;
}
} int main()
{
int i, ret;
open_camera(CAMERA_DEVICE); get_camera_info(); get_vedio_info(); //请求分配内存
struct v4l2_requestbuffers reqbuf;
reqbuf.count = BUFFER_COUNT;
reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
reqbuf.memory = V4L2_MEMORY_MMAP;
ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
if(ret < ) {
printf("VIDIOC_REQBUFS failed (%d)\n", ret);
return ret;
}
//获取空间
VideoBuffer *buffers = calloc(reqbuf.count, sizeof(*buffers));
if(!buffers) {
//映射
fprintf(stderr, "Out of memory\n");
exit(EXIT_FAILURE);
} for(i=;i<reqbuf.count;i++) {
struct v4l2_buffer buf;
memset(&buf, , sizeof(buf));
buf.index = i;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
ret = ioctl(fd, VIDIOC_QUERYBUF, &buf);
if(ret < ) {
printf("VIDIOC_QUERYBUF (%d) failed (%d)\n", i, ret);
return ret;
}
// mmap buffer
buffers[i].length = buf.length;
buffers[i].start = (char *)mmap(, buf.length, PROT_READ|PROT_WRITE, MAP_SHARED,
fd, buf.m.offset);
if(buffers[i].start == MAP_FAILED) {
printf("mmap (%d) failed: %s\n", i, strerror(errno));
return -;
} // Queen buffer
ret = ioctl(fd, VIDIOC_QBUF, &buf);
if(ret < ) {
printf("VIDIOC_QBUF (%d) failed (%d)\n", i, ret);
return -;
} printf("Frame buffer: %d: address=0x%x, length=%d\n", i,
(unsigned int)buffers[i].start, buffers[i].length);
} // 开始录制
struct v4l2_buffer buf;
enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.index = ;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
ret = ioctl(fd, VIDIOC_STREAMON, &type);
if (ret < ) {
printf("VIDIOC_STREAMON failed (%d)\n", ret);
return ret;
} // Get frame
ret = ioctl(fd, VIDIOC_DQBUF, &buf);
if (ret < ) {
printf("VIDIOC_DQBUF failed (%d)\n", ret);
return ret;
} // Process the frame
FILE *fp = fopen(CAPTURE_FILE, "wb");
if (fp < ) {
printf("open frame data file failed\n");
return -;
}
fwrite(buffers[buf.index].start, , buf.length, fp);
fclose(fp);
printf("Capture one frame saved in %s\n", CAPTURE_FILE); // Re-queen buffer
ret = ioctl(fd, VIDIOC_QBUF, &buf);
if (ret < ) {
printf("VIDIOC_QBUF failed (%d)\n", ret);
return ret;
} // Release the resource
for(i=;i<;i++) {
munmap(buffers[i].start, buffers[i].length);
} close(fd);
printf("Camera test Done.\n");
return ;
}

三、使用软件打开

不过要选择对应的格式:

4412 使用usb摄像头拍照YUYV格式的更多相关文章

  1. 2.5 USB摄像头驱动程序框架

    学习目标:根据vivi驱动架构和linux-2.6.31/linux-2.6.31.14/drivers/media/video/uvc/Uvc_driver.c驱动源码,分析usb摄像头驱动程序框架 ...

  2. USB摄像头驱动框架分析(五)

    一.USB摄像头驱动框架如下所示:1.构造一个usb_driver2.设置   probe:        2.1. 分配video_device:video_device_alloc        ...

  3. 25、写一个USB摄像头驱动程序(有ioctrl分析)

    videobuf2-core.h中的vb2_buffer,记录了v4l2_buffer ,驱动可以对vb2_buffer的v4l2_buffer进行操控, vb2_buffer是v4l2框架层的代码, ...

  4. vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式

    进入正题 1. PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video) <template> <div> &l ...

  5. 荣品四核4412开发板的USB摄像头问题

    RP4412开发板是荣品电子研发的一款三星四核Exynos4412评估板开发板,支持WIFI+LAN上网.蓝牙4.0.4G上网.500万自动对焦摄像头.GPS.网卡.音频,1080P HDMI音视频同 ...

  6. 树莓派3 之 USB摄像头安装和使用

    需求 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头(有点贵).如果你不想要为摄像头模块花费额外的金钱,那有另外一个方法,就是你常见的USB 摄像头.你可能已经在PC上安装过了.我买的如图的这 ...

  7. 基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集【转】

    转自:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一直想把USB摄像头接到Zedboard上,搭建 ...

  8. 2.7 usb摄像头之usb摄像头描述符打印

    学习目标:参考lsusb源码,打印USB摄像头的设备描述符.配置描述符.接口联合描述符.端点描述符: 一.lsusb命令和源码 使用命令lsusb可以看看设备的id,并执行 # lsusb -v -d ...

  9. DIY远程移动图像监测(tiny6410+USB摄像头+motion+yeelink+curl)

    看到有博客上采用motion搭建移动图像监测系统,感觉很强大,但大多缺少远程监测能力,大多局限于局域网.OK,笔者手头刚好有一个30W像素的USB摄像头,那么借用yeelink服务,也来DIY一把,哈 ...

随机推荐

  1. MySQL的常用JSON函数

    1. JSON_SEARCH(col ->> '$[*].key', type, val) col: JSON格式的字段名 key:要搜索的col字段的key type:可以为'one'或 ...

  2. clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈

    clientdataset 读取excel   如果excel 文件不存在的时候   相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据.   这是一个bug 哈哈

  3. 【ABAP系列】SAP ABAP WS_DELIVERY_UPDATE 修改数量、过账日期并发货过账

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP WS_DELI ...

  4. String类为什么是final

    String 本身一个对象,对象在jvm启动的时候就要实例化和其他类调用就要实例化,第一性能,第二安全,因为string的高频繁的使用,如果被继承,哪里性能将会大大降低,因为不能被继承,换句话来说就比 ...

  5. 建立 Active Directory域 ----学习笔记

    第五章 建立 Active Directory域 1.工作组和域的理解 ​ a.工作组是一种平等身份环境,各个计算机之间各个为一个独立体,不方便管理和资源共享. ​ b.域环境一般情况下满足两类需求, ...

  6. Node.js 的环境配置

    1.安装node.js 官网上面最新版本的nodejs 都是自带npm的.http://nodejs.cn/至于安装过程选择默认下载就行 2.安装淘宝镜像,也就是将国外的一些资源代理到国内. 步骤:1 ...

  7. 前端 CSS的选择器 基本选择器 类选择器

    类选择器 符号是.开头 然后类的名字 样式类名不要用数字开头(有的浏览器不认). 所谓类就是class,.class与id非常相似,任何标签都可以加类,但是类可以重复 通过样式类选择元素: 示例: & ...

  8. python基础-10 程序目录结构 学生选课系统面向对象练习

    一 程序目录结构 1 bin文件夹 二进制文件.代码程序  2 conf 配置文件  3 帮助文档  4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...

  9. windows 端 nginx怎么配置 虚拟机的fastdfs文件管理系统

    FastDFS的安装这里不演示 nginx.conf #图片服务 upstream img_server_pool{ server 192.168.133.131:80 weight=10; } #学 ...

  10. 用Java语言做ACM的注意事项

    ①用Java时只需要粘贴包里面的内容,包名是不需要的.//有包名的去掉包名 ②提交题目时类名一定要是 Main,否则判题系统是不认识代码的. ③Java的util类里面的Scanner.in里面的 i ...