⑫tiny4412 Linux驱动开发之V4L2(usb camera)示例程序

本来这一次准备写SPI的,但是因为读取SPI Flash的数值不正确,还在继续努力,所以就先不写SPI了,回头再写.这次先来说一下V4L2.

V4L2全称video for Linux 2,是Linux的新一代视频架构,刚买了一个USB摄像头,所以,这里试一下效果.买的这个摄像头只支持YUYV格式,也就是YUV422,我之前有一套代码是测试MJPEG的,我笔记本的摄像头是支持这种格式的,这里因为只支持YUYV,所以,代码稍微修改了一下,但是效果不是很好,代码后边有空了,再优化.

首先,在Ubuntu PC环境下,先来测试一下效果,代码如下:

#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 CLEAR(x) memset (&(x), 0, sizeof (x))

struct buffer {
    void *                  start;
    size_t                  length;
};

static char *dev_name = "/dev/video1";//摄像头设备名
static int fd = -1;
struct buffer *buffers = NULL;
static unsigned int n_buffers = 0;

#define VIDEO_WIDTH     640
#define VIDEO_HEIGHT    480    // 分辨率600 * 480(VGA格式)

// 录制格式,笔记本摄像头可以选择V4L2_PIX_FMT_MJPEG,这样可以直接保存成jpg,直观
#define VIDEO_FORMAT V4L2_PIX_FMT_YUYV  //V4L2_PIX_FMT_MJPEG  
//V4L2_PIX_FMT_MJPEG
//V4L2_PIX_FMT_YUYV
//V4L2_PIX_FMT_YVU420
//V4L2_PIX_FMT_RGB32


FILE *file_fd;
#define CAPTURE_FILE "test.yuv"//"test.jpg"     // 笔记本摄像头选择"test.jpg"
static unsigned long file_length;

//
//获取一帧数据
//从视频缓冲区的输出队列中取得一个已经保存有一帧视频数据的视频缓冲区
//
static int read_frame (void)
{
    struct v4l2_buffer buf;
    CLEAR (buf);
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    
    if(ioctl (fd, VIDIOC_DQBUF, &buf) == -1)
    {
        printf("VIDIOC_DQBUF failture\n"); //出列采集的帧缓冲
        exit(1);
    }

    assert (buf.index < n_buffers);
    //  printf ("buf.index dq is %d,\n",buf.index);

    //将其写入文件中
    fwrite(buffers[buf.index].start, buffers[buf.index].length, 1, file_fd);
    printf("Capture one frame saved in %s\n", CAPTURE_FILE);
    
    //
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值