基于视频压缩的实时监控系统-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); }

浙公网安备 33010602011771号