手机版

基于嵌入式Linux远程图像监控系统的设计(3)

发布时间:2021-06-07   来源:未知    
字号:

嵌入式linux网络视频监控项目,非常实用,非常经典,值得学习

2010年第11期唐人财等:基于嵌入式Linux远程图像监控系统的设计 33

vdev传递的值对视频设备进行初始化,这是进行视频图像采集前必须完成的工作。视频设备结构体vdev包含了要设置的设备信息,初始化视频设备到适合的图像采集工作方式。视频设备初始化具体实现如下:

(1)打开摄像头设备文件。利用系统调用函数vdev >fd=open(vdev >dev_name,O_RDWR)实现,该函数的功能是打开参数vdev >dev_name指定的设备,对于摄像头用设备文件名 /dev/video0 表示,vdev >fd是设备打开后返回的文件描述符,在程序中可使用它来对设备文件进行操作。

(2)查询设备信息和设置采集属性。

在Linux编程中,ioctl函数是设备驱动程序中对设备的I/O进行管理的函数,用户程序一般使用ioctl函数来对设备的一些特性进行控制。

调用带VIDIOC_QUERYCAP命令参数的ioctl函数来取得设备文件的属性参数,并存储于structv4l2_capability结构体变量vdev >cap中,然后可逐项验证vdev >cap的属性,看设备是否符合采集的要求。

ioctl(vdev >fd,VIDIOC_QUERYCAP,&vdev >cap);

mem间建立映射,调用带VIDIOC_QBUF命令参数的ioctl函数将所申请的设备缓存加入等待输入缓存队

列,内存映射初始化完成。

3.3.3采集图像数据

函数capture(structvdevice*vdev)完成一帧视频图像数据采集,采集到的视频图像数据存放到设备缓存vdev >buf中,通过映射的程序内存空间可处理视频图像,函数调用成功返回视频设备采集的图像数据大小。

在设备缓存加入等待输入队列后,调用带VIDIOC_STREAMON命令参数的ioctl函数使能视频设备。

type=V4L2_BUF_TYPE_VIDEO_CAPTURE;ioctl(vdev >fd,VIDIOC_STREAMON,&type);

图像数据缓存采用FIFO的方式,缓存队列将已采集到视频图像数据的设备缓存出队列,此时与之映射的内存空间就存储了采集到的视频图像数据,处理完毕重新使设备缓存加入队列。这个过程需要调用两次ioctl函数。

ioctl(vdev >fd,VIDIOC_DQBUF,&vdev >buf);ioctl(vdev >fd,VIDIOC_QBUF,&vdev >buf);

接着设置视频图像采集格式,可根据需求修改摄像头缓冲区中图像参数如分辨率、格式等。具体方法

为先给structv4l2_format结构体变量vdev >fmt分量赋新值,再调用带VIDIOC_S_FMT命令参数的ioctl函数完成采集属性的设置。

ioctl(vdev >fd,VIDIOC_S_FMT,&vdev >fmt);

调用带VIDIOC_DQBUF命令参数的ioctl函数使

设备缓存出队列,利用系统函数memcpy将所采集的一帧视频图像数据拷贝的所分配的内存空间vdev >framebuffer以方便后续图像处理。然后调用带VIDIOC_QBUF命令参数的ioctl函数把设备缓存重新加入输入缓存队列,至此完成一帧视频图像数据采集。系统采用的摄像头初始化为YUV422图像格式,图像要在LCD上显示,必须进行图像数据格式转换处理,将YUV422格式转换为RGB24格式。

yuv2rgb24(vdev >framebuffer,vdev >rgbbuffer,vdev >width,vdev >height);

(3)实现内存映射。

V4L2捕获的数据是存放在内核空间的,用户不

能直接访问该段内存,必须通过某些手段来转换地址。系统采用mmap内存映射方式,把设备内存映射到用户程序内存空间,直接处理设备内存,加速了I/O访问。主要函数调用如下:

ioctl(vdev >fd,VIDIOC_REQBUFS,&vdev >rbuf);ioctl(vdev >fd,VIDIOC_QUERYBUF,&vdev >buf);vdev >mem[i]=mmap(0,vdev >bu.flength,PROT_READ,MAP_SHARED,vdev >fd,vdev >bu.fm.offset);

ioctl(vdev >fd,VIDIOC_QBUF,&vdev >buf);

函数yuv2rgb24将vdev >framebuffer指定内存

中的YUV422图像格式转换为RGB24格式,并存放到vdev >rgbbuffer指定内存中,函数实现在此不作详细阐述。

3.4图像数据的JPEG编解码

网络传输前对原始图像数据进行压缩处理,利用IJG(IndependentJPEGGroup)提供的libjpeg库进行

[4 6]

图像编解码。在开源的libjpeg库中,函数必须从文件或其他设备流中读取数据,再将压缩数据存成JPEG文件,增加了不必要的文件I/O操作,不利于网络实时传输图像。为解决该问题,改写了libjpeg库内jdatasrc.c和jdatads.tc两个源代码文件,设计自定义的结构体structmy_dest_mgr和structmy_src_mgr,具体实现:首先,对structv4l2_requestbuffers结

构体变量vdev >rbuf分量赋值,调用带VIDIOC_REQBUFS命令参数的ioctl函数分配自定义数量的设备缓存;然后,在循环程序结构中对申请分配的设备缓存进行映射,调用带VIDIOC_QUERYBUF命令参数的ioctl函数获得设备缓存偏移量和缓存大小并存于structv4l2_buffer结构体变量vdev >buf中,调用 >

基于嵌入式Linux远程图像监控系统的设计(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)