参考 http://blog.youkuaiyun.com/tsuibeyond/article/details/50654823
http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html
1.打开设备fd = open(FILE_VIDEO1, O_RDWR))
2.取得设备的capability 看看设备具有什么功能 比如是否具有视频输入 或者音频输入输出等 VIDIOC QUERYCAP struct v4l2 capabilit
3 选择视频输入 一个视频设备可以有多个视频输入 VIDIOC S INPUT struct v4l2 input
4 设置视频的制式和帧格式 制式包括PAL NTSC 帧的格式个包括宽度和高度等 VIDIOC S STD VIDIOC S FMT struct v4l2 std id struct v4l2 format
5 向驱动申请帧缓冲 一般不超过5个 struct v4l2 requestbuffers
6 将申请到的帧缓冲映射到用户空间 这样就可以直接操作采集到的帧了 而不必去复制 mmap
7 将申请到的帧缓冲全部入队列 以便存放采集到的数据 VIDIOC QBUF struct v4l2 buffer
8 开始视频的采集 VIDIOC STREAMON
9 出队列以取得已采集数据的帧缓冲 取得原始采集数据 VIDIOC DQBUF
10 将缓冲重新入队列尾 这样可以循环采集 VIDIOC QBUF
11 停止视频的采集 VIDIOC STREAMOFF 12 关闭视频设备 close fd ;
#include <errno.h>
#include <fcntl.h>
#include <linux/videodev2.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
uchar *buffer; //buffers 指针记录缓冲帧
#define IMAGEWIDTH 640
#define IMAGEHEIGHT 480
#define TRUE 1
#define FALSE 0
#define FILE_VIDEO1 "/dev/video0"
static int fd; //设备描述符
struct v4l2_streamparm setfps; //结构体v4l2_streamparm来描述视频流的属性
struct v4l2_capability cap; //取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等
struct v4l2_fmtdesc fmtdesc; //枚举设备所支持的image format: VIDIOC_ENUM_FMT
struct v4l2_format fmt,fmtack; //子结构体struct v4l2_pix_format设置摄像头采集视频的宽高和类型:V4L2_PIX_FMT_YYUV V4L2_PIX_FMT_YUYV
struct v4l2_requestbuffers req; /