[国嵌攻略][171][V4L2图像编程接口深度学习]
V4L2摄像编程模型
1.打开摄像头设备文件
2.获取驱动信息-VIDIOC_QUERYCAP
3.设置图像格式-VIDIOC_S_FMT
4.申请帧缓冲-VIDIOC_REQBUFS
5.获取帧缓冲的地址长度信息-VIDIOC_QUERYBUF
6.使用mmap把内核空间的帧缓冲映射到用户空间
7.帧缓冲入队列-VIDIOC_QBUF
8.开始采集图像-VIDIOC_STREAMON
9.取出帧缓冲(出队)-VIDIOC_DQBUF
10.访问帧缓冲
11.帧缓冲重新入队-VIDIOC_QBUF
USB摄像头驱动工作流程
摄像头驱动从输入队列中取出一个帧缓冲,放到输出队列中。
应用程序从输出队列中取出一个帧缓冲,读取数据后,再把帧缓冲放入输入缓存中。
camera.c
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/videodev2.h> struct buffer{
void *start; //帧缓冲地址
int length; //帧缓冲长度
}; int main(int argc, char **argv){
//创建图片文件
int fd_img; fd_img = open("img.jpg", O_RDWR | O_CREAT, ); //打开设备文件
int fd_dev; fd_dev = open("/dev/video0", O_RDWR | O_NONBLOCK, ); //获取驱动信息
struct v4l2_capability cap; ioctl(fd_dev, VIDIOC_QUERYCAP, &cap); printf("Driver name:%s\nCard name:%s\nBus info:%s\n\n", cap.driver, cap.card, cap.bus_info); //设置图像格式
struct v4l2_format fmt; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = ;
fmt.fmt.pix.height = ;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; ioctl(fd_dev, VIDIOC_S_FMT, &fmt); //申请图像缓冲
struct v4l2_requestbuffers req; req.count = ;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP; ioctl(fd_dev, VIDIOC_REQBUFS, &req); //映射用户空间
int i;
struct buffer *buffs;
struct v4l2_buffer buff; buffs = calloc(req.count, sizeof(*buffs)); for(i = ; i < req.count; i++){
//获取缓冲长度
buff.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buff.memory = V4L2_MEMORY_MMAP;
buff.index = i; ioctl(fd_dev, VIDIOC_QUERYBUF, &buff); buffs[i].length = buff.length; //映射缓冲地址
buffs[i].start = mmap(NULL, buff.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd_dev, buff.m.offset);
} //图像缓冲入队
for(i = ; i < req.count; i++){
buff.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buff.memory = V4L2_MEMORY_MMAP;
buff.index = i; ioctl(fd_dev, VIDIOC_QBUF, &buff);
} //捕获图像数据
enum v4l2_buf_type type; type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
ioctl(fd_dev, VIDIOC_STREAMON, &type); //等待捕获完成
fd_set fds; FD_ZERO(&fds);
FD_SET(fd_dev, &fds); select(fd_dev + , &fds, NULL, NULL, NULL); //图像缓冲出队
buff.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buff.memory = V4L2_MEMORY_MMAP; ioctl(fd_dev, VIDIOC_DQBUF, &buff); //读取图像数据
write(fd_img, buffs[buff.index].start, buffs[buff.index].length); //图像缓冲入队
ioctl(fd_dev, VIDIOC_QBUF, &buff); //释放用户空间
for(i = ; i < req.count; i++){
munmap(buffs[i].start, buffs[i].length);
} //关闭打开文件
close(fd_dev);
close(fd_img); printf("Camera done!\n"); return ;
}
[国嵌攻略][171][V4L2图像编程接口深度学习]的更多相关文章
- 阶段2-新手上路\项目-移动物体监控系统\Sprint2-摄像头子系统开发\第2节-V4L2图像编程接口深度学习
参考资料: http://www.cnblogs.com/emouse/archive/2013/03/04/2943243.htmlhttp://blog.csdn.net/eastmoon5021 ...
- [国嵌攻略][090][linux网络编程模型]
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
- [国嵌攻略][077][Linux时间编程]
时间类型 Coordinated Universal Time(UTC):世界标准时间,也就是格林威治时间(Greenwich Mean Time, GMT). Calendar Time:日历时间, ...
- [国嵌攻略][070-095][Linux编程函数手册]
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...
- [国嵌攻略][137][DM9000网卡驱动编程]
DM9000数据发送 DM9000数据发送函数是在/drivers/net/dm9000.c中的dm9000_start_xmit函数 static int dm9000_start_xmit(str ...
- [国嵌攻略][045-046][一跃进入C大门]
[一跃进入C大门] 跳转方式 1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转 2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转 代码编写 1.在汇编代码中直接使用 ...
- [国嵌攻略][153][I2C裸机驱动设计]
eeprom简介 eeprom电可擦除可编程只读存储器,是一种类似于flash的固态存储器,但是与flash相比又存在一些区别: 1.eeprom可以按位擦写,而flash只能大片擦除. 2.eepr ...
- [国嵌攻略][142][LCD驱动程序架构]
LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的 ...
- [国嵌攻略][061][2440LCD驱动设计]
LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...
随机推荐
- Linux第六节随笔 输入输出重定向 、管道、通配符、wc / grep / tr / sort / cut / which /whereis /locate /find /
三期第五讲 -高级文件管理1.输入输出重定向 ls -l /dev/stdin -> /proc/self/fd/0 标准输入 设备:键盘 标记:0 ls -l /dev/stdout -> ...
- Jmeter+Ant+Jenkins接口自动化测试(一)_环境部署
前言: 2017年最后一个月份,今天抽出时间把之前的一些记录分享出来,也为今年画上个简单的句号吧,无论好与坏,无论成功与失败,简单的记忆,不要留下点点空白. 特别提示: 知识是用来分享的,但是也要尊重 ...
- 在win7下用net命令无法实现对用户的创建(未完成)
============================================================================================= 201307 ...
- JavaScript函数补完:toString()
javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...
- errcode 4103 invalid page hint 小程序模板消息推送遇到的坑
invalid page hint一直提示这个坑爹的就是,我的小程序没发布之前,也就是测试版本用这个格式是可以的 /pages/myGroup/myGroup?groupid=22***但是发布成功以 ...
- 豹哥嵌入式讲堂:ARM开发之文件详解(3)- project文件
大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的project文件. 前面两节课里,豹哥分别给大家介绍了嵌入式开发中的两种典型input文件:source文件.linker文 ...
- MVC WebAPI自动生成帮助文档(转)
注意点: 1.mvc的控制器必须继承于ApiController,否则看不到的 2. 简单查看xml,根据第二步即可生成xml,可视感比较低,但是内容全部有,不限定于Api 以下为转载正文 ===== ...
- Micropython实战之TPYBoardv102 DIY金属检测仪
转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一 ...
- Oracle死锁情况
ORACLE EBS操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 复制代码 代码如下: --锁表 ...
- 那些年原生js实现的楼层跳转
最近做一个需求~~楼层跳转(京东.淘宝侧边导航),由于现在项目都用框架,所以 jquery是不能再用了,只好自己原生写一个,其实实现起来很简单,无非就是获取到每个楼层距离文档顶部的距离,然后通过控制滚 ...