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_yuyv_new.jpg"
#define CAPTURE_RGB_FILE "frame_rgb_new.bmp"
#define CAPTURE_show_FILE "a.bmp"


#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;


/*
void *calloc(unsigned n,unsigned size) 功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。跟malloc的区别:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据
*/
//位图文件头数据结构含有位图文件的类型,大小和打印格式等信息
//进行数据字节的对齐
#pragma pack(1)
typedef struct BITMAPFILEHEADER
{
  unsigned short bfType;//位图文件的类型,
  unsigned long bfSize;//位图文件的大小,以字节为单位
  unsigned short bfReserved1;//位图文件保留字,必须为0
  unsigned short bfReserved2;//同上
  unsigned long bfOffBits;//位图阵列的起始位置,以相对于位图文件   或者说是头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
#pragma pack()


typedef struct BITMAPINFOHEADER//位图信息头类型的数据结构,用于说明位图的尺寸
{
  unsigned long biSize;//位图信息头的长度,以字节为单位
  unsigned long biWidth;//位图的宽度,以像素为单位
  unsigned long biHeight;//位图的高度,以像素为单位
  unsigned short biPlanes;//目标设备的级别,必须为1
  unsigned short biBitCount;//每个像素所需的位数,必须是1(单色),4(16色),8(256色)或24(2^24色)之一
  unsigned long biCompression;//位图的压缩类型,必须是0-不压缩,1-BI_RLE8压缩类型或2-BI_RLE4压缩类型之一
  unsigned long biSizeImage;//位图大小,以字节为单位
  unsigned long biXPelsPerMeter;//位图目标设备水平分辨率,以每米像素数为单位
  unsigned long biYPelsPerMeter;//位图目标设备垂直分辨率,以每米像素数为单位
  unsigned long biClrUsed;//位图实际使用的颜色表中的颜色变址数
  unsigned long biClrImportant;//位图显示过程中被认为重要颜色的变址数
} BITMAPINFOHEADER;




VideoBuffer framebuf[BUFFER_COUNT];   //修改了错误,2012-5.21
int fd;
struct v4l2_capability cap;
struct v4l2_fmtdesc fmtdesc;
struct v4l2_format fmt;
struct v4l2_requestbuffers reqbuf;
struct v4l2_buffer buf;
unsigned char *starter;
unsigned char *newBuf;
struct BITMAPFILEHEADER bfh;
struct BITMAPINFOHEADER bih;


void create_bmp_header()
{
  bfh.bfType = (unsigned short)0x4D42;
  bfh.bfSize = (unsigned long)(14 + 40 + VIDEO_WIDTH * VIDEO_HEIGHT*3);
  bfh.bfReserved1 = 0;
  bfh.bfReserved2 = 0;
  bfh.bfOffBits = (unsigned long)(14 + 40);


  bih.biBitCount = 24;
  bih.biWidth = VIDEO_WIDTH;
  bih.biHeight = VIDEO_HEIGHT;
  bih.biSizeImage = VIDEO_WIDTH * VIDEO_HEIGHT * 3;
  bih.biClrImportant = 0;
  bih.biClrUsed = 0;
  bih.biCompression = 0;
  bih.biPlanes = 1;
  bih.biSize = 40;//sizeof(bih);
  bih.biXPelsPerMeter = 0x00000ec4;
  bih.biYPelsPerMeter = 0x00000ec4;
}


int open_device()
{
/*
在linux下设备都是以文件的形式进行管理的
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数int ioctl(int fd,int cmd,...)?
成功返回0,出错返回-1
其中fd--就是用户程序打开设备使用open函数返回的文件标识符
    cmd--就是用户程序对设备的控制命令,至于后面都省略号,有或没有和cmd的意义相关
*/
	int fd;
    fd = open(CAMERA_DEVICE, O_RDWR, 0);//
    if (fd < 0) {
        printf("Open %s failed\n", CAMERA_DEVICE);
        return -1;
    }
	return fd;
}


void get_capability()
{// 获取驱动信息
/*
控制命令VIDIOC_QUERYCAP
功能:查询设备驱动的功能;
参数说明:参数类型为V4L2的能力描述类型struct v4l2_capability;
struct v4l2_capability {
        __u8    driver[16];     //i.e. "bttv"            //驱动名称,
        __u8    card[32];       // i.e. "Hauppauge WinTV"         //
        __u8    bus_info[32];   // "PCI:" + pci_name(pci_dev)     //PCI总线信息
        __u32   version;        // should use KERNEL_VERSION() 
        __u32   capabilities;   // Device capabilities         //设备能力
        __u32   reserved[4];
};
返回值说明: 执行成功时,函数返回值为 0;
函数执行成功后,struct v4l2_capability 结构体变量中的返回当前视频设备所支持的功能
例如支持视频捕获功能V4L2_CAP_VIDEO_CAPTURE或V4L2_CAP_STREAMING
*/
    int ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
	if (ret < 0) {
        printf("VIDIOC_QUERYCAP failed (%d)\n", ret);
        return;
    }
    // Print capability infomations
    printf("------------VIDIOC_QUERYCAP-----------\n");
    printf("Capability Informations:\n&
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值