今天给大家带来的开源项目是:基于激光投影技术的虚拟键盘
直接看图,看了你就明白了!
没错,就是这么炫酷!
更加酷的是,这套方案,全部免费开源,免费!(源码+论文+电路)
/ 1 系统总成 /
本系统包含两个部分:硬件信号获取和软件数据处理
硬件部分:广角摄像头;980nm红外滤光片;红外一字激光;键盘投射激光以及覆铜板支架组成。
软件部分:由Visual Studio开发环境结合OpenCV视觉库编写和编译而成的上位机软件。
整个系统是由软硬件协调完成。系统框架如下图所示。
/ 2 原理介绍 /
原理介绍比较长,还是希望你们能看完,嘿嘿。
如下图所示,在最下面的红外一字激光发射出红外线覆盖空间中的一个面,当然这个平面要覆盖整个键盘的范围,在中间的键盘投影键盘发出的是键盘形状的轮廓图形主要用于位置的标定,在最上面的摄像头实时拍摄外界图形并且把数据传递给电脑,因为一字激光发出的光线是和水平面平行的,所以没有物体遮挡时摄像头是不能检测到红外线信号的,但是如果有物体在红外一字激光区域中时,遮挡物体表面就会覆盖,有红外线摄像头就会检测到红外线信号,电脑获取到摄像头发送过来的信号后,经过一定的算法之后,得到红外线亮点在图片中的坐标,然后把这个坐标映射到现实中键盘的位置从而实现其功能。
/ 3 硬件设计 /
3.1 摄像头
摄像头选择的是:普通CCD摄像头500W像素33帧频,如下图所示,普通的摄像头的镜头的视角是90°的,所以检测到的面积很小,这样就会导致摄像头固定的高度会很高才能检测全部的键盘范围,摄像头安装过高就会减少光线的进入量,从而减少了信号的输入,不方便信号的检测和转换。
3.2 红外激光
使用红外线作为信号检测的光源,之所以选择红外激光是因为激光的具有低功耗和集成度效果好,而且其发出光的频率几乎专一,可以让人眼觉察不到,为了考虑到人身安全状况,故选择30mW的980nm红外激光,由于键盘是一个平面,所以不能使用传统的单束激光作为光源,所以只能选择一字形激光,其线角度为120°,只有调节好投影键盘的位置,一字激光可以完全覆盖到所有的键盘范围。
3.3键盘投影激光
此模块用于键盘坐标的标定,在平面上投射出键盘的形,状给用户一个键盘位置的确认,选择650nm的可见光激光因为是650nm波长,所以不会对摄像头检测980nm信号有干扰。
/ 4 软件设计 /
使用Visual Studio通过OpenCV库对摄像头数据的读取和算法实现,使用cvCapture- FromCAM函数和cvSetCaptureProperty就可以直接连接到PC端的摄像头。摄像头拍摄的原图如下图
本系统设计感兴趣的是亮光点,和相关的颜色信号无关,所以必须把图片二值化,以方便后面算法的实现,当然,为了进一步提高后面定位的精确性,所以在图片二值化前,可以使用cvThreshold 对单通道图片数据应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像同时取得噪声,列如滤掉很小或者很大的图形点。二值化的图如下。
得到二值化图像后,接下来要做的就是查找所有兴趣点的轮廓,OpenCV里的find Contours是轮廓检测函数之一,这个函数可以使用多边形来近似表示一个轮廓其次,多边形逼近的目的是为了减少轮廓的顶点数目。但多边形逼近的结果依然是一个轮廓,只是这个轮廓相对要粗旷一些。如果要使得查找的轮廓平滑一点,可以使用approxPolyDP函数对该多边形曲线做适当近似,如果要画出查找到的轮廓的话,就可以配合使用drawContours函数,使用函数boundingRect,还可以得到轮廓的外包络矩形。定位包络矩形的中心点在图片中的坐标,然后就可以检测到手指的位置,最后投射到键盘对应的位置。查找轮廓后的图片如下图。
找到兴趣点的轮廓和定位到对应兴趣点在图片中的位置后,接下来的就是映射键盘了,虽然镜头是有线性失真的,但是通过一定的算法校正后,还是能保持线性的,所以只要把图片比例化之后,然后划分按键位置的坐标就可以直接映射到对应的按键位置了。键盘映射后面的图片如下图。
4.4程序流程图设计
开源链接:
https://pan.baidu.com/s/15qRsn2REzf01m-dyNBwyJg
提取码:
gvaj