手势识别控制音视频和图像播放系统设计与实现_第1页
手势识别控制音视频和图像播放系统设计与实现_第2页
手势识别控制音视频和图像播放系统设计与实现_第3页
手势识别控制音视频和图像播放系统设计与实现_第4页
手势识别控制音视频和图像播放系统设计与实现_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京理工大学珠海学院2020届本科生毕业设计手势识别控制音视频和图像播放系统设计与实现摘要基于ARM-cortex-A53开发的手势交互娱乐影音系统,通过对ARM+Linux系统设备控制的灵活运用与嵌入式的特点,应用C语言,开发一款能够实现与用户良好交互的手势识别控制音视频和图像播放系统。本课题开发的手势识别控制音视频和图像播放系统分为六个模块,即起始登录界面模块;功能选择模块;相册的浏览模块;音乐的播放与停止模块;视频的播放与停止模块;安防监控模块。各模块的功能互相独立,同时构成统一的整体。本系统具有安全性高,功能完备,交互性好且导航清晰,多媒体素材重点突出等特点。本文重点介绍了在开发功能的过程中的步骤,和重点讲解,并简要说明一些相关理论基础,和软件方面的操作与硬件设备方面的介绍。关键词:手势识别;嵌入式;LINUX;ARM;智能交互娱乐

DesignandImplementationofHandGestureRecognitionControlSystemforAudioVideoandImagePlayingAbstractThegestureinteractiveentertainmentvideoandaudiosystemdevelopedbyA53,throughtheflexibleuseofARM+Linuxsystemequipmentcontrolandembeddedfeatures,theapplicationofClanguagetodevelopagoodinteractionwiththeusergesturerecognitioncontrolaudio,videoandimageplaybacksystem.Thedevelopedgesturerecognitioncontrolaudio,videoandimageplaybacksystemisdividedintosixmodules:logininterfacemodule,functionselectionmodule,photoalbumbrowsingmodule,musicplaybackandstopmodule,videoplaybackandstopmodule,andsecuritymonitoringmodule.Thefunctionsofeachmoduleareindependentofeachotherandformawholeatthesametime.Thesystemfeatureshighsecurity,completefunctions,goodinteraction,clearnavigationandmultimediamaterials.Thispapermainlyintroducesthestepsandkeypointsintheprocessoffunctionaldevelopment,andbrieflyintroducestherelevanttheoreticalbasis,aswellastheoperationofsoftwareandhardwareequipment.Keywords:gesturerecognition;embedded;LINUX;ARM;intelligentinteractiveentertainment

目录TOC\o"1-4"\h\u1前言 前言嵌入系统是软、硬件相结合,以应用为中心,以计算机技术为基础,软、硬件可裁剪,手势互动的娱乐影音系统与嵌入式相结合,更能人性化、智能化。伴随着因特网技术和计算机科学的兴起和迅速发展,人类已步入后PC时代,人与计算机的交互作用也从过去以计算机为中心,发展到现在以人为中心,因此,多媒体互动展示系统也逐渐朝着更加快捷、自然、人性化的方向发展。以高性能的手势识别传感器模块为基础的多媒体交互显示控制系统正是顺应这一趋势而不断研发的,并取得了良好的效果。以ARM-cortex-A53为系统处理器内核,具有低功耗、高性能、易于扩展等特点,在当前市场中具有一定的优势。当影音娱乐产品的市场竞争逐渐演变为服务竞争时,考虑到系统的成本和适用性,采用嵌入式系统来设计图像、声音和视频系统,后期可以根据市场的需要,对硬件进行裁剪,设计控制硬件的程序,以满足市场的不同需求。本设计的目的、意义及应达到的技术要求本设计的目的结合ARM+Linux系统,通过对JPG图片的解码,设计出界面美观,操作方便的用户界面,结合嵌入式软件和硬件的可裁剪性,可以不断的根据用户需要去修改和完善,增加相应的硬件控制程序,实现对设备的控制,从而达到多功能,独具特色的人机手势交互娱乐影音系统。本设计的意义手势识别在人类的生产、生活中应用也比较广泛,所以,研究手势识别并且结合多媒体互动展示系统对于人类生活水平的提高具有重要意义。本论文的研究重点是在家庭电视和车载娱乐系统方面。就家庭娱乐而言,像三星、TCL等厂商都已经开始生产基于手势识别的电视机,并将其推向市场。使用者可直接通过一些简单的手势动作,例如,挥动手心,上下移动,完成电视页面切换,确认,旋转,缩放等基本功能。所以,研究手势识别、音视频、图像播放等控制系统的设计与实现,对于提高人们的生活水平具有重要意义。现代社会经济的快速发展,人们的生活水平明显提高,同时人们对精神娱乐和科技的追求也日益突出。工作忙碌之后,适当的放松可以让人精神振奋、身心舒畅,手势互动娱乐影音系统可以满足当代人们的需要。手语娱乐影音交互技术是在传统产业的基础上发展起来的,与之相比,手语娱乐影音交互技术以其智能化、人性化、科技先进等特点得到了人们的认可,在当今社会的发展趋势也越来越好,手语娱乐影音交互技术通过使用智能影音设备来构建符合人们需求的系统,根据需求来设计系统,实现人性化,将智能科技融入家庭和社会,让人们也能享受到科技发展所带来的好处,从而推动社会的经济发展,同时也促进了科技的发展,使人们能够更方便、人性化、智能化的使用,从而提高消费者的生活质量。本设计应达到的技术要求1.合理选择硬件以及手势识别模块进行开发。2.对6818开发板、手势识别模块以及IIC通信接口整个系统架构进行分析与设计。3.采用嵌入式ARM处理器,搭载Linux系统。4.图像的编解码。5.手势识别模块通过IIC通信接口实现手势动作的采集。6.通过手势识别模块控制音视频、图像的播放,切换。7.对各项设计进行测试以及功能完善,保证系统功能实现和可靠运行。本设计在国内外的发展概况及存在的问题人与机器的交互是当前计算机科技领域的一个重要研究课题,手势是一种自然、直观、易学的人机交互方式,手势输入是实现自然、直接的人机交互的关键技术。目前,手势识别技术主要有数据手套法和视觉法。基于视觉的动态手势识别系统是当前研究的热点之一。手势输入作为一种自然、丰富、直接的交互方式,在人机交互技术中占有重要地位。尽管手势识别技术起步较早,但绝大多数还停留在软件层面,其中有一些只是进行简单的比对,速度慢、实时性差,还有一些识别效率不高。因此需要从硬件,尤其是手势识别设备入手,来弥补上面两个不足。本设计应解决的主要问题1.分析并选择合适的语言进行后台的开发。2.对图像在开发板上的显示进行理解以及应用。3.手势识别的准确性,算法识别率要高,因此需要选取高精度手势识别模块来进行研究。4.辨识算法要求简单,辨识速度较快。由于是通过手势来控制多媒体交互显示系统的各个模块,应该保证系统的实时性,如果系统响应的时间在1秒或1秒以上,就会给家庭用户或司机带来不好的体验,相反,不如按钮操作或触屏操作来得更直接。5.环境的搭建与配置。总体设计设计原理总体设计逻辑1.手势识别模块可以识别9种姿势(如下介绍),本代码只使用了上、下、左、右、向前五种,上下左右用于在某个菜单界面上切换功能,向前用于当选择好功能之后确认选择该功能的。2.整个项目的界面切换是通过定义的全局变量g_sys_state实现的。 手势识别模块原理PAJ7620U2-手势识别模块驱动文件:/dev/IIC_drv 通信协议:用read函数每次只能读取1个字节并且100ms后会后返回值 返回值-->-1:没有探测到手势1-9:分别对应9种手势 接线说明:手势识别模块<--连接>GEC6818 VCC PIN1 GND PIN19/20 SCL PIN15 SDA PIN17 INT不用接线 使用read函数读取一个字节数据,读取的结果1到9分别对应如下手势 case1:printf("上\n");break; case2:printf("下\n");break; case3:printf("左\n");break; case4:printf("右\n");break; case5:printf("向前\n");break; case6:printf("向后\n");break; case7:printf("顺时针\n");break; case8:printf("逆时针\n");break; case9:printf("摆动\n");break;方案选择关于整个项目的UI,有两种选择,第一种选择是采用JPG图片显示UI,lcd_draw_jpg(x坐标,y坐标,JPG路径,摄像头存放JPG数据的指针,摄像头画面大小,0);该函数将任意大小JPG的显示跟摄像头拍摄画面的显示合二为一,最后一个参数设置为0,则摄像头拍摄画面大小为640*480,最后一个参数设置为1,则摄像头拍摄画面大小为320*240。而第二种选择是采用BMP图片显示UI。由于JPG图片占用空间小,且摄像头输出的YUV格式的图片可转化为JPG,因此在本设计中采用方案一。软硬件开发环境GEC6818开发板图2.1GEC6818开发板GEC6818开发板是集多种功能于一身的掌上微机,具有体积小、便携性强、功能强等特点,可运行系统,速度快,开发时间短,源代码全方便开发者使用,无需扩展底板即可直接嵌入自己的设计中,实现更高效、快速、方便的开发。采用6818开发板的理由:①处理能力强,配合三星Cortex-A53八核处理器,主频最高可达1.4GHZ。提升用户运行速度,带来更佳的使用体验。整机稳定性好,核心板采用十层板材工艺设计,确保稳定可靠。保证了程序的稳定性和产品在设计过程中的安全性。有丰富的外部接口,如LCD接口,Touch接口,音频接口,SD卡接口,emmc接口,以太网接口,USBHOST接口,USBOTG接口,UART接口,PWM接口,IIC接口,SPI接口,ADC接口,Camera接口,HDMI接口,VGA接口,启动配置接口等等。④支持多种操作系统,具有ARM微处理器系统驱动实验,嵌入式实时操作系统开发Linux,嵌入式Android系统开发。便于后期根据用户需求进行功能更改和增强功能。手势识别模块图2.2手势识别模块PAJ7620U2手势识别模块采用了PAJ7620U2式手势识别传感器,该芯片与通用I2C接口实现了手势识别功能。本系统可以识别9种手势,包括:上下、左右、前后、圆-顺时针方向、圆-逆时针方向、摇摆。这些手势信息只需通过I2C总线即可访问。手势辨识传感器模块的核心芯片PAJ7620U2,是一种能够与I2C协议进行交互的人体红外识别芯片。PAJ7620U2的手势识别传感器有如下特点:①最多可识别9种手势。②在普通模式下,手势动作的速度为60°/s至600°/s,而游戏模式为60°/s至1200°/s。③环境光对模块的免疫能力:<100kLux。④在模块内部具有接近检测功能;⑤I2C接口的传输速率达到400kbit/s。LinuxUbuntu16.04与Windows相比,Linux系统对硬件的支持要好得多,Linux中的开放源码程序不断更新,因此它支持很多老式硬件,而Ubuntu对系统的低需求也能延长公司硬件的寿命。Ubuntu系统在服务器,云计算等领域得到了广泛的认可,在一些运行UbuntuLinux的移动设备上得到了广泛的应用。SecureCRTSecureCRT是一个支持SSH的终端模拟器,它可以登录到Windows系统,操纵Linux服务器或者主机。它是Linux和Windows两个系统连接的理想工具。应用软件交叉开发环境在交互式环境基础上构建的嵌入式应用软件开发是基于交互式环境的,它是编译、连接和调试应用软件的环境,与运行应用软件的环境不同,它采用主机和目标机模式。主机主机是一个包含了当前市场上流行的Windows和Linux操作系统的通用主机,以及丰富的开发工具,可以加快开发者开发嵌入式应用程序的速度,提高开发者的效率。该目标机用于应用软件的开发与调试,它可以是一个应用软件的开发环境,也可以是一个代替实际运行环境的仿真系统。内嵌的交叉开发环境包括交叉编译、交叉调试和系统模拟,交叉编译的作用是将编写好的代码生成二进制代码,在目标机上运行,而交叉调试和系统模拟器则用来调试主机和目标机上的嵌入式软件。嵌入式软件的交叉开发环境是软件开发的基础,也是关键。图片的映射Framebuffer是一种底层机制,即帧缓冲机制,在Linux系统中,内核提供了一个虚拟层,覆盖了芯片之上,抽象出显卡或显存设备,屏蔽了各种不同显示设备的具体细节,提供了统一的,抽象的,简洁的接口,使开发人员能够更容易地进行图形编程,使系统能够将显卡硬件抽象为一块可直接操作的内存,提供封装的函数式接口和设置,提高开发人员的开发效率。framebuffer使编写显卡驱动很方便。LCD的设备文件通常与/dev/fb0对应。然而,通常系统中的显示设备有多个,分别对应于/dev/fb1或/dev/fb2等等。此设备文件作为向LCD屏幕读写数据的通道。在这个时候,我们可以使用mmap函数来为这些设备文件映射一块大小适中的内存来处理它。同样,我们可以将帧缓冲区所对应的物理内存映射到用户内存空间,这样我们就可以通过直接写入屏幕来播放显示效果。音视频的播放音频概念在播放音乐的过程中,系统将模拟信号转换成数字信号,并通过几步转换、采样、量化、编码等过程完成。取样是对一段连续的模拟信号进行离散化,量化是对连续的模拟信号进行幅值离散化,脉冲编码调制是将一个连续的、取值连续的模拟信号转换为离散的数字信号传输,是对模拟信号进行抽样、幅值量化再编码的过程。ALSA是Linux高级声音体系结构的缩写,它在Linux操作系统上提供音频和MIDI支持。连接标准音频接口ALSA的步骤:安装ALSA,下载,解压缩,向环境变量添加安装后的库位置路径,编译音频程序,包含头文件,链接ALSA库。MPlayer播放器简介mplayer是一个开放源码的多媒体播放器,它使用本地的codec来播放大多数格式的视频,它可以在多种操作系统上运行,Mplayer支持多种输出设备,并且可以使用GGI和SDL以及某些低级硬件驱动模式。mplayer也支持通过MPEG硬件解码卡显示。Madplay播放器简介madplay播放器拥有大多数音乐播放器的功能,比如快进播放,seek播放,暂停播放等,但目前该播放器不支持网络播放,其他功能可以使用。界面的切换该程序实现了多个独立窗口,彼此独立且有联系,可以在一个界面跳跃到另一个界面,具有良好的人机交互性,具有多种功能界面,增加了程序的操作性。详细设计与实现设计手势交互娱乐影音系统主要问题的解决方法交叉环境的搭建执行交叉开发的原因在上面也有提到,主要是由于嵌入产品的软件硬件资源非常有限,如果我们直接在产品的Linux平台上编写代码,需要配置大量的编译工具和库文件,造成了资源的浪费,还导致产品的运行速度降低,因此需要使用交叉编译来解决这个问题。交叉编译工具链的具体搭建步骤如下:①下载arm-2009q3.tar.bz2编译器到Ubuntu。②解压arm-2009q3.tar.bz2编译器,命令是tar-xjvfarm-2009q3.tar.bz2。③编译代码./arm-2009q3/bin/arm-none-linux-gnueabi-gcchello.c-ohelloarm。④由于在我的Ubuntu的版本是16.04,它默认把所有的32位的库删除,所以就用不了arm-2009q3编译工具,因此需要安装32位的库,命令:sudoapt-getinstallzlib1g:i386libstdc++6:i386libc6:i386。⑤打开配置文件:gedit/home/gec/.bashrc,然后在文件末尾添加自己需要修改的环境变量:exportPATH=/home/gec/arm-2009q3/bin/:$PATH,最后创建软连接:ln-sarm-none-linux-gnueabi-gccarm-linux-gcc。移植JEPG的步骤(1)把jpegsrc.v8c.tar.gz上载到开发板,并放在共享目录中(2)将文件解压缩到主目录下:tar-zxvfjpegsrc.v8c.tar.gz-C~(3)打开jpg-8c配置文件:cd~/jpg-8c(4)配置文件,如果home目录没有jpeg目录,则需要自己创建./config ure--host=arm-linux--prefix=/home/gec/jpeg(5)编译:make(6)安装:makeinstall(7)进入jpeg目录如果文件夹是正确的,则表示编译成功 图片的显示采用JPG图片显示UI,显示JPG图片的函数原型为:intlcd_draw_jpg(unsignedintx,unsignedinty,constchar*pjpg_path, char*pjpg_buf,unsignedintjpg_buf_size, unsignedintjpg_half);其中参数1为x坐标,参数2为y坐标,参数3为JPG图片路径,参数4为摄像头存放JPG图片数据的指针,参数五为摄像头画面大小,该函数将任意大小JPG图片的显示跟摄像头拍摄画面的显示合二为一,最后一个参数设置为0,则摄像头拍摄画面大小为640*480,最后一个参数设置为1,则摄像头拍摄画面大小为320*240。显示JPG图片的步骤:申请jpg资源,权限可读可写,jpg_fd=open(pjpg_path,O_RDWR)。获取jpg文件的大小,jpg_size=file_size_get(pjpg_path)。为jpg文件申请内存空间,pjpg=malloc(jpg_size)。读取jpg文件所有内容到内存,read(jpg_fd,pjpg,jpg_size)。创建解码并直接解码内存数据,读文件头,然后开始解码。图2.3读取解码数据代码图片的切换通过使用函数lcd_draw_jpg(0,0,jpgpath,NULL,0,0)将图片显示出来,实现的原理是将开发板上的图片文件名与指定路径拼接起来,切换的时候则读取相应路径的图片数据,并设置一个标志位,若到达第一张图片用户选择切换上一张则自动切换到最后一张图片。到达最后一张若用户切换下一张则显示第一张图片,通过UI界面上的上一张或下一张的选择按钮实现图片的切换。Madplay移植将Madplay移植到开发板中,方便后期在播放音乐的时候使用。移植步骤:①编译zlib,修改Makefile中的交叉工具链,将库文件设置到交叉编译环境目录下。②编译libid3tag,指明库运行的环境arm-linux-gnueabinf,指定库文件路径。③编译libmad。④编译并移植Madplay,生成的Madplay程序通过串口拷贝到目标机上即可利用system命令播放音乐。音乐的播放、停止与暂停为了实现音乐的播放,使用system()函数调用Madplay来播放音乐,系统将创建一个子线程,调用Madplay来执行用户想播放的音乐。system("madplay/gesturetest/test.mp3&"),有一点要注意,当您使用system函数时,您应该将Madplay设置为后台,以便实现下一步的停止、暂停。信号控制Madplay进程以实现停止和暂停功能,信号是进程之间的通信方式,具有以下特点:①非实时信号不排队,响应互相嵌套。②目标对信号没有及时响应,将丢弃后续信号。③每个非实时信号对应一个系统事件,事件发生时,信号产生。④若进程的挂起信号包含实时信号和非实时信号,则进程对实时信号的响应先高后低,非实时信号无固定顺序。把9号信号KILL和19号信号STOP发送给Madplay来实现音乐控制。KILL信号和STOP信号这两种信号都是特殊信号,不能忽略,不能阻塞,不能捕获,只能通过默认动作进行响应。System("killall-KILLmadplay")使音乐停止。System("killall-STOPmadplay")实现音乐暂停功能。System("killall-CONTmadplay")实现继续播放音乐的功能。图2.4Linux信号列表Mplayer播放器的移植实现原理:①通过system函数调用Mplayer,使视频可以在当前界面播放。②使用Slave模式,Mplayer运行时通过Mplayer-inputcmdlist接收输入命令,或使用kill函数向Mplayer进程发送信号,以控制进程状态,Mplayer在Slave模式下可以与系统的标准输入输出进行信息交互。移植步骤:①在线下载libmad-0.15.1b.tag.gz和mplayer-1.0rc2.rar文件并进行解压。②CC=/usr/local/arm/4.1.2/bin/arm-linux-gcc,进入libmad-0.15.1.b,配置生成Makefile指定库的最终安装路径,以指定交叉编译工具。③在lib目录下生成include和lib文件夹,在相应的文件夹中生成mad.h和lbmad.a文件,以便进行Mplayer编译。④交叉编译产生可执行程序mplayer,上传到开发板,准备下一步播放视频。⑤通过调用Mplayer进程来播放视频,使用system函数调用Mplayer来播放视频,执行播放视频操作。视频的播放与停止功能同样通过调用system()函数来调用MPlayer,让系统创建一个子线程来实现视频的播放和停止,而视频的播放则通过调用在系统内部搭建好的MPlayer来在界面上显示开发板内的视频,使用system("mplayer/gesturetest/video/video.avi&")将视频以800*480尺寸在开发板上播放,设置后台播放是为了接下来的手势识别控制信号功能的选择操作不冲突。通过手势识别模块识别出数字标记来控制按钮,从而实现视频的暂停和继续播放,在此过程中,用户可以在MPlayer进程开始播放时,使用system("mplayer/gesturetest/video/video.avi&")调用MPlayer进程播放视频。system("killall-STOPmplayer")在用户要实现视频暂停时,STOP信号会使MPlayer进程暂停,停止播放视频;system("killall-CONTmplayer")实现视频从暂停状态取消,继续播放。多界面的切换通过一个全局变量g_sys_state来实现多个系统状态多个界面之间的切换,各个功能模块的宏定义:#defineG_MAIN0//主界面#defineG_PHOTO1//相册界面#defineG_MUSIC2//音乐界面#defineG_VIDEO3//视频界面#defineG_ZIGBEE4//环境监测界面#defineG_CAMERA5//监控界面#defineG_PASSWD6//登录界面#defineG_WELCOME7//欢迎界面在主界面时,用户可通过手势识别模块的来选择和确认需要进入的功能界面,每一个界面都是一个while(1)循环,各个功能模块都是通过g_sys_state=G_MAIN;break;来返回主界面。手势交互娱乐影音系统的设计与实现概要设计图2.5本设计大致功能要求图解在LinuxC的交叉编译的开发环境下,创建一个main.c文件,用画图工具设计多个UI界面,对应相对应的功能,每个界面互相独立。在程序启动后,自动进入欢迎界面,并在等待3秒后进入下一界面;进入登陆界面,输入正确的密码后即可进入下一界面;进入主菜单界面,选择界面上的功能:相册、音乐、视频、监控。进入相册界面,程序会遍历指定路径上的图片,将其显示出来。用户可以通过手势识别模块控制选择界面上的上一张和下一张按钮,进行随意的切换,选择返回按钮则返回主界面。进入音乐界面,用户通过手势识别模块控制选择界面上的播放按钮,系统便会调用Madplay播放音乐,通过选择界面上的上一首和下一首按钮,进行随意的切换音乐,用户可以通过选择停止、暂停按钮来实现对音乐的控制,其实现原理是发送信号给Madplay进程,进而达到用户控制的目的,选择返回按钮则返回主菜单界面。进入视频界面,当用户选择播放按钮时,程序会调用MPlayer播放当前系统下指定目录的视频,用户通过选择界面上的上一个和下一个按钮,进行随意的切换视频,通过选择按钮,触发信号控制视频的状态,选择返回按钮则返回主界面。进入监控界面,当用户通过手势识别模块控制选择界面上的启动按钮时,系统会初始化并启动摄像头设备,创建线程不断地抓拍并获取摄像头拍摄的数据,并将获取到的颜色数据显示到lcd上面。由于摄像头输出的图片格式是YUV因此需要将YUV格式的图片数据转化为RGB数据,转化代码详见附录B。选择返回按钮则返回主界面。欢迎界面图2.6本设计的欢迎界面登陆界面图2.7本设计的登陆界面相册功能图2.8本设计的相册界面视频功能图2.9本设计的视频界面音乐功能图2.10本设计的音乐界面监控功能图2.11本设计的监控安防界面本设计系统各模块流程图图2.12各模块流程图结论在整个设计方案完成后,实现了手势识别控制选择各功能模块,用户输入正确密码进入主界面,实现了用户安全使用本设计的目的,画面的浏览、音乐的播放、暂停、视频的播放、摄像头的监控等功能,为用户提供了多种用途。各个模块之间是独立的,各功能部分运行顺畅。完善建议:系统设计时,在程序中使用的音乐和视频、图片资源均在系统中,后期可添加蓝牙或网络传输图片或音视频数据到开发板,实现物联网通信,支持文档资源的更新,可使整个系统的多方面、多层次、资源丰富。在系统设计过程中,考虑到系统娱乐性不足,可在系统后期添加趣味游戏,以减轻平时工作的疲劳。从实用角度考虑,后期还可添加计算器功能,可在需要时进行计算。这次的毕业设计,我收获很多,不仅锻炼了自己的实际动手能力,更重要的是培养了自己不断学习、刻苦钻研、勇于创新的工匠精神。十年寒窗,迈入大学,浑浑噩噩,四年过去了,回首往事,不堪回首,迈入社会,四顾茫然。但愿我能够在以后的学习和生活中,成为一名工匠精神的传承者,并保持我的初心。

参考文献[1]曹玉珍,蔡伟超,程旸.基于MEMS加速度传感器的人体姿态检测技术[J].纳米技术[J].纳米技术与精密工程,2012(1).[2]王辉.基于视觉的实时手势跟踪与识别及其在人机交互中的应用[D].广东工业大学,2014.[3]张若愚.人机交互中手势识别关键算法研究与实现[D].广东工业大学,2014.[4]杨青.手势识别技术的研究[D].大连理工大学,2010.[5]高与聪.基于I.MX6的车载视频播放单元的硬件设计与实现[D].大连理工大学,2014.

[6]徐惠军.基于i.MX6平台的车载信息娱乐系统的硬件设计与实现[D].东华大学,2014.[7]赵亚飞.基于视觉的手势识别技术研究[D].浙江大学,2011.[8]梁喜军.基于ARM嵌入式平台的视觉手势识别技术研究[D].兰州理工大学,2014.

[9]杜晓川.基于视觉的动态手势识别相关技术研究及实现[D].电子科技大学,2012.[10]邹洪.实时动态手势识别关键技术研究[D].华南理工大学,2011.

谢辞路途遥远,修路难,吾将上下而求。时光飞逝,转眼四年匆匆过去,我即将结束北京理工大学珠海学院的求学生涯,总以为来日方长,不顾一切岁月,却不知时光匆匆,转眼间便提笔写下了谢词。回顾大学四年,百感交集,但更多的是感激。感谢母校的教育,感谢学校为我们提供了理想的实验设施,舒适的学习环境和良好的学习氛围。本次毕业设计在吴方、彭龙老师的精心指导和热情关怀下完成。所以,我首先要感谢我的导师吴方,以及我的老师彭龙,他在我设计毕设的过程中给了我很大的帮助,让我受益匪浅,在后期设计的过程中结合老师的教诲,让我越来越熟悉毕业设计课程的设计过程,对这个系统的定位越来越清楚,对自己要做的功能的理解也越来越深刻。因此,在这里,我要真诚地感谢两位老师的教诲,真诚地祝老师身体健康,万事如意。谢谢我的三个舍友四年来对我的包容与关心,感谢他们一路相伴,给我的鼓励,感谢帮助我的同学,祝大家一切顺利。利用这个机会,感谢父母默默的付出与支持,你们无私奉献的爱是我前进的动力。祝家人和朋友身体健康,幸福快乐!这四年的大学生活,是我生命中最宝贵的经历,感谢学校,让我学到了很多知识,提供了优越的条件让我能够去感受科技的发展,感谢我的老师教给我理论知识和相关操作,感谢辅导员让我树立了正确的人生观和价值观。谢谢北京理工大学珠海学院,我会时刻谨记老师的教导,为社会作出贡献。天将降大任于斯人也,地将降小命也。这句诗词作为这篇毕设的一个结尾,也是一段生活的结束。希望自己能够继续年少时的梦想,永不放弃,也不忘初心。

附录附录A:部分主程序#include<stdio.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<pthread.h>#include<errno.h>#include<stdlib.h>#include<signal.h>#include<yuvcamera.h>//跟摄像头有关的头文件#include"ts.h"//跟触摸屏有关的头文件#include"arm_serial.h"//跟串口有关的头文件#include"lcdjpg.h"//跟显示jpg有关的头文件#definePASSSIZE6//宏定义控制密码位数,目前限制是6位密码//宏定义系统的几种状态#defineG_MAIN0#defineG_PHOTO1#defineG_MUSIC2#defineG_VIDEO3#defineG_ZIGBEE4#defineG_CAMERA5#defineG_PASSWD6#defineG_WELCOME7//通过这个全局变量实现系统状态的切换intg_sys_state=G_WELCOME;//控制密码的位数intg_off_num=0;//自定义实现主界面所有功能的函数voiddo_main(){ inti=0;//很重要,用于切换功能选择高亮的图片,以及标记你选择了哪个功能 //显示主界面的背景 lcd_draw_jpg(0,0,"/gesturetest/mainmenu.jpg",NULL,0,0); lcd_draw_jpg(0+200*i,297,mainbutton[i],NULL,0,0);//高亮停留在最左边的监控 gesturecode=0; while(1) { read(gesturefd,&gesturecode,1);//读取手势识别模块数据 printf("gesturecodeis:%d\n",gesturecode); if(gesturecode==4&&i<3)//右 { i++; lcd_draw_jpg(0,0,"/gesturetest/mainmenu.jpg",NULL,0,0); lcd_draw_jpg(0+200*i,297,mainbutton[i],NULL,0,0); } if(gesturecode==3&&i>0)//左 { i--; lcd_draw_jpg(0,0,"/gesturetest/mainmenu.jpg",NULL,0,0); lcd_draw_jpg(0+200*i,297,mainbutton[i],NULL,0,0); } if(gesturecode==1)//上 { i=4; lcd_draw_jpg(0,0,"/gesturetest/mainmenu.jpg",NULL,0,0); lcd_draw_jpg(320,164,mainbutton[i],NULL,0,0); } if(gesturecode==2)//下 { i=0; lcd_draw_jpg(0,0,"/gesturetest/mainmenu.jpg",NULL,0,0); lcd_draw_jpg(0+200*i,297,mainbutton[i],NULL,0,0); } if(gesturecode==5&&i==0)//手势向前确认选择监控 { g_sys_state=G_CAMERA; break; } if(gesturecode==5&&i==1)//向前环境监测 { g_sys_state=G_ZIGBEE;//用zigbee上的温湿度传感器监测温湿度 //通过串口发送给开发板 break; } if(gesturecode==5&&i==2)//向前相册 { g_sys_state=G_PHOTO; break; } if(gesturecode==5&&i==3)//向前视频 { g_sys_state=G_VIDEO; break; } if(gesturecode==5&&i==4)//向前音频 { g_sys_state=G_MUSIC; break; } }}//实现相册功能的函数voiddo_photo(){ inti=0;//很重要,用于切换功能选择高亮的图片,以及标记你选择了哪个功能 intcount=5;//用于切换图片上一张,下一张 charjpgpath[30];//存放图片的路径 //显示相册背景图案 lcd_draw_jpg(0,0,"/gesturetest/photo.jpg",NULL,0,0); lcd_draw_jpg(142,290,"/gesturetest/photoprevs.jpg",NULL,0,0);//高亮显示上一张 //获取手势识别信息 while(1) { bzero(jpgpath,30); read(gesturefd,&gesturecode,1);//读取手势识别模块数据,获取9种姿势对应的数字编码 if(gesturecode==4&&i<1)//右 { i++; lcd_draw_jpg(0,0,"/gesturetest/photo.jpg",NULL,0,0); lcd_draw_jpg(520,290,"/gesturetest/photonexts.jpg",NULL,0,0);//高亮显示下一张 } if(gesturecode==3&&i>0)//左 { i--; lcd_draw_jpg(0,0,"/gesturetest/photo.jpg",NULL,0,0); lcd_draw_jpg(142,290,"/gesturetest/photoprevs.jpg",NULL,0,0);//高亮显示上一张 } if(gesturecode==1)//上 { i=2; lcd_draw_jpg(0,0,"/gesturetest/photo.jpg",NULL,0,0); lcd_draw_jpg(665,78,"/gesturetest/photorets.jpg",NULL,0,0);//高亮显示返回 } if(gesturecode==2)//下 { i=0; lcd_draw_jpg(0,0,"/gesturetest/photo.jpg",NULL,0,0); lcd_draw_jpg(142,290,"/gesturetest/photoprevs.jpg",NULL,0,0);//高亮显示上一张 } if(gesturecode==5&&i==0)//向前确认上一张 { if(count>1) count--; else count=4; //拼接完整的图片的路径名 sprintf(jpgpath,"/gesturetest/pic/%d.jpg",count); lcd_draw_jpg(0,0,jpgpath,NULL,0,0); } if(gesturecode==5&&i==1)//向前确认下一张 { if(count<4) count++; else count=1; //拼接完整的图片的路径名 sprintf(jpgpath,"/gesturetest/pic/%d.jpg",count); lcd_draw_jpg(0,0,jpgpath,NULL,0,0); } if(gesturecode==5&&i==2)//向前返回 { g_sys_state=G_MAIN; break; } }}//摄像头抓拍的代码,可以将抓拍的图片保存在开发板/gesturetest/videovoid*takephoto(void*arg){ camera_t*camera=(camera_t*)arg; unsignedchar*rgbbuf=malloc(camera->width*camera->height*3); intlcd_fd; //打开屏幕Lcd lcd_fd=open("/dev/fb0",O_RDWR); if(lcd_fd==-1) { printf("openlcdfailed!\n"); returnNULL; } unsignedint*lcdmem=(unsignedint*)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0); if(lcdmem==MAP_FAILED) { perror("lcdmem\n"); returnNULL; } while(1) { //获取摄像头拍摄的数据 yuvcamera_getrgb(camera,rgbbuf); //将获取到的颜色数据显示到lcd上面 yuvcamera_show(camera,lcdmem,rgbbuf); }}//实现摄像头安防voiddo_camera(){ pthread_tcameraid; camera_t*camera=malloc(sizeof(camera_t)); inti=0; //摄像头拍摄的画面是640*480大小的,并在屏幕最左边位置显示 //摄像头界面 lcd_draw_jpg(0,0,"/gesturetest/camera.jpg",NULL,0,0); while(1) { read(gesturefd,&gesturecode,1);//读取手势识别模块数据 //线程不断拍摄显示 if(gesturecode==1&&i>0)//手势向上 { i--; if(i==0) printf("你选择的是启动摄像头功能!\n"); elseif(i==1) printf("你选择的是返回功能!\n"); } if(gesturecode==2&&i<1)//手势向下 { i++; if(i==0) printf("你选择的是启动摄像头功能!\n"); elseif(i==1) printf("你选择的是返回功能!\n"); } if(gesturecode==5&&i==0)//手势向前确认启动摄像头 { //初始化并启动摄像头设备 yuvcamera_init(camera,"/dev/video7"); printf("宽%d高%d\n",camera->width,camera->height); //创建线程帮助我不断的抓拍 pthread_create(&cameraid,NULL,takephoto,(void*)camera); } //返回到主界面 if(gesturecode==5&&i==1)//手势向前确认返回 { pthread_cancel(cameraid); yuvcamera_close(camera);//关闭摄像头 g_sys_state=G_MAIN; break; } //将保存的图片转换成视频 if(gesturecode==5&&i==2) { //调用ffmpeg将摄像头拍摄的画面转换成AVI视频 system("ffmpeg-fimage2-i/gesturetest/video/%d.jpg-r25/gesturetest/video/video.avi\n"); } }}//主函数intmain(){ //打开触摸屏在ts.c中有 ts_open();//6818/dev/input/event0 //打开手势识别模块的驱动,识别9种姿势 gesturefd=open("/dev/IIC_drv",O_RDWR); if(gesturefd<0) { perror("open手势识别驱动失败\n"); return-1; } while(1) { switch(g_sys_state) { caseG_WELCOME://欢迎界面 do_welcome(); break; caseG_PASSWD://密码登录界面 do_passwd(); break; caseG_MAIN://主界面 do_main(); break; caseG_PHOTO://相册界面 do_photo(); break; caseG_MUSIC://音乐界面 do_music(); break; caseG_VIDEO://视频界面 do_video(); break; caseG_CAMERA://摄像头 do_camera(); break; //caseG_ZIGBEE://zigbee获取温湿度,控制zigbee的led灯 //do_zigbee(); //break; } } //close_serial(); ts_close(); return0;}附录B:YUV格式的图片数据转化为RGB数据方式uint32_tsign3=0;intyuyv2rgb(inty,intu,intv){unsignedintpixel24=0;unsignedchar*pixel=(unsignedchar*)&pixel24;intr,g,b;staticintruv,guv,buv;if(sign3){sign3=0;ruv=1159*(v-128);guv=380*(u-128)+813*(v-128);buv=2018*(u-128);}r=(1164*(y-16)+ruv)/1000;g=(1164*(y-16)-guv)/1000;b=(1164*(y-16)+buv)/1000;if(r>255)r=255;if(g>255)g=255;if(b>255)b=255;if(r<0)r=0;if(g<0)g=0;if(b<0)b=0;pixel[0]=r;pixel[1]=g;pixel[2]=b;returnpixel24;}intyuyv2rgb0(unsignedchar*yuv,unsignedchar*rgb,unsignedintwidth,unsignedintheight){unsignedintin,out;inty0,u,y1,v;unsignedintpixel24;unsignedchar*pixel=(unsignedchar*)&pixel24;unsignedintsize=width*height*2;for(in=0,out=0;in<size;in+=4,out+=6){y0=yuv[in+0];u=yuv[in+1];y1=yuv[in+2];v=yuv[in+3];sign3=1;pixel24=yuyv2rgb(y0,u,v);rgb[out+0]=pixel[0];rgb[out+1]=pixel[1];rgb[out+2]=pixel[2];pixel24=yuyv2rgb(y1,u,v);rgb[out+3]=pixel[0];rgb[out+4]=pixel[1];rgb[out+5]=pixel[2];}return0;}

HYPERLINK电脑快捷知识大全编辑本段一、常见用法F1显示当前程序或者windows的帮助内容。F2当你选中一个文件的话,这意味着“重命名”F3当你在桌面上的时候是打开“查找:所有文件”对话框F10或ALT激活当前程序的菜单栏windows键或CTRL+ESC打开开始菜单CTRL+ALT+DELETE在win9x中打开关闭程序对话框DELETE删除被选择的选择项目,如果是文件,将被放入回收站SHIFT+DELETE删除被选择的选择项目,如果是文件,将被直接删除而不是放入回收站CTRL+N新建一个新的文件CTRL+O打开“打开文件”对话框CTRL+P打开“打印”对话框CTRL+S保存当前操作的文件CTRL+X剪切被选择的项目到剪贴板CTRL+INSERT或CTRL+C复制被选择的项目到剪贴板SHIFT+INSERT或CTRL+V粘贴剪贴板中的内容到当前位置ALT+BACKSPACE或CTRL+Z撤销上一步的操作ALT+SHIFT+BACKSPACE重做上一步被撤销的操作Windows键+L锁屏键Windows键+M最小化所有被打开的窗口。Windows键+SHIFT+M重新将恢复上一项操作前窗口的大小和位置Windows键+E打开资源管理器Windows键+F打开“查找:所有文件”对话框Windows键+R打开“运行”对话框Windows键+BREAK打开“系统属性”对话框Windows键+CTRL+F打开“查找:计算机”对话框SHIFT+F10或鼠标右击打开当前活动项目的快捷菜单SHIFT在放入CD的时候按下不放,可以跳过自动播放CD。在打开word的时候按下不放,可以跳过自启动的宏ALT+F4关闭当前应用程序ALT+SPACEBAR打开程序最左上角的菜单ALT+TAB切换当前程序ALT+ESC切换当前程序ALT+ENTER将windows下运行的MSDOS窗口在窗口和全屏幕状态间切换PRINTSCREEN将当前屏幕以图象方式拷贝到剪贴板ALT+PRINTSCREEN将当前活动程序窗口以图象方式拷贝到剪贴板CTRL+F4关闭当前应用程序中的当前文本(如word中)CTRL+F6切换到当前应用程序中的下一个文本(加shift可以跳到前一个窗口)在IE中:ALT+RIGHTARROW显示前一页(前进键)ALT+LEFTARROW显示后一页(后退键)CTRL+TAB在页面上的各框架中切换(加shift反向)F5刷新CTRL+F5强行刷新目的快捷键激活程序中的菜单栏F10执行菜单上相应的命令ALT+菜单上带下划线的字母关闭多文档界面程序中的当前窗口CTRL+F4关闭当前窗口或退出程序ALT+F4复制CTRL+C剪切CTRL+X删除DELETE显示所选对话框项目的帮助F1显示当前窗口的系统菜单ALT+空格键显示所选项目的快捷菜单SHIFT+F10显示“开始”菜单CTRL+ESC显示多文档界面程序的系统菜单ALT+连字号(-)粘贴CTRL+V切换到上次使用的窗口或者按住ALT然后重复按TAB,切换到另一个窗口ALT+TAB撤消CTRL+Z编辑本段二、使用“Windows资源管理器”的快捷键目的快捷键如果当前选择展开了,要折叠或者选择父文件夹左箭头折叠所选的文件夹NUMLOCK+负号(-)如果当前选择折叠了,要展开或者选择第一个子文件夹右箭头展开当前选择下的所有文件夹NUMLOCK+*展开所选的文件夹NUMLOCK+加号(+)在左右窗格间切换F6编辑本段三、使用WINDOWS键可以使用Microsoft自然键盘或含有Windows徽标键的其他任何兼容键盘的以下快捷键。目的快捷键在任务栏上的按钮间循环WINDOWS+TAB显示“查找:所有文件”WINDOWS+F显示“查找:计算机”CTRL+WINDOWS+F显示“帮助”WINDOWS+F1显示“运行”命令WINDOWS+R显示“开始”菜单WINDOWS显示“系统属性”对话框WINDOWS+BREAK显示“Windows资源管理器”WINDOWS+E最小化或还原所有窗口WINDOWS+D撤消最小化所有窗口SHIFT+WINDOWS+M编辑本段四、“我的电脑”和“资源管理器”的快捷键目的快捷键关闭所选文件夹及其所有父文件夹按住SHIFT键再单击“关闭按钮(仅适用于“我的电脑”)向后移动到上一个视图ALT+左箭头向前移动到上一个视图ALT+右箭头查看上一级文件夹BACKSPACE编辑本段五、使用对话框中的快捷键目的快捷键取消当前任务ESC如果当前控件是个按钮,要单击该按钮或者如果当前控件是个复选框,要选择或清除该复选框或者如果当前控件是个选项按钮,要单击该选项空格键单击相应的命令ALT+带下划线的字母单击所选按钮ENTER在选项上向后移动SHIFT+TAB在选项卡上向后移动CTRL+SHIFT+TAB在选项上向前移动TAB在选项卡上向前移动CTRL+TAB如果在“另存为”或“打开”对话框中选择了某文件夹,要打开上一级文件夹BACKSPACE在“另存为”或“打开”对话框中打开“保存到”或“查阅”F4刷新“另存为”或“打开”对话框F5编辑本段六、桌面、我的电脑和“资源管理器”快捷键选择项目时,可以使用以下快捷键。目的快捷键插入光盘时不用“自动播放”功能按住SHIFT插入CD-ROM复制文件按住CTRL拖动文件创建快捷方式按住CTRL+SHIFT拖动文件立即删除某项目而不将其放入SHIFT+DELETE“回收站”显示“查找:所有文件”F3显示项目的快捷菜单APPLICATION键刷新窗口的内容F5重命名项目F2选择所有项目CTRL+A查看项目的属性ALT+ENTER或ALT+双击可将APPLICATION键用于Microsoft自然键盘或含有APPLICATION键的其他兼容键编辑本段七、Microsoft放大程序的快捷键这里运用Windows徽标键和其他键的组合。快捷键目的Windows徽标+PRINTSCREEN将屏幕复制到剪贴板(包括鼠标光标)Windows徽标+SCROLLLOCK将屏幕复制到剪贴板(不包括鼠标光标)Windows徽标+PAGEUP切换反色。Windows徽标+PAGEDOWN切换跟随鼠标光标Windows徽标+向上箭头增加放大率Windows徽标+向下箭头减小放大率编辑本段八、使用辅助选项快捷键目的快捷键切换筛选键开关右SHIFT八秒切换高对比度开关左ALT+左SHIFT+PRINTSCREEN切换鼠标键开关左ALT+左SHIFT+NUMLOCK切换粘滞键开关SHIFT键五次切换切换键开关NUMLOCK五秒QQ快捷键,玩QQ更方便Alt+S快速回复Alt+C关闭当前窗口Alt+H打开聊天记录Alt+T更改消息模式Ait+J打开聊天纪录Ctrl+A全选当前对话框里的内容Ctrl+FQQ里直接显示字体设置工具条Ctrl+J输入框里回车(跟回车一个效果)Ctrl+M输入框里回车(跟回车一个效果)Ctrl+L对输入框里当前行的文字左对齐Ctrl+R对输入框里当前行的文字右对齐Ctrl+E对输入框里当前行的文字居中Ctrl+V在qq对话框里实行粘贴Ctrl+Z清空/恢复输入框里的文字Ctrl+回车快速回复这个可能是聊QQ时最常用到的了Ctrl+Alt+Z快速提取消息Ctrl+Alt+A捕捉屏幕最常用的快捷键F5刷新DELETE删除TAB改变焦点CTRL+C复制CTRL+X剪切CTRL+V粘贴CTRL+A全选CTRL+Z撤销CTRL+S保存ALT+F4关闭CTRL+Y恢复ALT+TAB切换CTRL+F5强制刷新CTRL+W关闭CTRL+F查找SHIFT+DELETE永久删除CTRL+ALT+DEL任务管理SHIFT+TAB-反向切换CTRL+空格--中英文输入切换CTRL+Shift输入法切换CTRL+ESC--开始菜单CTRL+ALT+ZQQ快速提取消息CTRL+ALT+AQQ截图工具CTRL+ENTERQQ发消息Alt+1保存当前表单Alt+2保存为通用表单Alt+A展开收藏夹列表资源管理器END显示当前窗口的底端HOME显示当前窗口的顶端NUMLOCK+数字键盘的减号(-)折叠所选的文件夹NUMLOCK+数字键盘的加号(+)显示所选文件夹的内容NUMLOCK+数字键盘的星号(*)显示所选文件夹的所有子文件夹向左键当前所选项处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论