完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目前,英创公司在低成本核心板ESM6800的基础上,推出了支持摄像头的版本ESM6800V,ESM6800V是在ESM6800H的基础上,去掉了一路网口和6路扩展串口,增加了一路CSI(COMS Sensor Interface)信号接口。ESM6800V的其它系统及接口配置与ESM6800完全相同。CSI是一个标准的视频输出接口,视频处理芯片可以直接输出,不需要涉及到USB接口摄像头所需的视频压缩芯片以及USB接口芯片,所以较市面上普通的USB摄像头来说,CSI接口的摄像头更便宜,配合ESM6800V形成了一个低成本的图像应用方案。 ESM6800的内核版本为Linux-4.1.15,同时英创公司在ESM6800上移植了基于xcb(X11)平台的Qt-5.8.0,关于Qt和X11的介绍,可以参考网站文章《ESM6802 X11桌面图形系统简介》。CSI摄像头选用Omnivision公司130万像素的ov9652(最高分辨率1280×1024)和500万像素的ov5640(最高分辨率2560×1920),在ESM6800V的系统中已经集成了这两款摄像头的驱动,并且能够自动识别并加载相应的驱动,加载驱动后会自动生成设备节点:“/dev/video0",应用程序可以操作该设备节点对摄像头进行图像的采集和控制。 CSI摄像头都是用了V4L2驱动提供的标准API来操作的。Video for Linux 2简称V4L2,是V4L的改进版。本例中采集的图像分辨率为640×480,接下来就来介绍一下主要的操作,首先打开设备文件: int fd; fd=open("/dev/video0",O_RDWR); 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等: /*set the form of camera capture data*/ tv_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; /*v4l2_buf_typea,camera must use V4L2_BUF_TYPE_VIDEO_CAPTURE*/ tv_fmt.fmt.pix.width = 640; /*设置图形分辨率,水平:640 像素*/ tv_fmt.fmt.pix.height = 480; /*设置图形分辨率,垂直:480 像素*/ tv_fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; /*V4L2_PIX_FMT_YYUV*/ tv_fmt.fmt.pix.field = V4L2_FIELD_NONE; /*V4L2_FIELD_NONE*/ if (ioctl(fd, VIDIOC_S_FMT, &tv_fmt)< 0) { fprintf(stderr,"VIDIOC_S_FMT set errn"); exit(-1); close(fd); }
向驱动申请帧缓冲,一般不超过五个: struct v4l2_requestbuffers req; req.count=2; req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory=V4L2_MEMORY_MMAP; //申请帧缓冲 ret=ioctl(fd,VIDIOC_REQBUFS,&req); if(ret<0) { printf("failture VIDIOC_REQBUFSn"); return -1; } 将申请到的帧缓冲映射到用户空间,这样就能够直接操作帧缓冲了: for (n_buffers = 0; n_buffers < req.count; ++n_buffers) { struct v4l2_buffer buf; memset(&buf,0,sizeof(buf)); buf.type =V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory =V4L2_MEMORY_MMAP; buf.index =n_buffers; // 查询序号为n_buffers 的缓冲区,得到其起始物理地址和大小 if (-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf)) { printf("failture VIDIOC_QUERYBUFn"); return -1; } buffers[n_buffers].length= buf.length; // 映射内存 buffers[n_buffers].start=mmap (NULL,buf.length,PROT_READ | PROT_WRITE ,MAP_SHARED,fd, buf.m.offset); if (MAP_FAILED == buffers[n_buffers].start) { printf("failture mmapn"); return -1; } } 开始视频的采集: type =V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl (fd,VIDIOC_STREAMON, &type);
struct v4l2_buffer camera_buf; CLEAR (camera_buf); camera_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; camera_buf.memory = V4L2_MEMORY_MMAP; //取出一个缓冲帧 i1 = ioctl (fd, VIDIOC_DQBUF, &usr_buf); if(i1<0) { printf("failturen"); return -1; } 例程的效果如下: 所以通过这一套通用的V4L2接口来操作摄像头的工作流程就能够读取摄像头的数据了,基于CSI接口摄像头,英创公司提供了一套完整的应用方案,有兴趣的客户请点击下载:《ESM6800V支持CSI接口摄像头》。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 21:21 , Processed in 0.570991 second(s), Total 59, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号