欢迎来到工友文库! | 帮助中心 工友共享,造福你我!
工友文库
全部分类
  • 行业文库 >
    行业文库
    行业标准 农林牧渔 能源矿业 电力热力 水利环境 材料技术 地理测绘 建筑工程 机械工程 制造加工 交通物流 网络计算 电气机电 信息通讯 汽车行业 航空航天 船舶工程 光电工程 住宿餐饮 财会金融 房地产业 城建规划 装饰装修 家电维修 电商行业 租赁商务 批发零售 居民服务 教育服务 医药卫生 体育行业 公共管理 图书管理 外语翻译 休闲旅游 文艺传媒 其他行业
  • 商业文档 >
    商业文档
    企业计划 工程管理 广告经营 财务报表 物业管理 质控管理 企业文化 绩效管理 商务礼仪 创业孵化 市场营销 经营企划 销售管理 营销创新 资本运营 招商加盟 合同协议 信息管理 励志材料 人事档案 员工关系 薪酬管理 招聘面试 其它文档
  • 办公文书 >
    办公文书
    统计图表 总结报告 演讲致辞 心得体会 述职报告 工作计划 解决方案 调研报告 事务文书 经验事迹 往来文书 规章制度 申请范文 求职简历 活动策划 会议纪要 党建材料 软件教程 其他文书
  • PPT模板库 >
    PPT模板库
    扁平风格 创意新颖 动画效果 动态模板 简约风格 静态模板 环保绿色 卡通风格 立体风格 欧洲风格 手绘风格 创意黑板 相册风格 星空风格 炫酷科技 中国风格 医疗风格 高端商务 工作常用 总结报告 毕业答辩 节日庆典 公益风格 化妆美容 婚礼策划 餐饮美食 培训课件 融资路演 商业策划 英文模板 党政机关 述职竞聘
  • 小学初中 >
    小学初中
    幼儿教育 小学语文 小学数学 小学英语 初中语文 初中数学 初中英语 初中物理 初中化学 初中地理 初中生物 初中政治 初中历史 思想品德 小学竞赛 初中竞赛 其他学科
  • 高中教育 >
    高中教育
    高中语文 高中数学 高中英语 高中物理 高中化学 高中生物 高中地理 高中政治 高中历史 高考资料 高中竞赛 其他学科
  • 高等教育 >
    高等教育
    基础课 艺术类 哲学类 体育类 水利类 测绘类 法学类 历史学 社会学 心理学 教育学 政治学 统计学 房地产 语言文化 生物科学 医药卫生 天文气象 地理科学 环境科学 系统科学 材料科学 机械仪表 图书档案 土建工程 海洋工程 轻工纺织 工程力学 能源动力 光电工程 电力技术 市政工程 财会金融 工商管理 语言文学 广播影视 公安司法 汽车汽修 交通运输 水产加工 植物生产 森林资源 动物科学 食品加工 餐饮旅游 公共事业 新闻传播学 农林业工程 城镇规划管理 水文与水资源 地矿及资源勘查 航空航天与武器 管理科学与工程 农林业经济管理 机电设备及自动化 计算机与信息科学 大学生竞赛资料
  • 执业资格考试 >
    执业资格考试
    财会类考试 建筑类考试 外贸类考试 外语类考试 医药类考试 管理类考试 公务员类考试 司法法律考试 教师资格考试 计算机类考试 公共服务类考试 其他资格证考试
  • 一线采风 >
    一线采风
    一线新闻 事迹宣传 工友作品
  • 教育视频 >
    教育视频
    幼儿教育视频 小学教育视频 初中教育视频 高中教育视频 大学教育视频 C#自学视频教程 软件视频教程 英语视频教学 其他教学视频
  • 换一换
    首页 工友文库 > 资源分类 > DOCX文档下载
     

    基于手势识别的人机交互系统设计.docx

    • 资源ID:3395       资源大小:2.57MB        全文页数:53页
    • 资源格式: DOCX        下载权限:注册会员/VIP会员    下载费用:2金币 【人民币2元】
    下载资源需要2金币 【人民币2元】
    已注册用户请登录:
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

    基于手势识别的人机交互系统设计.docx

    第十二届智能控制设计大赛 初级组 基于手势识别的人机交互系统 *** 目录 一、设计要求2 1.基本要求2 2.拓展要求3 3.完成事项说明3 二、算法选择3 1.图像处理与手部区域分割3 (1)由于不允许使用深度信息,所以选择通过肤色检测与分割来获取手。3 (2)为了应对复杂背景,采用背景差分的方法来去除相对静止不动的背景图像。3 (3)由于进行人机交互时往往有人脸出现在摄像头范围内(当需要两只手共同操作时甚至是必须),所以我们不能忽视这个问题。在这里,我们采取haarcascade 分类器进行人脸检测,并移除人脸。3 2.手部特征提取3 (1)通过凸包算法获得手部图像的凸包,再求出其凸缺陷,这种算法运算复杂度较低,利于实时性要求高的程序,而且,识别准确率也较高4 (2)手势质心,可以较准确地定位手,捕捉手移动的轨迹。4 3.手势识别算法4 (1)通过对有效凸缺陷点数量可以准确地识别剪刀、石头、布的手势。4 (2)上一方法在识别的手势数量比较少的时候效果较好,但是当需要识别的手势数量变多的时候效果变得较差,所以在这种情况下,我采取了以手部图片的Hog特征、使用机器学习SVM算法进行分类,得到不错的效果。4 4.手势轨迹识别算法4 (1)采取隐马尔可夫模型对时序数据建模,进而识别手势轨迹。4 三、程序设计4 四、实验结果7 五、总结8 (1)8 (2)8 (3)8 六、附录(程序代码)9 七、参考文献52 一、 设计要求 1. 基本要求 1 基于摄像头获取的图像数据,实现手部检测; 2 实现拳头、剪刀、布三个手势的识别; 3 设计良好的人机界面,用于展示原始图像以及处理结果等信息; 2. 拓展要求 1 控制鼠标完成移动、单击、双击、拖动等操作; 2 控制电脑关屏、开屏; 3 设计锥子剪刀布游戏播放提示语、判断胜负等; 4 实现空中手写轨迹识别; 5 其他拓展功能。 3. 完成事项说明 1 基于摄像头获取的图像数据,实现手部检测; 2 实现拳头、剪刀、布三个手势的识别; 3 设计良好的人机界面,用于展示原始图像以及处理结果等信息; 4 控制鼠标完成移动、单击、双击、拖动等操作; 5 控制电脑关屏、开屏; 6 设计锥子剪刀布游戏播放提示语、判断胜负等; 7 实现空中手写轨迹识别; 8 实现控制电脑玩CS游戏 二、 算法选择 1. 图像处理与手部区域分割 (1)由于不允许使用深度信息,所以选择通过肤色检测与分割来获取手。 (2)为了应对复杂背景,采用背景差分的方法来去除相对静止不动的背景图像。 (3)由于进行人机交互时往往有人脸出现在摄像头范围内(当需要两只手共同操作时甚至是必须),所以我们不能忽视这个问题。在这里,我们采取haarcascade 分类器进行人脸检测,并移除人脸。 2. 手部特征提取 (1)通过凸包算法获得手部图像的凸包,再求出其凸缺陷,这种算法运算复杂度较低,利于实时性要求高的程序,而且,识别准确率也较高 (2)手势质心,可以较准确地定位手,捕捉手移动的轨迹。 3. 手势识别算法 (1)通过对有效凸缺陷点数量可以准确地识别剪刀、石头、布的手势。 (2)上一方法在识别的手势数量比较少的时候效果较好,但是当需要识别的手势数量变多的时候效果变得较差,所以在这种情况下,我采取了以手部图片的Hog特征、使用机器学习SVM算法进行分类,得到不错的效果。 4.手势轨迹识别算法 (1)采取隐马尔可夫模型对时序数据建模,进而识别手势轨迹。 三、 程序设计 图 1基本流程框架 图 2图像预处理基本流程 四、 实验结果 图 3剪刀石头布 图 4控制鼠标 图 5控制玩CS1.6 图 6手势数据 五、 总结 (1)程序对于复杂背景和人脸干扰具有良好的鲁棒性,已经基本可以免除人脸干扰,但是仍存在手与脸相交时识别困难的问题,通过查论文发现大家对于这个问题的解答大多数是通过使用深度相机等方式解决。 (2)程序使用了YCrCb空间转换,能有效地减少光照亮度等干扰。 (3)本文尝试多种方式对于基于手势识别的人机交互进行拓展,取得了良好的效果,并基于此开发了基于手势的剪刀石头布游戏、控制鼠标、手势轨迹识别、控制玩CS1.6,也取得了不错的效果。 六、 附录(程序代码) //Control.h pragma once include iostream include Windows.h include atltypes.h using namespace std; class Contorl { public Contorl; CPoint mousePos; void setMousePosint x, int y; void setMousePosOffsetint x, int y; void leftDown; void leftUp; void rightDown; void rightUp; void leftClickMouse; void leftDoubleClickMouse; void rightClickMouse; void rightDoubleClickMouse; void keyboardHitint key; void keyboardDownint key; void keyboardUpint key; private }; //Control.cpp include Control.h ContorlContorl { GetCursorPosmousePos; } void ContorlsetMousePosint x, int y { mousePos.x x; mousePos.y y; SetCursorPosmousePos.x, mousePos.y; } void ContorlsetMousePosOffsetint x, int y { GetCursorPosmousePos; mousePos.x x; mousePos.y y; SetCursorPosmousePos.x, mousePos.y; } void ContorlleftDown { mouse_eventMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0; } void ContorlleftUp { mouse_eventMOUSEEVENTF_LEFTUP, 0, 0, 0, 0; } void ContorlrightDown { mouse_eventMOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0; } void ContorlrightUp { mouse_eventMOUSEEVENTF_RIGHTUP, 0, 0, 0, 0; } void ContorlleftClickMouse { mouse_eventMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_LEFTUP, 0, 0, 0, 0; } void ContorlleftDoubleClickMouse { mouse_eventMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_LEFTUP, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_LEFTUP, 0, 0, 0, 0; } void ContorlrightClickMouse { mouse_eventMOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_RIGHTUP, 0, 0, 0, 0; } void ContorlrightDoubleClickMouse { mouse_eventMOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_RIGHTUP, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0; mouse_eventMOUSEEVENTF_RIGHTUP, 0, 0, 0, 0; } //define MAPVK_VK_TO_VSC 0 BYTE scan_codeDWORD pKey { const DWORD result MapVirtualKeypKey, MAPVK_VK_TO_VSC; return static_castBYTEresult; } DWORD WINAPI backgroundKeyboardHitPVOID pvParam { //keybd_eventVK_RETURN, 0, 0, 0; char key *char *pvParam; //cout key endl; keybd_eventkey, scan_codekey, 0, 0; Sleep100; keybd_eventkey, scan_codekey, KEYEVENTF_KEYUP, 0; return 0; } void ContorlkeyboardHitint key { //cout ----- key endl; int * k new int; *k key; CreateThreadNULL, //默认安全级别 0, //默认栈大小 backgroundKeyboardHit,//线程函数 void *k, //void *key, //函数没有参数 0, //创建后直接运行 NULL; //线程标识,不需要 } void ContorlkeyboardDownint key { keybd_eventkey, scan_codekey, 0, 0; } void ContorlkeyboardUpint key { keybd_eventkey, scan_codekey, KEYEVENTF_KEYUP, 0; } //FiniteStateMachine.h pragma once define EMPTY0 define CONTROL_COMPUTER 2000 define BOTH_UP2001 define LEFT_DOWN2002 define RIGHT_DOWN2003 define OPEN_OFF_SCREEN2500 define IS_OPEN2501 define IS_OFF2502 define SHITOUJIANDAOBU1000 define TRACK_DETECTION1500 define CONTROL_CS3000 //HandDetect.h pragma once include iostream include opencv2\opencv.hpp include opencv2\objdetect.hpp include opencv2\ml.hpp include algorithm using namespace std; using namespace cv; using namespace ml; //define INIT // init //define SRC //原图像 //define BGSUB //背景差分 //define SKIN //肤色检测后 //define SEGMENT //showSegmentations //define HAND //hand 和 mask define YUV // HSV struct Circle { Point2f center;//圆心 float radius;//半径 }; struct HandFeature { Point center; // 质心 vectorPoint validDefects; // 有效缺陷点 Rect handRect; // 包围矩形 RotatedRect rotatedHandRect; // 最小外接矩形 Circle innerCircle; // 内切圆 Circle outerCircle; // 外接圆 int result; // 识别结果 }; ifdef HSV //hsv_min static int hsvMinH 0; static int hsvMinS 10; static int hsvMinV 60; //hsv_Max static int hsvMaxH 20; static int hsvMaxS 150; static int hsvMaxV 255; endif // HSV ifdef YUV // yuv_min static int yuvMinY 0; static int yuvMinU 133; static int yuvMinV 77; // yuv_Max static int yuvMaxY 256; static int yuvMaxU 173; static int yuvMaxV 127; endif // YUV const static Scalar colors[] { Scalar255,0,0, Scalar255,128,0, Scalar255,255,0, Scalar0,255,0, Scalar0,128,255, Scalar0,255,255, Scalar0,0,255, Scalar255,0,255, Scalar0,0,0 }; class HandDetect { public // 背景差分使用的算法 //PtrBackgroundSubtractor bg_model createBackgroundSubtractorKNN.dynamicCastBackgroundSubtractor; PtrBackgroundSubtractor bg_model createBackgroundSubtractorMOG2.dynamicCastBackgroundSubtractor; double g_BackgroundLearningRate -1; CascadeClassifier cascade; VideoCapture cap; Mat frame; float frameScale;// 缩放倍数 HandDetect; // 初始化一些数据 void init; // 进行一定的缩放 void frameResizefloat s; // 预处理 void preProcessconst Mat src, Mat dst; // 手特征提取 bool handFeatureExtractionconst Mat src, HandFeature dstFeature; // 两只手手特征提取 bool handFeatureExtractionconst Mat src , HandFeature leftHandFeature, HandFeature rightHandFeature; // 移除人脸 void removeFaceMat src, Mat dst; // 背景差分 void backgroundSubtractionMat src, Mat bgSub; // skin detection void hsvSkinDetectionMat src, Mat dst; void yuvSkinDetectionMat src, Mat dst; }; //HandDetect.cpp include HandDetect.h HandDetectHandDetect { init; frameScale 1; } // 进行一定的缩放 void HandDetectframeResizefloat s { frameScale s; resizeframe, frame, Sizeframe.cols / frameScale, frame.rows / frameScale; cout 现在图像的大小是 frame.rows * frame.cols endl; } // 初始化各种东西 void HandDetectinit { //ifdef INIT namedWindowconfig; resizeWindowconfig, 320, 240; //namedWindowconfig, WINDOW_NORMAL; ifdef HSV createTrackbarhsvMinH, config, hsvMinH, 180, NULL; createTrackbarhsvMinS, config, hsvMinS, 255, NULL; createTrackbarhsvMinV, config, hsvMinV, 255, NULL; createTrackbarhsvMaxH, config, hsvMaxH, 180, NULL; createTrackbarhsvMaxS, config, hsvMaxS, 255, NULL; createTrackbarhsvMaxV, config, hsvMaxV, 255, NULL; endif // HSV ifdef YUV createTrackbaryuvMinY, config, yuvMinY, 180, NULL; createTrackbaryuvMinU, config, yuvMinU, 255, NULL; createTrackbaryuvMinV, config, yuvMinV, 255, NULL; createTrackbaryuvMaxY, config, yuvMaxY, 180, NULL; createTrackbaryuvMaxU, config, yuvMaxU, 255, NULL; createTrackbaryuvMaxV, config, yuvMaxV, 255, NULL; endif // YUV //endif if cascade.loadhaarcascade_frontalface_alt2.xml { cerr ERROR Could not load classifier cascade endl; } } // 预处理 void HandDetectpreProcessconst Mat src, Mat dst { Mat frame src.clone; // 中值滤波 medianBlurframe, frame, 3; // 高斯滤波 //GaussianBlurframe, frame, Size5, 5, 0, 0; // 开运算 //Mat element getStructuringElementMORPH_ELLIPSE, Size5, 5; //morphologyExframe, frame, MORPH_OPEN, element; ifdef SRC imshow0--原图像处理后, frame; endif // 移除人脸 removeFaceframe, frame; // 背景差分 Mat bgSub; backgroundSubtractionframe, bgSub; ifdef BGSUB imshow1--背景差分后, bgSub; endif // 肤色检测 Mat matSkinDetectionOutput; ifdef HSV hsvSkinDetectionbgSub, matSkinDetectionOutput; endif // HSV ifdef YUV yuvSkinDetectionbgSub, matSkinDetectionOutput; endif // HSV ifdef SKIN imshow2--肤色检测后, matSkinDetectionOutput; endif Mat element1 getStructuringElementMORPH_ELLIPSE, Size3, 3; morphologyExmatSkinDetectionOutput, matSkinDetectionOutput, MORPH_CLOSE, element1; //imshow2--肤色检测后处理后, matSkinDetectionOutput; dst matSkinDetectionOutput.clone; } // 手特征提取 bool HandDetecthandFeatureExtractionconst Mat src, HandFeature dstFeature { //提取检测轮廓 vectorvectorPointcontours; findContourssrc, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE; //轮廓检测为空的情况 if contours.empty { cout contoues is Empty endl; return false; } //sortcontours.begin, contours.end //, []const vectorPoint lhs, const vectorPoint rhs {return lhs.size rhs.size; }; //找出面积最大的轮廓 ////这里后期应该可以考虑多个手同时识别 double maxArea 0; int maxIndex 0; for int i 0; i contours.size; i { double area contourAreacontours.ati; if area maxArea { maxIndex i; maxArea area; } } dstFeature.handRect boundingRectcontours.atmaxIndex; if dstFeature.handRect.area 7000 / frameScale / frameScale { // 画外接矩形 rectangleframe, dstFeature.handRect, colors[8], 2; // 画最小外接矩形 dstFeature.rotatedHandRect minAreaRectcontours.atmaxIndex; Point2f P[4]; dstFeature.rotatedHandRect.pointsP; for int j 0; j 3; j { lineframe, P[j], P[j 1 4], colors[7]; } // 找质心 Moments moment momentscontours.atmaxIndex, true; dstFeature.center.x moment.m10 / moment.m00; dstFeature.center.y moment.m01 / moment.m00; circleframe, dstFeature.center , 5, colors[5], CV_FILLED; //Mat temp srcdstFeature.handRect.clone; //imshowtemp, temp; //Mat edge; //Cannytemp, edge, 3,9,3; //imshowedge, edge; // 找最大内切圆 double t doublegetTickCount; vectorPoint randChoose; for int i 0; i contours.atmaxIndex.size; i { if i 10 7 { randChoose.push_backcontours.atmaxIndex.ati; } } double dist, maxdist -1; for int i dstFeature.handRect.x ; i dstFeature.handRect.x dstFeature.handRect.width; i 2 for int j dstFeature.handRect.y ; j dstFeature.handRect.y dstFeature.handRect.height; j 2 { dist pointPolygonTestrandChoose , Pointi, j, true; //dist pointPolygonTestcontours.atmaxIndex //, Pointi, j, true; if dist maxdist { maxdist dist; dstFeature.innerCircle.center.x i; dstFeature.innerCircle.center.y j; dstFeature.innerCircle.radius maxdist; } } circleframe, dstFeature.innerCircle.center , dstFeature.innerCircle.radius, colors[4]; circleframe, dstFeature.innerCircle.center , 5, colors[4], CV_FILLED; t doublegetTickCount - t; printf计算内接圆时间 g ms\n, t * 1000 / getTickFrequency; // 找最小外接圆 minEnclosingCirclecontours.atmaxIndex, dstFeature.outerCircle.center, dstFeature.outerCircle.radius; circleframe, dstFeature.outerCircle.center , dstFeature.outerCircle.radius, colors[3]; circleframe, dstFeature.outerCircle.center , 5, colors[3], CV_FILLED; //---------------------计算凸包------------------------------- vectorint hull; convexHullcontours.atmaxIndex, hull, true; //---------------绘制凸包------------ int hullCount static_castinthull.size; Point point0 contours.atmaxIndex.athull.athullCount - 1; for int i 0; i hullCount; i { Point point contours.atmaxIndex.athull.ati; lineframe, point0, point, Scalar0, 0, 128, 2, LINE_AA; point0 point; } //// vectorVec4i defects; //--------------如果有凸缺陷就把它画出来------------------- if isContourConvexcontours.atmaxIndex { cout contours.atmaxIndex的轮廓是凸包 endl; } else { cout contours.atmaxIndex的轮廓不是凸包 endl; // 计算凸缺陷 convexityDefectscontours.atmaxIndex, Mathull, defects; // 凸缺陷 cout 共 defects.size 处缺陷 endl; dstFeature.validDefects.clear; for int i 0; i defects.size; i { if defects[i][3] / 256 0.2 * dstFeature.handRect.height continue; //if defects[i][3] / 256 30 //continue; //cout contours.atmaxIndex[defects[i][1]].y -------------- dstFeature.center.y endl; if contours.atmaxIndex[defects[i][2]].y dstFeature.center.y 10 continue; circleframe, contours.atmaxIndex[defects[i][0]], 3, Scalar0, 0, 255, 2, CV_AA;//开始点 circleframe, contours.atmaxIndex[defects[i][1]], 3, Scalar0, 0, 0, 2, CV_AA; // 结束点 circleframe, contours.atmaxIndex[defects[i][2]], 3, Scalar255, 0, 0, 2, CV_AA; // 距离最远的点 //lineframe, contours.atmaxIndex[defects[i][0]], contours.atmaxIndex[defects[i][1]], Scalar0, 255, 0, 1, CV_AA; //lineframe, contours.atmaxIndex[defects[i][1]], contours.atmaxIn

    注意事项

    本文(基于手势识别的人机交互系统设计.docx)为本站会员(admin)主动上传,工友文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知工友文库(发送邮件至gydoc@qq.com或直接QQ联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    copyright@ 2019-2022 工友文库网站版权所有
    经营许可证编号:鲁ICP备19032292号-1


    1
    收起
    展开