版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘 要 本文提出了一种基于 arm 处理器的嵌入式图像视频监控系统的设计 方案。本系统采用华为海思 hi3515(arm926ej)为处理器,以嵌入式 linux 做为操作系统,通过基于 video4linuxvideo4linux 的 usbusb 摄像头进行图像 采集,最后显示在 lcd 显示屏。本文首先介绍了视频监控系统的时代背 景、实践意义和研究现状,并对嵌入式系统开发的基础理论知识做了简 单的介绍,在此基础上分析了视频监控系统的总体结构设计;然后分析 linux 操作系统的开发技术,包括开发环境的建立、bootloader 的移植、 linux 内核移植和根文件系统的制作,完成了利用
2、 usb 摄像头采集图像 的功能;然后介绍图像在 lcd 上的显示,并给出了最终的实验结果。 关键字关键字:海思hi3515;视频监控;video4linux ;图像采集 abstract this paper puts forward a designation of embedded images video monitoring system that based on the arm processor .this system use the huawei haisi (arm926ej) as the processor, with embedded linux as operat
3、ing system, through the usb camera that based on video4linux collect images, finally display on lcd screen. this thesis firstly introduces the research background, practical significance,research status and the basic theoretical knowledges of embedded system development on this basis gives the the o
4、verall structure desgin of this system;then it analyses carefully the technology of embedded linux system involve the development environment,bootloader,linux kernel and the root file system,and completes the image acquisition by usb camera;after that,it describes how to display the images on lcd an
5、d gives the final experimental results keywords:keywords: haisihi3515haisihi3515;video monitor;video4linux;image collection 目 录 目 录 .iii 1 1 绪绪 论论 .1 1.11.1 前前 言言 .1 1.21.2 课题研究背景与意义课题研究背景与意义 .1 1.2.1 课题研究背景课题研究背景.1 .2 课题研究意义课题研究意义.2 1.2.3 国内外研究现状.2 2 2 嵌入式系统的选择嵌入式系统的选择 .4 4 2.1.1 嵌入式系统的分类 .
6、4 2.1.2 嵌入式系统的选择 .6 3.1 bootloader移植.8 3.1.1 bootloader 介绍.8 .2 u-bootu-boot 移植移植.9 3.2 内核移植 .11 3.2.1 移植环境 .11 3.2.2 内核移植过程 .11 3.3 文件系统移植 .12 移植步骤:移植步骤:.12 4.1 video4linux简介 .13 4.2 video4linux 编程指南 .14 4.2.1.视频编程的流程 .14 4.2.2 定义的数据结构及使用函数 .14 4.2.3.video4linux 支持的数据结构及其用途.15 4.2.4 ioctl 函
7、数介绍.19 4.3 截取图象的方法 .20 4.3.1 用 mmap(内存映射)方式截取视频 .20 4.3.2 直接读设备 .22 5 5 图像在图像在 lcdlcd 屏上的显示屏上的显示 .2323 5.1 framebuffer的介绍.23 5.2 图像由 24 位图向 16 位图转换 .23 5.3 实物图 .24 6 6 结束语结束语 .2525 参考文献参考文献 .2626 致致 谢谢 .2727 1 1 绪绪 论论 1.11.1 前前 言言 嵌入式系统(embedded system) ,是一种“完全嵌入受控器件内部,为特定应 用而设计的专用计算机系统” ,根据英国电机工程师协
8、会的定义,嵌入式系统为控制、 监视或辅助设备、机器或用于运作的设备1。 随着网络技术和集成电路技术的高速发展,嵌入式系统已经成为it的一个焦点。 嵌入式图像采集系统大量的应用于自动控制、工业生产、军事技术和家用消费电子 等各个领域。 传统的图像采集方法是采用ccd摄像机获得视频信息,这种方法易于实现,但成 本较高。随着arm系列处理器应用的越来越广泛和基于linux的嵌入式技术的迅速发 展,利用linux自身带有的tcp/ip协议来实现远程监控和图像传输已经成为可能。 开发具有自主知识产权的嵌入式处理器,嵌入式操作系统和嵌入式高端产品, 对我国的民族工业来讲,将有十分重要的战略意义。 1.2课
9、题研究背景与意义课题研究背景与意义 1.2.1 课题研究背景课题研究背景 随着计算机技术的不断发展,人类步入网络时代以来,以“信息采集、处理、 监控”为核心的视频监控系统越来越广泛地应用于电视会议、可视电话、远程监控、 智能交通、智能小区等远程图像传输系统中。传统的视频监控系统一般基于pc机和 视频采集卡的形式,传统系统采集的图像品质不高、抗干扰能力差、系统体积大、 成本高、携带不便,在远距离通讯、多系统控制中很难实现。而采用基于dsp结合 fpga方式又需投入大量的人力和资金,成本高2。 在这种背景下,设计一种轻便小巧的系统来采集传输图像成为市场所需。 嵌入式linux操作系统具有可移植性好
10、、网络功能强、有优秀的gun编译工具支 持等优点,linux的开放源代码和免费的优点也使成本大大降低,嵌入式系统把微处 理器与其专用软件平台相结合,大大提高了操作系统的效率,采用usb接口的摄像头 在一定程度上突出了采样速率高、图像质量高、通用性好的特点。 基于上述原因,本文设计了一种新的视频采集处理系统基于arm和linux的 嵌入式视频监控系统。 .2 课题研究意义课题研究意义 本课题研究的是基于嵌入式linux的视频图像采集,利用市场上很常见的中星微 系列的usb摄像头来得到现场的图像数据,利用linux内核中的video4linux编程接口 函数采集,在pc机上和lcd
11、屏上实现了图像的实时显示。此类视频采集系统对于各个 领域都有重要的意义。 例如,在日常生活中,视频监控,智能交通和智能小区的发展,生物医学中的x 射线成像、染色体分类技术等,卫星遥感图像识别,办公自动化中的门禁系统、手 写识别、票据以及人民币的识别,以及工业视觉,虚拟现实等等领域,图像采集都 有着极其重要的应用3。 在军用方面。图像采集收集的情报通过无线传输到监控指挥中心,为战场行动 提供了重要的情报依据,在强大空中侦察下,我军能够及时掌握敌方的大规模行动, 其部署和移动很容易暴露,灵活、机动、可靠的情报搜集,战时能起到很好的侦察 保障功能,为决策人缘提供有力的决策依据。 在不就的将来,也许我
12、们能体验到,当我们在各种需要身份验证和识别时,需 要的不再是钥匙、密码,而仅仅是一个摄像头而已。试想,这项技术的发展将会给 我们的生活带来多么深远的影响。因此,研究图像采集及其处理有着重大的意义。 1.2.3 国内外研究现状 视频监控系统是安全防范系统的重要组成部分. 目前在国内外市场上,主要有 模拟视频监控和数字视频监控类产品. 传统的模拟监控系统技术已非常成熟,性能 稳定、应用广泛,但已不能满足人们日益增长的需要. 模拟视频信号的传输工具主 要是同轴电缆,通常只适合于小范围的区域监控;系统的扩展能力差,新的设备也 很难添加到原有的系统之中;由于各部分独立运作,相互之间的控制协议很难互通,
13、无法形成有效的报警联动,联动只能在有限的范围内进行4。 近年来,随着计算机、网络、图像处理以及传输技术的飞速发展,视频监控制 技术也有长足的进步,前端一体化、视频数字化、监控网络化、系统集成化是视频 监控系统公认的发展方向。本文基于这种发展趋势,提出了1 种性能高效、价格低 廉解决方案. 本方案采用pc机、高性能嵌入式设备以及先进的图像处理技术,通过 internet传输图像. 本系统的优点在于:数字监控系统可以在internet上传输图像 数据,基本上不受距离限制,信号不易受干扰,可大幅度提高图像品质和稳定性; 使数字化存储成为可能,经过压缩的视频数据可存储在磁盘阵列中或保存在光盘中, 查询
14、十分简便快捷;基于嵌入式技术,系统硬件和操作系统捆绑较为紧密,功能专 一,因此性能上更稳定,且便于安装、维护,易于实现系统的模块化设计,便于管 理3。 2 嵌入式系统的选择嵌入式系统的选择 2.1.1 嵌入式系统的分类 目前嵌入式操作系统种类繁多,有深嵌入系统,也有浅嵌入式系统;有多任务, 也有单任务系统;有实时系统,也有分时系统。其实,嵌入式操作系统是与应用环 境密切相关的,从应用范围角度来看,大致可以分为通用型的嵌入式操作系统如 windowsce、vxworks、嵌入式 linux 等和专用型的嵌入式操作系统如 palm0s、sysbian,smartphone 等。从实时性的角度看,又
15、可以分为两类。一类是 面向控制、通信等领域的实时操作系统,如 microsoft 公司得 windows ce、windriver 公司的 vxworks、isi 的 psos、qnx 系统软件公司的 qnx、ati 的 nucleus 等;另一类是面向消费电子产品的非实时操作系统,这类产品包括个人数 字助理(pda)、移动电话、机顶盒、电子书、webphone 等,如现在非常流行的 mierosoft 公司的 smartphone 操作系统等等。20 世纪 80 年代,商业化的嵌入式操 作系统开始得到蓬勃发展6。目前国内外已有几十种商业操作系统可供选择。 目前比较流行的嵌入式操作系统比较多,
16、对其中几类进行介绍如下7: (1)palm0s palm0s 是一种 32 位的嵌入式操作系统。palmos 提供了串行通信接口和红外线 传输接口,利用它可以方便地与其它外部设备通信;拥有开放的 0s 应用程序接口, 开发商可根据需要自行开发所需的应用程序。在个人数字助理(pda)市场上,palmos 是全球知名、使用人数最多的 pda 操作系统。 palmos 是一套具有极强开放性的系统,现在有大约数千种专门为 palmos 编写 的应用程序。 palmos 操作系统的一个最大的特点就是省电以及系统资源开销较少,而且第三 方应用程序非常丰富。由于 palmos 采用开放式架构,有很多 pal
17、mos 的使用者都投 入到软件开发工作中,这也是 palmos 操作系统成功的一个重要原因。 (2)vxworks vxworks 操作系统是美国 windriver 公司于 1983 年设计开发的一种嵌入式实时 操作系统。它的良好的持续发展能力、高性能的内核以及友好的用户开发环境,使 其在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性 被广泛地应用在通信、军事、航空、航天等高精度技术及实时性要求极高的领域中, 如卫星通讯、军事演习、弹道制导、飞机导航等。 vxworks 具有可靠性,良好的实时性,高度灵活的可裁减性等突出特点。 (3)uc/os uc/os 是美国人 j
18、ean labrosse 在 1992 年开发的一个嵌入式操作系统,并 于 1998 年推出它的升级版本 uc/os 。uc/os 是一种免费、开放源代码、结构 小巧、基于可抢占优先级调度的实时操作系统,其内核提供任务调度与管理、时间 管理、任务同步和通信、内存管理和中断服务等功能。 uc/os 主要面向中小型嵌入式系统,具有执行效率高、占用空间小、结构简 洁、实时性能优良和可扩展性强等特点,最小内核可编译至 2kb,一般情况下占用 10kb 数量级。它的内核本身并不支持文件系统,但它具有良好的扩展性能,如果需 要的话可以自行加入。由于免费、源码开放、规模较小,uc/os 不仅在众多的商 业领
19、域中获得了广泛的应用,而且被很多大学所接纳,作为教学用的嵌入式实时操 作系统。 (4)嵌入式 linux linux 现在已经是最为流行的一款开放源代码的操作系统。linux 是 1991 年由 芬兰人 linus torvalds 发明的,从诞生到现在的短短十几年的时间,linux 已经发 展成为一个功能强大、设计完善的操作系统,不仅在通用操作系统领域与 windows 等商业系统分庭抗争,而且在新兴的嵌入式操作系统领域也获得了飞速的发展。由 于 linux 系统本身是开放源码的,又是一种多任务、稳定性高、内核可裁减的操作 系统,它在嵌入式系统方面大放光芒。在各种嵌入式 linuxos 迅速
20、发展的状况下, linux 在嵌入式系统方面的发展速度和影响是任何一种操作系统不能比的。 嵌入式 linux 是在标准 linux 的基础上针对嵌入式系统进行内核裁减和优化后 形成的,使其体积更小、性能更高,同时,由于它是免费的,没有其它商业性嵌入 式操作系统需要的许可证费用,所以具有很强的市场竞争力。当前国家对研制自主 操作系统大力支持,为源码开放的 linux 的推广提供了广阔的发展前景。 (5)windows ce windows ce 是微软公司在嵌入式操作系统市场上的一个重要产品。它最早于 1996 年开始发行,但是最初并没有取得成功,直到 windows ce 3.0 以后他才真正
21、 被人们所接受。目前的最新版本为 windows ce.net。 windows ce 是一个 32 位的多线程、多任务的嵌入式操作系统,它经过压缩, 可以移植,能够开发多种企业和客户设备,其操作界面来源于 windows,但 windows ce 是基于 win32api 重新开发的、新型的信息设备平台。windows ce 具有模块化、 结构化和基于 win32 应用程序接口以及与处理器无关等特点,适用于各种嵌入系统 和产品。它的模块化设计方式使得系统开发人员和应用开发人员能够为多种多样的 产品来定制它。若开发者熟悉 windows 开发环境,可以基于 windows ce 开发出更好 的
22、应用程序。随着嵌入式系统逐渐深入生活,越来越多的嵌入式设备都应用 wince 系统8。 2.1.2 嵌入式系统的选择 多种嵌入式系统各有千秋,但是本课题研究选择了嵌入式 linux 系统,因为它 在嵌入式领域具有独特的优点。 嵌入式 linux 是将日益流行的 linux 操作系统进行裁剪修改,使之能在嵌入式 计算机系统上运行的一种操作系统。嵌入式 linux 既继承了 interlnet 上无限的开 放源代码资源,又具有嵌入式操作系统的特性。嵌入式 linux 的特点是版权费免费; 购买费用媒介成本技术支持全世界的自由软件开发者提供支持网络特性免费,而且 性能优异,软件移植容易,代码开放,有
23、许多应用软件支持,应用产品开发周期短, 新产品上市迅速,因为有许多公开的代码可以参考和移植,实时性能 rt_linux hardhat linux 等嵌入式 linux 支持,实时性能稳定性好安全性好9。 linux 做嵌入式的优势,首先,linux 是开放源代码的,不存在黑箱技术,遍布 全球的众多 linux 爱好者又是 linux 开发者的强大技术支持;其次,linux 的内核小、 效率高,内核的更新 嵌入式 linux 速度很快,linux 是可以定制的,其系统内核最小 只有约 134kb。第三,linux 是免费的 os,在价格上极具竞争力。 linux 还有着嵌 入式操作系统所需要的
24、很多特色,突出的就是 linux 适应于多种 cpu 和多种硬件平 台,是一个跨平台的系统。到目前为止,它可以支持二三十种 cpu。而且性能稳定, 裁剪性很好,开发和使用都很容易。很多 cpu 包括家电业芯片,都开始做 linux 的 平台移植工作。移植的速度远远超过 java 的开发环境。也就是说,如果今天用 linux 环境开发产品,那么将来换 cpu 就不会遇到困扰。同时,linux 内核的结构 在网络方面是非常完整的,linux 对网络中最常用的 tcp/ip 协议有最完备的支持。 提供了包括十兆、百兆、千兆的以太网络,以及无线网络,toker ring(令牌环网)、 光纤甚至卫星的支
25、持。所以 linux 很适于做信息家电的开发10。 3 3 软件平台的设计与实现软件平台的设计与实现 3.1 bootloader 移植 3.1.1 bootloader 介绍 系统引导程序通常称为boot loader,是在系统复位后执行的第一段软件代码, 相当于pc机上的bios。通常固化在硬件的某个固态存储结构中,上电后自启动。通 过bootloader这段代码,我们可以初始化硬件设备、建立内存空间的映射图,从而 将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正 确的环境。 bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不 同的boo
26、tloader.不过bootloader的发展也趋于支持多种体系结构,现在比较成熟的 有一下几种: (1)vivi vivi是由韩国mizi公司专门针对基于arm处理器的嵌入式系统开发的一种boot loader,因为vivi 目前只支持使用串口和主机通信,所以必须使用一条串口电缆来 连接目标板和主机。vivi一般有如下作用。 1)把内核(kernel)从flash复制到ram,然后启动它; 2)初始化硬件; 3)下载程序并写入flash; 4)检测目标板。 (2)redboot redboot也称红帽子嵌入式调试引导程序。redboot 是一个专门为嵌入式系统定 制的引导启动工具,最初由re
27、dhat开发,它是基于ecos(embedded configurable operating system)的硬件抽象层,同时它继承了ecos的高可靠性、简洁性、可配 置性和可移植性等特点。redboot集bootloader、调试、 flash烧写于一体,支持串 口、网络下载,执行嵌入式应用程序。既可以用在产品的开发阶段(调试功能) ,也 可以用在最终的产品上(flash更新、网络启动) 。redboot支持下载和调试应用程序, 开发板可以通过bootp/dhcp协议动态配置ip地址,支持跨网段访问。用户可以通过 tftp协议下载应用程序和image,或者通过串口用x-modem/y-mo
28、dem下载。redboot支 持用gdb(the gnu debugger)通过串口或者网卡调试嵌入式程序,可对gcc编译的 程序进行源代码级的调试。相比于简易jtag调试器,它可靠、高速(cpu的 cache打 开后,通过网卡tftp下载能达到1mbps,gdb下载的速度能达到2mbps) 、稳定,用户 可通过串口或网卡,以命令行的形式管理 flash上的image,下载image到flash。动 态配置redboot启动的各种参数、启动脚本,上电后redboot可自动从flash或 tftp 服务器上下载应用程序执行。 (3)u-boot u- boot是德国denx小组开发的用于多种嵌入
29、式cpu的bootloader程序,它可以 运行在基于powerpc、arm、mips等多种嵌入式开发板上。本linux系统的启动代码用 的是u-boot。 .2 u-bootu-boot 移植移植 要移植u-boot到嵌入式产品中,首先要在宿主机上编译配置u-boot,将u-boot 源代码编译成为可以在arm上执行的二进制文件,并烧写到实验箱上才能执行。本实 验系统采用将u-boot烧写到nand flash(smc卡)中进行启动。 移植过程如下: (1)在工作目录下解压uboot 输入命令:tar -xjvf u-boot-1.3.1.tar.bz2 (2)进入u-boo
30、t目录,修改makefile 输入以下命令:cd u-boot-1.3.1 vim makefile 为tekkaman2440建立编译项: sbc2410 x_config: unconfig $(mkconfig) $(:_config=) arm arm920t sbc2410 x null s3c24x0 tekkaman2440_config:unconfig $(mkconfig) $(:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0 各项的意思如下: arm: cpu的架构(arch) arm926ej: cpu的类型(cp
31、u),其对应于cpu/arm926ej子目录。 tekkaman2440: 开发板的型号,对应于board/tekkaman/tekkaman2440目录。 tekkaman: 开发者/或经销商(vender)。 s3c24x0: 片上系统(soc)。 同时在“ifndef cross_compile ”之前加上自己交叉编译器的路径,比如我使 用crosstool-0.43制作的基于2.6.24内核和gcc-4.1.1-glibc-2.3.2的arm9tdmi交叉 编译器,则: cross_compile=/home/tekkamanninja/working/gcc4.1.1/gcc-4.1
32、.1-glibc- 2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu- (3)在/board子目录中建立自己的开发板tekkaman2440目录 由于我在上一步板子的开发者/或经销商(vender)中填了 tekkaman ,所以开发 板tekkaman2440目录一定要建在/board子目录中的tekkaman目录下 ,否则编译会出 错。 tekkamanninjaarm9-host u-boot-1.3.1$ cd board tekkamanninjaarm9-host board$ mkdir tekkaman tekkaman/tek
33、kaman2440 tekkamanninjaarm9-host board$ cp -arf sbc2410 x/* tekkaman/tekkaman2440/ tekkamanninjaarm9-host board$ cd tekkaman/tekkaman2440/ tekkamanninjaarm9-host tekkaman2440$ mv sbc2410 x.c tekkaman2440.c 还要修改自己的开发板tekkaman2440目录下的makefile文件,不然编译时会出错: tekkamanninjaarm9-host tekkaman2440$ kwrite mak
34、efile cobjs := tekkaman2440.o flash.o 在include/configs/中建立配置头文件 tekkamanninjaarm9-host tekkaman2440$ cd ././. tekkamanninjaarm9-host u-boot-1.3.1$ cp include/configs/sbc2410 x.h include/configs/tekkaman2440.h (4)测试编译能否成功 1)配置 tekkamanninjaarm9-host u-boot-1.3.1$ make tekkaman2440_config configuring
35、for tekkaman2440 board. 2)测试编译 tekkamanninjaarm9-host u-boot-1.3.1$make 测试通过后进行下一步 3.2 内核移植 3.2.1 移植环境 交叉编译器:arm-linux-gcc 3.4.1 安装交叉编译器 3.2.2 内核移植过程 (1)下载压缩包:utu-linux_for_s3c2440_v1.5.3-2007-11-5.tar.bz2 (2)解压: tar xjvf utu-linux_for_s3c2440_v1.5.3-2007-11-5.tar.bz2 (3)配置及编译内核 make menuconfig:提供基于
36、ncurses图形界面的用户配置界面是字符的图形界 面, 出现如图所示的界面. (4)修改屏幕偏移 由于视频监控系统还设计到lcd屏的显示,所以要修改一下屏幕的偏移: 打开: /home/utu-linux_for_s3c2440_v1.5.3/arch/arm/mach-s3c2410/mach- utu2440.c 将寄存器3做如下修改即可: .lcdcon3 = s3c2410_lcdcon3_hbpd(55) | s3c2410_lcdcon3_hozval(319) | s3c2410_lcdcon3_hfpd(5), 完成内核配置后,执行如下命令:#make ulmage:创建内核
37、镜像文件ulmage,再 下载到tftp中。 在超级终端中执行以下命令即可:run install-kernel 图3.1 内核配置界面 3.3 文件系统移植 移植步骤:移植步骤: (1)拷贝制作yaffs文件下载镜像文件的工具mkyaffsimage到虚拟机 /utulinux/s3c2440下; (2)拷贝文件系统源代码压缩包s3c2440_recover.tar.bz2到虚拟机 /utulinux/s3c2440目录下; (3)解压缩s3c2440_recover.tar.bz2到目录/utulinux/s3c2440下; (4)输入命令:./mkyaffsimage s3c2440_r
38、ecover test.yaffs 生成test.yaffs,将test.yaffs改名为filesystem.yaffs下载到tftp中。 在超级终端中执行以下命令即可:run install-filesystem 4 图像采集程序设计图像采集程序设计 4.1 video4linux 简介 video4linux是linux中关于视频设备的内核驱动,他针对视频设备的应用程序 编程提供一系列接口函数,配合适当的视频采集设备和相应的驱动程序,可以实现 影像采集、am/fm广播、频道切换等功能,在远程会议、可视电话、视频监控系统中 有着广泛的应用。 在linux下,所有外设都被看成是一种特殊的文件
39、,称之设备文件,这里只要针 对的设备文件是/dev/video0,进行视频图像采集方面的程序设计。 基于vide04linux的图像采集的程序流程如图4.1所示。 开始 开启设备 获取设备信息和图 像信息 对采集缓冲区进行 内存映射 捕捉视频数 据 图像数据处 理 采集中止? 关闭设备 结束 n y 图4.1 图像采集流程图 4.2 video4linux 编程指南 4.2.1.视频编程的流程 (1)打开视频设备: (2)读取设备信息 (3)更改设备当前设置(可以不做) (4)进行视频采集,两种方法: 1)内存映射 2)直接从设备读取 (5)对采集的视频进行处理 (6)关闭视频设备。 4.2.
40、2 定义的数据结构及使用函数 struct _v4l_struct int fd; struct video_capability capability; struct video_buffer buffer; struct video_window window; struct video_channel channel8; struct video_picture picture; struct video_mmap mmap; struct video_mbuf mbuf; unsigned char *map; ; typedef struct _v4l_struct v4l_devi
41、ce; extern int v4l_open(char *, v4l_device *); extern int v4l_close(v4l_device *); extern int v4l_get_capability(v4l_device *); extern int v4l_set_norm(v4l_device *, int); extern int v4l_get_picture(v4l_device *); extern int v4l_grab_init(v4l_device *, int, int); extern int v4l_grab_frame(v4l_device
42、 *, int); extern int v4l_grab_sync(v4l_device *); extern int v4l_mmap_init(v4l_device *); extern int v4l_get_mbuf(v4l_device *); extern int v4l_get_picture(v4l_device *); extern int v4l_grab_picture(v4l_device *, unsigned int); extern int v4l_set_buffer(v4l_device *); extern int v4l_get_buffer(v4l_d
43、evice *); extern int v4l_switch_channel(v4l_device *, int); 4.2.3.video4linux 支持的数据结构及其用途 (1)video_capability 包含设备的基本信息(设备名称、支持的最大最小分辨 率、信号源信息等) name32 设备名称 maxwidth maxheight minwidth minheight channels 信号源个数 type 是否能capture , 彩色还是黑白, 是否能裁剪等等。值如 vid_type_capture等 (2)video_picture 设备采集的图象的各种属性 brigh
44、tness 065535 hue colour contrast whiteness depth 8 16 24 32 palette video_palette_rgb24 | video_palette_rgb565| video_palette_jpeg| video_palette_rgb32 (3)video_channel 关于各个信号源的属性 channel 信号源的编号 name tuners type video_type_tv | ideo_type_camera norm 制式 pal|nstc|secam|auto (4)video_window 包含关于capture
45、 area的信息 x x windows 中的坐标. y y windows 中的坐标. width the width of the image capture. height the height of the image capture. chromakey a host order rgb32 value for the chroma key. flags additional capture flags. clips a list of clipping rectangles. (set only) clipcount the number of clipping rectangle
46、s. (set only) (5)video_mbuf 利用mmap进行映射的帧的信息 size 每帧大小 frames 最多支持的帧数 offsets 每帧相对基址的偏移 (6)video_mmap 用于mmap 关键步骤 1)打开视频: int v4l_open(char *dev, v4l_device *vd) if (!dev) dev = ”/dev/video0”; if (vd -fd = open(dev, o_rdwr) capability各分量 int v4l_get_capability(v4l_device *vd) if (ioctl(vd -fd, vidioc
47、gcap, if(ioctl(vd-fd, vidiocspict, for (i = 0; i capability.channels; i+) vd -channeli.channel = i; if (ioctl(vd -fd, vidiocgchan, return 0; 5 4.2.4 ioctl 函数介绍 从上面代码段中可以看到ioctl函数频繁的出现,下面我们来介绍一下ioctl函 数。 ioctl用于向设备发控制和配置命令 ,有些命令也需要读写一些数据,但这些 数据是不能用read/write读写的,称为out-of-band数据。也就是说,read/write读 写的数据是i
48、n-band数据,是i/o操作的主体,而ioctl命令传送的是控制信息,其中 的数据是辅助的数据。ioctl是设备驱动程序中对设备的i/o通道进行管理的函数,所 谓对i/o通道进行管理,就是对设备的一些特性进行控制,例如,在串口线上收发数 据通过read/write操作,而串口的波特率、校验位、停止位通过ioctl设置,a/d转 换的结果通过read读取,而a/d转换的精度和工作频率通过ioctl设置。 ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对 ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的i/o通道。 如果不用ioctl的话,也可以实现对
49、设备i/o通道的控制,但那就是蛮拧了。例 如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过, 如果有的话,那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是 如果这样做的话,会导致代码分工不明,程序结构混乱, 程序员自己也会头昏眼花的。 所以,我们就使用ioctl来实现控制的功能 。要记住,用户程序所作的只是通 过命令码告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令, 这都是驱动程序要做的事情。 int ioctl(int fd, ind cmd, );7 4.3 截取图象的方法 4.3.1 用 mmap(内存映射)方式截取视频 在
50、这部分涉及到下面几个函数,它们配合来完成最终图像采集的功能。extern int v4l_mmap_init(v4l_device *):该函数把摄像头图像数据映射到进程内存中, 也就是只要使用 vd-map 指针就可以使用 采集到的图像数据。extern int v4l_grab_init(v4l_device *, int, int):该函数完成图像采集前的初始化工作。 extern int v4l_grab_frame(v4l_device *, int):该函数是真正完成图像采集的 一步,在本文使用了一个通常都会使用的一个小技巧,可以在处理一帧数据时同时 采集下一帧的数据,因为通常我们
51、使用的摄像头都可以至少存储两帧的数据。 extern int v4l_grab_sync(v4l_device *):该函数用来完成截取图像的同步工作, 在截取一帧图像后调用,返回表明一帧截取结束6。 mmap( )系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文 件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必 再调用read(),write()等操作。两个不同进程a、b共享内存的意思是,同一块物 理内存被映射到进程a、b各自的进程地址空间。进程a可以即时看到进程b对共享内 存中数据的更新,反之亦然。 采用共享内存通信的一个显而易见的好处是效率高,因为进
52、程可以直接读写内 存,而不需要任何数据的拷贝。 1、设置picture的属性 2、 初始化video_mbuf,以得到所映射的buffer的信息 ioctl(vd-fd, vidiocgmbuf, 若调用成功,开始一帧的截取,是非阻塞的,是否截取完毕留给vidiocsync来判 断 6、调用vidiocsync等待一帧截取结束 if(ioctl(vd-fd, vidiocsync, 返回值为实际读写的字符数 int len ; unsigned char *vd-map= (unsigned char *) malloc(vdcapability.maxwidth*vdcapability.m
53、axheight ); len = read(vdfd,vd vd-map, vdcapability.maxwidth*vdcapability.maxheight* 5 图像在图像在 lcd 屏上的显示屏上的显示 5.1 framebuffer 的介绍 framebuffer 在 linux 中是作为设备来实现的,它是对图形硬件的一种抽象1, 代表着显卡中的帧缓冲区(framebuffer)。通过 framebuffer 设备,上层软件可以 通过一个良好定义的软件接口访问图形硬件,而不需要关心底层图形硬件是如何工 作的,比如,上层软件不用关心应该如何读写显卡寄存器,也不需要知道显卡中的 帧
54、缓冲区从什么地址开始,所有这些工作都由 framebuffer 去处理,上层软件只需 要集中精力在自己要做的事情上就是了。 framebuffer 的优点在于它是一种低级的通用设备,而且能够跨平台工作,比 如 framebuffer 既可以工作在 x86 平台上,也能工作在 ppc 平台上,甚至也能工作 在 m68k 和 sparc 等平台上,在很多嵌入式设备上 framebuffer 也能正常工作。诸如 minigui 之类的 gui 软件包也倾向于采用 framebuffer 作为硬件抽象层(hal)。 从用户的角度来看,framebuffer 设备与其它设备并没有什么不同。 frameb
55、uffer 设备位于/dev 下,通常设备名为 fb*,这里*的取值从 0 到 31。对于常 见的计算机系统而言,32 个 framebuffer 设备已经绰绰有余了(至少作者还没有看 到过有 32 个监视器的计算机)。最常用到的 framebuffer 设备是/dev/fb0。通常, 使用 framebuffer 的程序通过环境变量 framebuffer 来取得要使用的 framebuffer 设备,环境变量 framebuffer 通常被设置为”/dev/fb0”。 从程序员的角度来看,framebuffer 设备其实就是一个文件而已,可以像对待 普通文件那样读写 framebuffer 设备文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淮阴师范学院《室内系统设计》2022-2023学年第一学期期末试卷
- 淮阴师范学院《网球》2022-2023学年第一学期期末试卷
- 淮阴师范学院《国学经典选读》2022-2023学年第一学期期末试卷
- 淮阴工学院《数据通信技术》2022-2023学年第一学期期末试卷
- 淮阴师范学院《播音与主持》2022-2023学年第一学期期末试卷
- DB3707121-2024小麦良种生产技术规程
- 低温仓储与食品冷链物流考核试卷
- 光纤激光器的原理与应用考核试卷
- 初等教育中的科学教育与创新考核试卷
- 电气设备安装安装调试考核试卷
- 《大医精诚》说课(新)
- 牛羊屠宰管理办法
- 《微观经济学》课程思政教学案例(一等奖)
- DBJ50T-232-2016 建设工程监理工作规程
- 国际人力资源管理课程教学大纲
- 深信服园区级双活数据中心
- T-CSCS 016-2021 钢结构制造技术标准
- DB37∕T 5031-2015 SMC玻璃钢检查井应用技术规程
- 回弹强度对应表
- DB32T 3713-2020 高速公路建设工程施工班组管理规范
- (完整版)气管插管技术PPT课件
评论
0/150
提交评论