毕业设计-基于机器视觉的手势识别系统-OPENCV

目录


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯毕业设计-基于机器视觉的手势识别系统-OPENCV

课题背景和意义

人机的交互活动最早诞生是为了能更好更方便的控制计算 机,输入信息。最常用的也是最突出的就是利用键盘和鼠标进 行人与计算机的信息交换,但是这也成为了人机交互发展的瓶 颈。当前广泛使用的WIMP图形用户接口,因为从用户到计 算机的通信是串口的,用户不能以手势、语音进行人机交互。 一般计算机处理过程将抛弃传统的交互设备,诸如键盘、鼠标 等传统设备,近而需要一些自动化程度较高的设备来采集记 录,这里面包括各种感知器和采集器(摄像机等)。 Davis和 Shah将戴在指问具有高亮标记的视觉手套的手势作为系统的 输入,可以识别7种手势。目前最先进的发展是名为“真 实手套”的技术,目前已经可以检测手指的弯曲指数和空间定 位指数,使三维交互手段变得更加的真实自然。但是不可 避免的是这种技术造价必然昂贵,即使技术完善也并不能投人 大规模的使用。所以基于计算机视觉的手势识别技术依旧是未 来的发展趋势。 为了能够更好的识别和跟踪手势的运动轨迹,提出了 基于0PENCV的手势识别系统,系统引入了OPENCV计算 机视觉库,采用轮廓匹配方法,最终识别出手型,并可以有效分析出运动轨迹。

实现技术思路

一、系统总体设计

系统总体结构

本体统大体上分为3个部分。面向用户的参数调整模块, 试用MFC程序配合OPENCV库调用摄像头函数进行视频提 取,调整函数,该部分主要的功能是为系统提供原始数据,并 且让用户进行参数调整以应对不同光线环境和其他影响下,能 够更好的提高识别率。

第二部分是肤色提取主模块,该部分的 功能对应着系统需要分析时的轮廓提取步骤,模板匹配只能针 对手势的二值图像进行匹配,我已我们要通过一定的算法对初 始输入数据进行处理。包括预处理的降噪,肤色提取。和最后 的轮廓提取。最后一部分是手势识别主模块,程序运行时,当 输人数据已经完成处理之后,将处理后的数据与预想设定的模 板数据进行匹配。系统结构图如图所示。

数据采集与图像预处理模块

要进行手势信息的获取,首先需要拥有一定的硬件,如数 据手套、摄像头等。对于软件方面则要安装相应的驱动程序和 了解它们的API。本文利用OPENCV具有简洁的外部接口的 优点,MFC类库和0penCV可以将摄像头的源数据或数据的 处理情况呈现到控件中。

1、图像缩放

由于通过摄像头采集到的图像非常大,对系统的处理时间 造成延时,所以必须要对其进行缩放操作,即需要缩放到一个 合理的大小,如320×240,为了加强精确度有条件的可以加 到640×480。OpenCV提供了一个函数cvResize可以实现这个 功能。如原Ipllmage*图片是m—Captured,目标图片是m— Frame,则函数可写成:

cvResize(m—Captured,m—Frame(m—Captured一>width)>(m—
Frame一>width)?CV—INTER—LINEAR:CV—INTER—AREA);

2、图像降噪处理

图像噪声按产生的原因可分为外部噪声和内部噪声。外部 噪声是指由于系统外部干扰以电磁波或由电源串进系统内部而 引起的噪声。如电气设备,天体放电现象等引起的噪声,而这 种噪声可能就是高斯噪声、脉冲噪声等多个噪声合成累计的。

内部噪声主要是由光和电的基本性质所引起的噪声。如电流的 产生是由空穴或电子的集合,定向运动所形成的,而这些粒子 运动的带有随机性,产生了散粒噪声;而导体中也有自由电 子,它们会进行无规则热运动,形成热噪声。为了消除这些随 机因素,本文通过中值滤波或均值滤波的方法法进行滤波。对 应的OpenCV函数是:

void cvSmooth(const CvArr*src.CvArr*dst,int smoothtype=
CV_GAUSSIAN,int paraml=3,int param2=0,double param3=0。
double param4=O)。

其中smoothtype是CV—GAUSSIAN时将对图像进行大 小为paraml×param2的高斯卷积的均值滤波。而smoothtype 是CV—MEDIAN时将对图像进行大小为paraml×paraml的 中值滤波,注意为paraml奇数,且不大于7,其效果结果如 图所示。

3、图像锐化处理

一般来说,经过图像的降噪处理后会显得比较朦胧,有时 候需要进行USM锐化方可实现更好的边缘提取。为此可以先用cvSmooth,smoothtype选CV—GAUSSIAN进行均值滤波 到一个临时图像,然后按一定阈值将原图像与临时图像的像素 反差扩大即可,反差扩大的公式为:

 式中,z表示原图像的亮度,F表示临时图像的亮度,A表示锐 化的强度(女>1),x表示目标图像的亮度。 而通过原图像与临时图像的色差的阈值的调整,可以减少 一些不需要锐化的区域,但如上所述,会造成边缘突兀和不连 续,为此也可以将位于原图像与临时图像的亮度差在阈值内部 分的锐化强度,按这个亮度差线性减弱。如图所示。

二、手势区域特征提取

基于计算机视觉的手势识别的首要任务就是要将手和背景 区分开,而背景环境往往会十分复杂,前面通过一系列的降噪 和锐化实现了冗余信息的剔除和重要信息的强化,从而为接下 来的操作作准备,下面主要给出如何尽可能准确地将手所在的 区域从复杂的背景中提取出来。

肤色模型建立:

人眼对于色彩的敏感度要强于其他参数,因而在复杂环境 中人眼接收彩色图像较黑白图像更为快速,信息量更大。虽然 肤色人人均有不同,但是整体手势中,肤色占去的比例十分巨 大,尤其是排除了光线变化影响之后,这种效果更加明显,所 以采用HSV空间进行手势分割效果更好,更加简便,可应用 于实时手势提取。

HSV是简化了的孟塞尔色彩空间,以色调(H),饱和度 (S),亮度(y)为3种参数来表示色彩。 从RGB色彩空间映射到HSV色彩空间的方法如下:

 当MAX(R,G,B)≠0

由于人手的主要肤色集中在红色区域,表现在图像中就是 R>G>B。据此原理将其简化后得到以下要素表达式:

 在OPENCV中具体实现如下:  设m—Frame为Ipllmage*的图片,src为它的imageData 的开头,则鼠标在图像的坐标(zo,y0)上的像素指针为:

mByte=src+x0*(m—Frame一>nChannels)+y0*(m—
Frame一>widthStep):

关于这一像素的COLORREF颜色:

colour=(int)mByte[o]<<16 l(int)mByte[1]<
<8 I(int)mByte[2];

需要注意的是,图像不一定充满整个控件,如果在空间外 将会出现一些越界的情况,为此需要判断这个点是否在图 像上:

if(xO>一0&&xO<m Frame一>width『I yO>一0
&&vO<m Frame一>height)

OpenCV中实现上述方法的函数为void cvCvtColor( const CvArr*src,CvArr*dst,int code),其中src输入的 是原图像指针,而IplImage继承了CvArr,有时需要将用整数 信息存储的图片转换为一定精度的浮点图;dst输入的是目标 图像的指针;code是色彩空间转换的模式,该code来实现不 同类型的颜色空间转换。比如当code选用CV—BGR2 HSV 时,对于8位图,需要将RGB值归一化到0—1之间。这样得 到HSV图中的H取值范围才是[0,360),S和V的取值范 围是[o,1]。

三、系统设计与实现

系统环境设置

本文设计的手势识别系统GestureTest的开发环境采用 Visual C++2010,系统类型采用了MFC基于对话框的应用程 序,第三方库选用OpenCV作为识别的辅助工具。所以必须先 进行工程环境的配置:

1)安装OpenCV2.0,并在其安装目录下的include和lib 下的所有文件复制到C:\Program Files\Microsoft Visual Studio 10.0\VC\下的同名目录中。

2)打开所建立的工程,选择项目一GestureTest属性,配 置选“所有配置”,并在其下的配置属性一链接器一输入中输 入cxcore200d.1ib;cv200d.1ib;highgui200d.1ib;%(Addition— alDependencies)

3)将OpenCV安装目录下的bin目录里的cv200d.d11、 cxcore200.dll、cxcore200d.dll和highgui200d.dll复制到项目 生成的可执行文件的相同目录下。如果不能运行,则复制该 bin目录里文件名不带d结尾(不含扩展名)的相应文件,并 将程序旁dll文件的文件名后加上d即可。

建立的项目主要包含以下文件:

GestureTest.h

GestureTestDlg.h

source.h

stdafx.h

targetver.h

GestureTest.cpp

GestureTestDIg.cpp

stdafx.cpp

其中的GestureTestDlg.cpp,即CGestureTestApp类在 InitInstance()方法的dig.DoModel后需要加上

if(dig.m—Video!一NULL){
cvReleaseCapture(&(dig.m—Video));
}

用来在程序结束后释放视频指针变量m—Video,否则程 序在关闭后无法彻底退出。

主要的实现方法将在CGestureTestDlg类中实现。在构造 函数中将成员变量和控件变量赋上初始值,并在OnInitDialog 中进行如图所示的操作。

手势识别实验

本系统定义了10种基本的手势模型,将该lo个手势模板 作为匹配模板进行手势识别,如图所示。

 对应的该10种手势模型经过一系列图像分割锐化等处理 后如图所示。

在具体实验中,邀请10个实验者在数字视频摄像头 前面做出相应的手势图像,通过摄像头采集这些手势,并把这 些数据保存下来作为测试样本,每种手势做8次,共计80副, 每种手势取5副,共取50副作为测试集进行测试。也就是找 到特征手势与模版手势测试的距离最小的手势,作为最优的识 别率。测试结果如表所示。

由于篇幅限制,也就给 出一种摄像头采集的手势图像,如图所示。

四、总结

当今的人机交互技术已经成为了制约计算机应用和发展的 一道瓶颈之一。本文利用0PENCV更好的图像处理技术以及 实时的交互界面,设计了一种基于OPENCV的手势识别系 统,并在系统中给出了10种简单手势的识别率,这说明本系 统具有一定的实用性。可以推广到一些具体的应用领域。 

实现效果图样例

手势识别系统:

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年12月12日
下一篇 2023年12月12日

相关推荐