基于激光投射虚拟键盘镭射参考_第1页
基于激光投射虚拟键盘镭射参考_第2页
基于激光投射虚拟键盘镭射参考_第3页
基于激光投射虚拟键盘镭射参考_第4页
基于激光投射虚拟键盘镭射参考_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

诚信声明本人声明1、本人所呈交的诚信声明本人声明1、本人所呈交的毕业设计(论文)是在老师指导下进行的研工作及取得的研究成果2、据查证,除了文中特别加以标注和致谢的地方外,毕业设(论文)中不包含其他人已经公开发表过的研究成果,也不包含为得其他教育机构的学位而使用过的材料3我承诺本人提交的毕业设(论文中的所有内容均真实可信作者签名日期年月日镭射键盘、mini全向轮移动小车等等),敬请关注!镭射键盘、mini全向轮移动小车等等),敬请关注!关注回复关键词【自动跟随】:获取自动跟随机器人的资料教程技术交流学习请加微信备注【进群】拉你进交流群目录摘 第目录摘 第1章绪 OpenCV背景和现 OpenCV发展状 OpenCV应用简 Studio简 CameraCalibrationToolbox简 硬件简 红外激光简 摄像头简 1.4课题设计要 23总体设计方案构 基本原理介 软件介 硬件系统设 摄像 红外激 键盘投影激 电源转换电 第4章软件设 开发环境介 4.1.2OpenCV视觉库的使 摄像头的标 上位机程 程序流程图设 第5章整机调 系统总 按键测 按键容错测 总致 参考文参考文 附 TheThevirtualkeyboardbasedonlaserprojectionAbstract:ThelaserprojectionvirtualkeyboarddesignedinthisthesisisbasedonOpenCVcombinewithimagecamera,980nmlinearlaser,980nminfraredfilterandKeyboardprojectionlaser,theimagecameradetectionusedwith980nminfraredfilteriscausedbyshieldingfingertomake980nmlinearlaserdiffusereflectionthelight.Bydetectingandlocatingthecenterpositionofthelightoutlinetodiscernanddetectthepositionoffingerandthenmaptokeyboardpositiontoachieverelativekeyboardkeyevents.WithOpenCVvisionlibrary,itisfasttofindthefingeroutlinewhichisgetbyimagecamera,thepositionoffingerlocationandrevisetheimagesurfacedistortionwhichiscausedbyimagecamera.ByusingOpenCV,thebottomhardwaredrivecodewrittencanbereduced,andinvokebuilt-infunctioncandirectlyfacetohardwarewritecodetofastenthedifficultandspeedofprogramdevelopment.Byexperimentandtest,thisvirtualkeyboardcancorrectlyandaccuratelylocateanddetectthefingerposition,ontheotherhand,thiskeyboardalsohavefault-toleranttreatment,andfinallyrealizethefunctionofkeyinput.KeyWords:OpenCV;C++;imageprocessing;VisualStudio2010;laser11.1OpenCVOpenCV1.1.1OpenCV发展状OpenCVOpenSourceComputerVisionLibrary19991.1.2OpenCV应用简OpenCV可以应用于人机交互领域可以通过识别人手在空间的位置以及手势从而可1.1.3VisualStudio简Visual 在第一代VisualStudio是1997年推出的,它基本上已经包含了绝大部分的微软的自带不断的出现更新版而使得成为了最受欢迎的编译环境,用它所编辑的代码使用于Windows平台包括MicrosoftWindowsWindowsMobileWindowsCE、.NETFramework、.NETCompactFrameworkMicrosoftSilverlight及WindowsPhone,同时1.2CameraCalibrationToolboxMATLAB1.2CameraCalibrationToolboxMATLABMathWorks公司出品的商业数学软件,数据可视化、用于算法开Simulink两大部分,在世界编程语言排行榜2014年3Matlab排名第16位并且使MatlabJAVA,C,C++FORTRANMatlab软件里直接Matlab中直接调用,在自带的库函数中包含了基本上所有的工Matlab中除了拥有基本的数百个内部函数之外还包含了三十几种不同用途的工MATLABMatlab里的一个工具箱主要用于摄像机内部参数标定,利用这个工具箱就可以得1.31.3.1红外激光简LASER,意思是“受激辐射的光放大”红外激光也是激光的一种只是它的发光波长是760nm~1mm是波长比红光长的非可1.3.2摄像头简CCD(电荷耦合器件)1.4以及了解OpenCV视觉库的使用和移植。2980nm2980nm2.12.22.2OpenCVC33.133.1头的镜头的视角是90°的所以检测到的面积很小这样就会导致摄像头固定的高度会很150h2而的视角是90°同样为了检测所有的键盘投影范围所需要安装的高度需是CameraCamera1h1Camera1的视角小于Camera2所有必需得提高安装高度才能检测到同样的面积范围,为了缩小整个硬件系统故选择了视角为150°镜头的摄像头。2所示左边的镜头是市面上摄像头的镜头在镜头后面加了一层红外光滤光片这个滤光片980nm2所示左边的镜头是市面上摄像头的镜头在镜头后面加了一层红外光滤光片这个滤光片980nm980nm的980nm980nm以下的光线而3.2未滤可见光效滤除可见光效3.33.230mW980nm30mWB类型激光只有不要 120°只有调节好投影键盘的位置一字激光可以完全覆盖到所有的键盘范围3.3键盘投影激123432 120°只有调节好投影键盘的位置一字激光可以完全覆盖到所有的键盘范围3.3键盘投影激1234321213253.53.6PCB5V供电而键盘投影激光是要3.3V供电使用需要一个3.3V5V3.3V144.144.1StudioWindowsOpenCV4.24.24.24.2150所拍摄出的图片是会有失真的所以在实际操作中必须要把失真的图片校正不然在后面MatlabCameraCalibrationoolbox。MatlabCameraCalibrationToolboxGUI界面(4.3-1)4.3CameraCalibrationToolbox4.44.5单张标定照片标定4.6标定误差分析4.6标定误差分析标定图片在4.8标定镜头畸变向量图4.8标定镜头畸变向量图4.9标定输出参数4.10xmlMatlab校正校正4.11校正后的图片比较4.2-校正校正4.11校正后的图片比较4.2-4.3上位机程使用VisualStudio通过OpenCV原始图 cvThreshold对单通道图片数据应用固定阈值操作4.134.13得到二值化图像后接下来要做的就是查找所有兴趣点的轮廓,OpenCV里的findContours是轮廓检测函数之一这个函数可以使用多边形来近似表示一个轮廓其次,函数对该多边形曲线做适当近似,如果要画出查找到的轮廓的话就可以配合使用drawContoursboundingRect,还可以得到轮廓的外包络矩形。定位包络4.14查找轮廓后的图片4.15键盘映射后的图片4.15键盘映射后的图片4.1655.155.1系统总5.1整机总成5.2按键5.2按键测比较丰富所以该系统在检测的时候可能会受到影响,因为本系统中使用的是980nm滤光片而自然界的光也包含了这一波长的光以及这波长附件的光而滤光片不能完完全5.2按键测试5.35.3上位机按键检测5.3按键容错测5.4多键按下容错测试5.4多键按下容错测试5.5多键按下软件容错测试5.6两键按下容错测试U5.6两键按下容错测试U5.7两键按下软件容错测试PCMatlab、AltiumDesigner等设计工具完成设计。OpenCVVisualStudio设计比较系统的东西,以前VC++6.0VisualStudioOpenCVOpenCV视孙鑫VC++深入详解[M].电子工业出版社,BradskiG.OpenCV(中文版)[M].清华大学出版社孙鑫VC++深入详解[M].电子工业出版社,BradskiG.OpenCV(中文版)[M].清华大学出版社张德丰MATLAB数字图像处理[M].机械工业出版社(美)StanleyB.LippmanBarbaraE.Moo,JoséeLaJoie.CPrimer[M].人民邮电出版社严蔚敏.C语言版[M].清华大学出版社[6]HCormenT,ELeisersonC.算法导论[M].机械工业出版社出版(第二版)〔加〕RobertLaganiereOpenCV2计算机视觉编程手册[M].科学出版社陈胜勇,刘盛.OpenCV的计算机视觉技术实现[M].科学出版社(美)StanleyB.LippmanBarbaraE.Moo,JoséeLaJoie.CPrimer[M].人民邮电出版社[10].OpenCVTutorialsRelease[CP/OL].[2010-3-2].[11].OpenCV2.4CheatSheet(C++)[CP/OL].[2010-3-4].[12].OpenCVReferenceManualRelease[CP/OL].[2010-4-6].[13].OpenCVManagerManualRelease[CP/OL].[2010-5-12].[14].OpenCVUserGuideRelease[CP/OL].[2010-5-24].[17]ZhangZ.AFlexibleNewTechniqueforCameraCalibration[EB/OL].[2010-6-4].#include<cv.h>#include"opencv2/highgui/highgui.hpp"#include<iostream>#include<stdio.h>#include<stdlib.h>usingnamespacecv;usingnamespaceMatsrc;Matsrc_gray;intthresh=intmax_thresh=255;RNGrng(12345);char{{,,,,, ,,,,,,,,, ,,,,,,#include<cv.h>#include"opencv2/highgui/highgui.hpp"#include<iostream>#include<stdio.h>#include<stdlib.h>usingnamespacecv;usingnamespaceMatsrc;Matsrc_gray;intthresh=intmax_thresh=255;RNGrng(12345);char{{,,,,, ,,,,,,,,, ,,,,,,,,,,,{VK_CAPITAL,VK_TAB,,,,,,,,,,,VK_RETURN,,,,,,,,, ,, ,{VK_CONTROL,VK_MENU,VK_LWINVK_SPACE,VK_SPACE,VK_SPACE,,, ,VK_SPACE,VK_SPACE,,,,VK_DELETEUINTNEW_FLAG_ROW4=0;UCHARRead_key_count=///voidthresh_callback(int,void*);voidGet_Form(int,void*);intmain(int///voidthresh_callback(int,void*);voidGet_Form(int,void*);intmain(intargc,char**argv{CvCapture*capture=cvCaptureFromCAM(0)return-intpressKey;IplImage*frame=NULL;IplImage*Undistor_Image=IplImage*CvMat*intrinsic=(CvMat*)cvLoad("Intrinsics.xml");intflag={frame=if{///载入原图像,3Undistor_Image=cvCloneImage(frame);src=img;g_pGrayImage= cvCvtColor(frame,g_pGrayImage,CV_BGR2GRAY);IPL_DEPTH_8U,1);=/////blur(/////blur(src_gray,src_gray,Size(2,2)///char*source_window=imshow(source_window,src);thresh_callback);"thresh_callback(0,0);}{std::cout<< flag=1;}pressKey=cvWaitKey(50);{}elseif(pressKey=={}}}elseif(pressKey=={}}return0;}void{Read_key_count=++Read_key_count;Read_key_count=Read_key_count%2;Matbin_mimage_output(bin_mimage);IplImage*key_draw=cvLoadImage("keyNull.bmp",-Matdraw_key_point(key_draw);廓是一个Pointvector释intPoint_count=unsignedcharRow_count=0;intKey_Press_Posion=NULL;intsubkeypress;intlinewhith=-//findContours/////contourspoint类型的vector//hiararchycontours[i]对应4个hierarchyhierarchy[i][0]~hierarchy[i][3CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(10,10)///+vector<vector<Point>>contours_poly(bin_mimage_contours.size()CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(10,10)///+vector<vector<Point>>contours_poly(bin_mimage_contours.size()for(inti=0;i<bin_mimage_contours.size();i++{approxPolyDP(Mat(bin_mimage_contours[i]),contours_poly[i],3,trueboundRect[i]=boundingRect(Mat(contours_poly[i])minEnclosingCircle(contours_poly[i],center[i],radius[i]}///+Matdrawing=Mat::zeros(bin_mimage_output.size(),CV_8UC3for(inti=0;i<bin_mimage_contours.size();i++{if(((boundRect[i].br().x -boundRect[i].tl().x)>10)||((boundRect[i].br().yboundRect[i].tl().y)>10)){stringintNum_Count=- rng.uniform(0,255)drawContours(drawing,contours_poly,i,color,1,8,0,Point()rectangle(drawing,boundRect[i].tl(),boundRect[i].br(),color,0,Point()rectangle(drawing,boundRect[i].tl(),boundRect[i].br(),color,2,8,0//画矩形,tl矩形左上角,br==Row_start_point.y= +boundRect[i].tl().y)/=line(drawing,Row_start_point,==Col_start_point.x=+boundRect[i].tl().x)/=line(drawing,Col_start_point,key_circle_center.x=Col_start_point.x;PointRow_Start_axis=key_circle_center;Row_End_axis=key_circle_center;Row_Start_axis.x=Row_Start_axis.x-10;Row_End_axis.x=Row_End_axis.x+10;Col_Start_axis=key_circle_center;Col_End_axis=key_circle_center;Col_Start_axis.y=Col_Start_axis.y-10;Col_End_axis.y=Col_End_axis.y+Word_point.x=Col_start_point.x;Word_point.y=if((Word_point.y<=377)&&(Word_point.y>{Row_count=Row_count|}elseif((Word_point.y<=332)&&(Word_point.y>{Row_count=Row_count|}elseif((Word_point.y<=286)&&(Word_point.y>{Row_count=Row_count}elseif((Word_point.y<=286)&&(Word_point.y>{Row_count=Row_count|}elseif((Word_point.y<=249)&&(Word_point.y>{Row_count=Row_count|}elseif((Word_point.y<=211)&&(Word_point.y>{Row_count=Row_count|}if{if(Row_count&{><(Word_point.y<=211)&&(Word_point.y>{if(Key_Press_Posion==0){rectangle(draw_key_point,Point(15+*38),265),Point(53+(Key_Press_Posion*38),299),CV_RGB(255,255,255),linewhith,8,0);}elseif((Key_Press_Posion>=1)&&(Key_Press_Posion<={rectangle(draw_key_point,Point(19+*38),265),Point(53+(Key_Press_Posion*38),299),CV_RGB(255,255,255),linewhith,8,0);}elseif((Key_Press_Posion>=10)&&(Key_Press_Posion{+*+*CV_RGB(255,255,255),linewhith,8,0}{CV_RGB(255,255,255),linewhith,8,0);}{}}if(Row_count&{if((Word_point.x>589)&&(Word_point.x<{rectangle(draw_key_point,Point(15}{}}if(Row_count&{if((Word_point.x>589)&&(Word_point.x<{rectangle(draw_key_point,Point(15,227),Point(66CV_RGB(255,255,255),linewhith,8,0format("%C",Keyboard_String_table[1][0]),Point(100,100),FONT_HERSHEY_SIMPLEX,1.5,CV_RGB(0,0,0),0);}elseif((Word_point.x>40)&&(Word_point.x<590)&&(Word_point.y<=249)&&(Word_point.y>211)){Key_Press_Posion=15-(Word_point.xif(Key_Press_Posion=={+*+*CV_RGB(255,255,255),linewhith,8,0}{+*+*CV_RGB(255,255,255),linewhith,8,0}putText(drawing,format("%C",Keyboard_String_table[3][14-CV_RGB(255,255,255),}{}}if(Row_count{}}if(Row_count&{if(((Word_point.x>576)&&(Word_point.x<620))||((Word_point.x>44)&&(Word_point.x<105))&&(Word_point.y<=286)&&(Word_point.y>249)){if(((Word_point.x>576)&&(Word_point.x<{rectangle(draw_key_point,Point(34,189),Point(85CV_RGB(255,255,255),linewhith,8,0format("%C",Keyboard_String_table[1][0]),Point(100,100),FONT_HERSHEY_SIMPLEX,1.5,CV_RGB(255,255,255),0);}elseif((Word_point.x>45)&&(Word_point.x<{CV_RGB(255,255,255),linewhith,8,0);1.5,CV_RGB(255,255,255),0);}{}}elseif((Word_point.x>45)&&(Word_point.x<577)&&(Word_point.y<=286)&&(Word_point.y>249)){Key_Press_Posion=14-(Word_point.xif(Key_Press_Posion>0&&Key_Press_Posion<12{rectangle(draw_key_point,Point(51+*38),189),Point(85+(Key_Press_Posion*38),223),CV_RGB(255,255,255),linewhith,8,0);}-CV_RGB(255,255,255),}{}}if(Row_count&-CV_RGB(255,255,255),}{}}if(Row_count&{if(((Word_point.x>552)&&(Word_point.x<600))||((Word_point.x>65)&&(Word_point.x<110))&&(Word_point.y<=332)&&(Word_point.y>286)){if(((Word_point.x>552)&&(Word_point.x<{CV_RGB(255,255,255),linewhith,8,0format("%C",Keyboard_String_table[1][0]),Point(100,100),FONT_HERSHEY_SIMPLEX,1.5,CV_RGB(255,255,255),0);}elseif((Word_point.x>65)&&(Word_point.x<{CV_RGB(255,255,255),linewhith,8,0);1.5,CV_RGB(255,255,255),0);}{}}elseif((Word_point.x>111)&&(Word_point.x<553)&&(Word_point.y<=332)&&(Word_point.y>286)){Key_Press_Posion=10-(Word_point.x-rectangle(draw_key_point,Point(70+Key_Press_Posion*38,151),Point(104+Key_Press_Posion*38,185),CV_RGB(255,255,255),linewhith,8,0);putText(drawing,format("%C",Keyboard_String_table[1][10-CV_RGB(255,255,255),}{}}if(Row_countCV_RGB(255,255,255),}{}}if(Row_count&{NEW_FLAG_ROW4=if(((Word_point.x>551)&&(Word_point.x<586))||((Word_point.x>77)&&(Word_point.x<116))&&(Word_point.y<=377)&&(Word_point.y>332)){if(((Word_point.x>551)&&(Word_point.x<586))&&(Word_point.y<=377)&&(Word_point.y>332)){CV_RGB(255,255,255),linewhith,8,0NEW_FLAG_ROW4=NEW_FLAG_ROW4|format("%C",Keyboard_String_table[0][0]),Point(100,100),FONT_HERSHEY_SIMPLEX,1.5,CV_RGB(255,255,255),0);}elseif((Word_point.x>77)&&(Word_point.x<116)&&(Word_point.y<=377)&&(Word_point.y>332)){Point(541,147),CV_RGB(255,255,255),linewhith,8,0NEW_FLAG_ROW4=NEW_FLAG_ROW4|1.5,CV_RGB(255,255,255),0);}{}}elseif((Word_point.x>117)&&(Word_point.x<552)&&(Word_point.y<=377)&&(Word_point.y>332)){Key_Press_Posion=10-(Word_point.x-rectangle(draw_key_point,Point(89+Key_Press_Posion38,113),Point(123+Key_Press_Posion*38,147),CV_RGB(255,255,255),linewhith,8,0NEW_FLAG_ROW4=NEW_FLAG_ROW4|(0x00001putText(drawing,format("%C",Keyboard_String_table[0][10-38,113),Point(123+Key_Press_Posion*38,147),CV_RGB(255,255,255),linewhith,8,0NEW_FLAG_ROW4=NEW_FLAG_ROW4|(0x00001putText(drawing,format("%C",Keyboard_String_table[0][10-CV_RGB(255,255,255),}{OLD_FLAG_ROW4=}=&}dis_string=format("x=%d,y=%d",}if(NEW_FLAG_ROW4&&(OLD_FLAG_ROW4!=0xFFFFF)&&(1{if{ = {if((OLD_FLAG_ROW4>>LOOP_COUNT)&{}}}OLD_FLAG_ROW4=}}{NEW_FLAG_ROW4=}}stringdis_point_count=format("Pointcount:%dRow:%d",Point_count,Row_count);putText(drawing,dis_point_count,}}{NEW_FLAG_ROW4=}}stringdis_point_count=format("Pointcount:%dRow:%d",Point_count,Row_count);putText(drawing,dis_point_count,Point(20,30),FONT_HERSHEY_SIMPLEX,CV_RGB(255,0,0),imshow("BinaryWindows_Contours",drawing);imshow("Keyboard", draw_key_point);}voidthresh_callback(int,void*{Matthreshold_output;///Thresholdthreshold(src_gray,threshold_output,thresh,255,THRESH_BINARY/////contourspoint类型的vector//hiararchycontours[i]对应4个hierarchyhierarchy[/////contourspoint类型的vector//hiararchycontours[i]对应4个hierarchyhierarchy[i][0]~hierarchy[i][3///+vector<vector<Point>>contours_poly(contours.size()集vector<Rect>boundRect(contours.size()vector<Point2f>center(contours.size()vector<float>radius(contours.size()for(inti=0;i<contours.size();i++{approxPolyDP(Mat(contours[i]),contours_poly[i],3,trueboundRect[i]=boundingRect(Mat(contours_poly[i])minEnclosingCircle(contours_poly[i],center[i],radius[i]}///++Matdrawing=Mat::zeros(threshold_output.size(),CV_8UC3);for(inti=

温馨提示

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

评论

0/150

提交评论