基于嵌入式Linux远程图像监控系统的设计(3)
发布时间:2021-06-07
发布时间: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中,调用 >
上一篇:2014年石化乙烯行业分析报告
下一篇:主机板维修手册-