搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
@kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)_storageclass hostpath
2
linux内核 sleep,linux 下实现sleep详解及简单实例
3
Spring5 源码阅读笔记(4.1)事务切面的 invoke_invoke 事务
4
chromedriver驱动的下载和安装!亲测有效!_chromedriver下载地址
5
Mac 出现zsh: command not found: pnpm解决方法:环境配置
6
Python河南郑州二手房源爬虫数据可视化分析大屏全屏系统 开题报告_河南省二手房可视化
7
时钟显示 html JavaScript
8
到底是Go+还是狗屁?-- 基础语法学习(附go/go+/python示例)_go 还是go+
9
浮点数取绝对值的方法_c语言浮点数绝对值
10
win系统下Eric6的配置
当前位置:
article
> 正文
Video4Linux简介_video4linux: frame mapping timeout (11)
作者:知新_RL | 2024-03-18 12:44:48
赞
踩
video4linux: frame mapping timeout (11)
Video4Linux(简V4L)是Linux中关于视频设备的内核驱动,它为针对视频设备的应用程序编 程提供一系列接口函数,这些视频设备包括现今市场上流行的TV卡、视频捕捉卡和USB摄像头等。对于USB口摄像头,其驱动程序中需要提供基本的I/O操 作接口函数open、read、write、close的实现。
对中断的处理实现,内存映射功能以及对I/O通道的控制接口函数ioct1的实现等,并把 它们定义在struct file_operations中。这样当应用程序对设备文件进行诸如open、close、read、write等系统调用操作时,Linux内核将通 过file_operations结构访问驱动程序提供的函数。例如,当应用程序对设备文件执行读操作时,内核将调用file_operations结构 中的read函数。在系统平台上对USB口数码摄像头驱动,首先把USB控制器驱动模块静态编译进内核,使平台中支持USB接口,再在需要使用摄像头采集 时,使用insmode动态加载其驱动模块,这样摄像头就可正常工作了,接着进行了下一步对视频流的采集编程。
程序中定义的数据结构
struct video_capability grab_cap;
struct video_picture grab_pic;
struct video_mmap grab_buf;
struct video_mbuf grab_vm;
这些数据结构都是由Video4Linux支持的,它们的用途如下:
*video_capability包含摄像头的基本信息,例如设备名称、支持的最大最小分辨率、信号源信息等,分别对应着结构体中成员变量name [32]、maxwidth、maxheight、minwidth、minheight、channels(信号源个数)、type等;
*voide_picture包含设备采集图像的各种属性,如brightness(亮度)、hue(色调)、contrast(对比度)、whiteness(色度)、depth(深度)等;
*video_mmap用于内存映射;
*video_mbuf利用mmap进行映射的帧信息,实际上是输入到摄像头存储器缓冲中的帧信息,包括size(帧的大小)、frames(最多支持的帧数)、offsets(每帧相对基址的偏移)。
程序中用到的主要系统调用函数有:open("/dev/voideo0",int flags)、close(fd)、mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset)、munmap(void *start,size_tlength)和ioctl(int fd,int cmd,…)。
前面提到Linux系统中把设备看成设备文件,在用户空间可以通过标准的I/O系统调用函数操作设备文件,从而达到与设备通信交互的目的。当然,在设备驱动中要提供对这些函数的相应支持。这里说明一下ioctl(int fd,int cmd,…)函数,它在用户程序中用来控制I/O通道,其中,fd代表设备文件描述符,cmd代表用户程序对设备的控制命令,省略号一般是一个表示类型长度的参数,也可没有。
(2)采集程序实现过程
首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数grab_fd=open("/dev/video0", O_RDWR),grab_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使用它来对设备文件进行操作了。接着,利用 ioctl(grab_fd,VIDIOCGCAP,&grab_cap)函数读取struct video_capability中有关摄像头的信息。该函数成功返回后,这些信息从内核空间拷贝到用户程序空间grab_cap各成员分量中,使用 printf函数就可得到各成员分量信息,例如printf("maxheight=%d",grab_fd.maxheight)获得最大垂直分辨率的 大小。不规则用ioctl(grab_fd,VIDIOCGPICT,&grab_pic)函数读取摄像头缓冲中voideo_picture信息。在用户空间程序中可以改变这些信息,具体方法为先给分量赋新值,再调用VIDIOCSPICT ioctl函数,例如:
grab_fd.depth=3;
if(ioctl(grab_fd,VIDIOCSPICT,&grab_pic)<0)
{perror("VIDIOCSP[1]ICT");return -1;};
完成以上初始化设备工作后,就可以对视频图像截取了,有两种方法:一种是read()直接读取;另外一种mmap()内存映射。Read()通过内核缓冲 区来读取数据;而mmap()通过把设备文件映射到内存中,绕过了内核缓冲区,最快的磁盘访问往往还是慢于最慢的内存访问,所以mmap()方式加速了 I/O访问。另外,mmap()系统调用使得进程之间通过映射同一文件实现共享内存,各进程可以像访问普通内存一样对文件进行访问,访问时只需要使用指针 而不用调用文件操作函数。因为mmap()的以上优点,所以在程序实现中采用了内存映射方式,即mmap()方式。
利用mmap()方式视频裁取具体进行操作如下。
①先使用ioctl(grab_fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式。可利用如下语句
grab_buf.height=240;
grab_buf.width=320;
grab_buf.format=VIDEO_PALETTE_RGB24;
②接着把摄像头对应的设备文件映射到内存区,具体使用grab_data=(unsigned char*)mmap(0,grab_vm.size,PROT_READ|PROT_WRITE,MAP_SHARED,grad_fd,0)操作。这 样设备文件的内容就映射到内存区,该映射内容区可读可写并且不同进程间可共享。该函数成功时返回映像内存区的指针,挫败时返回值为-1。
下面对单帧采集和连续帧采集进行说明:
*单帧采集。在上面获取的摄像头存储缓冲区帧信息中,最多可支持的帧数(frames的值)一般为两帧。对于单帧采集只需设置 grab_buf.frame=0,即采集其中的第一帧,使用ioctl(grab_fd,VIDIOCMCAPTURE,&grab_buf) 函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的。接着使用ioctl(grab_fd,VIDIOCSYNC,&frame) 函数判断该帧图像是否截取完毕,成功返回表示截取完毕,之后就可把图像数据保存成文件的形式。
*连续帧采集。在单帧的基础上,利用grab_fd.frames值确定采集完毕摄像头帧缓冲区帧数据进行循环的次数。在循环语句中,也是使用VIDIOCMCCAPTURE ioct1和VIDIOCSYNC ioctl函数完成每帧截取,但要给采集到的每帧图像赋地址,利用语句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要继续采集可再加一个外循环,在外循环语句只要给原来的内循环再赋frame=0即可。
4 小结
笔者最后在宿主机PC上使用交叉编译器编译链接连续帧采集程序(以双帧采集为例并保存成bmp文件文件形式)使之生成可执行代码,并完成了向目标平台的移 植。为了进一步观察采集的图像效果,笔者在目标平台带网络支持的基础上,编写了一个简单的网络通信程序,把采集到并保存为bmp的图像文件通过网络传输到 PC机上进行显示,把采集到并保存为bmp的图像文件通过网络传输到PC机上进行显示,通过对效果的分析,再回到采集程序中重新设置 video_picture中的信息,如亮度、对比度等和video_mmap中的分辨率,重新移植以达到最好效果为准。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/263137
推荐阅读
article
net
/
http
:
request
canceled
while
waiting for conne...
windows 10 下安装docker desktop:拉取nginx测试:docker pull nginx报错:G...
赞
踩
article
Mac下
Android
studio
关联
svn
以及取消关联_
android
studio
versi...
Mac下使用
Android
Studio开发
Android
,如何关联
svn
以及取消关联呢?一.关联
svn
。在关联
svn
之...
赞
踩
article
(八)IT
_
开发
常用单词大全
_
replace
with
precise
mapping
annota...
开发
单词 单词 音标 注释 a collection of… ...
赞
踩
article
GooglePlay上架流程_
google
play
mapping
上传
...
上传
准备阶段1.需要生成aab包 使用
上传
签名文件签名后可以
上传
到
google
play
管理台2.如果是第一次新建项目 签...
赞
踩
article
@
RequestMapp
i
ng
、@GetMapp
i
ng、@PostMapp
i
ng_use prec
i
...
@
RequestMapp
i
ng
你可以使用@
RequestMapp
i
ng
注解来将请求URL,如/appo
i
ntments等...
赞
踩
article
@g
e
t<
e
m>mapp
i
ng
e
m> @post<
e
m>mapp
i
ng
e
m> @r
e
qus
e
t<
e
m>mapp
i
ng
e
m>_us
e
pr
e
c
i
...
@R
e
qu
e
stMapp
i
ng一般情况下都是用@R
e
qu
e
stMapp
i
ng(m
e
thod=R
e
qu
e
stM
e
thod....
赞
踩
article
canvas
保存图片时,谷歌浏览器
Chrome
报错【
解决方案
】Not allowed
to
navi...
通过 cnv.
to
Data
URL
(“image/png”) 可以将
canvas
画布转换为 base64格式的图片字符...
赞
踩
article
django1.8 缓存_
djagno
cache
timeout
不
超时...
本文翻译自django1.8.2的官方文档django’s
cache
framework一个动态站点最基本的特点是,嗯...
赞
踩
article
【已
解决
】
HttpWebRequest
的
GetResponse
或
GetRequestStream
偶尔...
https://www.crifan.com/fixed_problem_sometime_http
webrequest
...
赞
踩
article
[
UIScreen
mainScreen].
bounds
.
size
.
width
和
self
.
view
...
self
.
view
.
frame
.
size
.
width
在导航栏titleView计算
frame
时会出现宽度不准确的情况,布...
赞
踩
article
ROS
:使用
usb
_cam软件包调试
usb
摄像头
_
169video4linux
: frame map...
0x00
usb
_cam软件包简介为了丰富机器人与外界的交互方式,我们已经增加了与机器人的语音交互方式,不仅使机器人能够...
赞
踩
article
video4linux
(
v4l
)
使用
摄像头
的
实例
基础教程
与体会(二)...
前面已经说过
使用
v4l
视频编程
的
流程和对文件操作并没有什么本质
的
不同,大概
的
流程如下: 1.打开视频设备(通常是/de...
赞
踩
article
video4linux
(
v4l
)使用摄像头的实例
基础教程
与体会(四)_
video4linux
: fr...
获得图像前的初始化工作
v4l
_grab_init();该函数十分简单直接粘上去,其中将。vd->
frame
_using[...
赞
踩
article
video4linux
简介_
video4linux
:
frame
mapping
timeout
(...
1.什么是
video4linux
Video4linux_
video4linux
:
frame
mapping
timeo...
赞
踩
相关标签
docker desktop
registry-mirror
docker
android studio
svn
mac
java
python
c语言
上架
android
spring boot
spring
restful
http
canvas
django
ros
USB摄像头
video
linux
struct
图像处理
存储