基于视频压缩的实时监控系统-sprint2采集端图像采集子系统设计

(1)、初始化:a.初始化摄像头;b.注册事件到epoll

(2)、开始采集--->触发事件处理系统

(3)、保存图像(方便测试)

a.初始化摄像头 //初始化摄像头

1、获取驱动信息

2、设置图像格式

3、申请图像缓冲区

4、映射到用户空间

5、图像缓冲入队列

//初始化摄像头
struct v4l2_dev* v4l2_init()
{
    //1、初始化摄像头
    v = calloc(1, sizeof(struct v4l2_dev));
    v->fd = open("/dev/video3", O_RDWR | O_NONBLOCK, 0);  //打开摄像头设备文件
    //1.1 获取驱动信息
    ioctl(v->fd, VIDIOC_QUERYCAP, &cap);
    //1.2 设置图像格式
    ioctl(v->fd, VIDIOC_S_FMT, &fmt);
    //1.3 申请图像缓冲区
    v->buf = calloc(req.count, sizeof(struct buf));
    //1.4 把内核空间中的图像缓冲区映射到用户空间
    ioctl(v->fd, VIDIOC_QUERYBUF, &buf);
    //1.5 图像缓冲入队
    ioctl(v->fd, VIDIOC_QBUF, &buf);

    //2、注册事件到epoll
    v->ev = epoll_event_create(v->fd, EPOLLIN, cam_handler, v);//创建epoll附加结构
    epoll_add_event(srv_main->epfd, v->ev);//添加事件到epoll

  

//事件处理函数
void cam_handler(int fd, void* arg)
{
    struct v4l2_buffer buf;
    struct v4l2_dev* v = arg;
    int file_fd;

    file_fd = open("test.jpg", O_RDWR | O_CREAT, 0777);

    /*帧出列*/
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;   //V4L2_BUF_TYPE_VIDEO_CAPTURE:1
    buf.memory = V4L2_MEMORY_MMAP;
    ioctl(v->fd, VIDIOC_DQBUF, &buf);

    write(file_fd, v->buf[buf.index].start, v->buf[buf.index].len);
    close(file_fd);

    /*buf入列*/
    ioctl(v->fd, VIDIOC_QBUF, &buf);
}
void v4l2_start_capture(struct v4l2_dev* v)
{
    enum v4l2_buf_type type;
    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    ioctl(v->fd, VIDIOC_STREAMON, &type);
}

struct cam* cam_sys_init()
{
    struct cam* cam = calloc(1, sizeof(struct cam));
    //1、初始化
    cam->v4_dev = v4l2_init();

    //2、开始采集
    v4l2_start_capture(cam->v4_dev);

}

 

posted @ 2020-08-04 14:35  打打打个大西瓜  阅读(122)  评论(0)    收藏  举报