原标题:基于激光投影技术的虚拟键盘(软件篇)

今天给大家带来的免费开源项目是:基于激光投影技术的虚拟键盘

上篇文章,已经介绍了硬件篇~(附上硬件篇链接),接下来给大家简单介绍下程序部分。

直接看图,看了就明白了!(键盘运行视频在文末)

没错,就是这么炫酷!

更加酷的是,这套方案,全部免费开源,免费!(源码+论文+电路)

软件部分的开发使用微软公司推出的集成开发环境Visual Studio 2010,Visual Studio 2010集成了Visual C++,Visual C#,Visual Basic,Visual F#,Visual J++编译环境,Visual Studio是Windows平台上最受欢迎的编程环境。

OpenCV是开源的视觉库,提供了C语言库也有对应的JAVA语言库,以及在Linux平台下的语言库最新的库中也推出了Android平台库,在Visual Studio中,只有在工程的属性页中包含OpenCV的各个库,即把对应的.lib文件包含进来,以及一些宏的引用的声明,就可以直接调用库里所有的函数。

为了把装置做的小一点,所以采用了150°的广角镜头,可以大大缩小装置的尺寸,所拍摄出的图片是会有失真的,所以在实际操作中必须要把失真的图片校正,不然在后面的键盘的线性划分时会有线性误差,而导致整个键盘定位不正确,要通过一定程序算法来校正摄像头拍摄出的曲面失真图片,图形校正采用了张正友的平面棋盘格图形校正算法,为了得到摄像头的物理参数,使用Matlab的相机校正工具Camera Calibration Toolbox。

Matlab中的Camera Calibration Toolbox做成了一个GUI界面(图4.3-1),不需要太多的编程就只要操作对应的UI界面和适当的键入参数,就可以实现摄像头的校正,最终得到校正参数。

虽然用Camera Calibration Toolbox只要3张不同角度拍摄照片就可以标定好摄像头,但在本设计中使用了9张用待标定摄像头不同角度拍摄的照片,一张一张的进行处理,直到处理完所有的照片,然后进行误差分析让所有的误差尽可能的均匀分布,最后进行计算后,就会得到最后的校正参数,把最后到的参数代入到OpenCV的特定算法中,实时运算就可以实时校正失真的图片,从而使之线性化,方便在后面的坐标定位,以及目标的定位和按键的映射不出现非线性误差。

标定摄像头时,用于标定的照片要一张张的处理,但是每一张的处理都影响整个标定的好坏,使用每一张图片标定时,必须要保证其正确严格控制其标定误差,在标定过程中必须不断的尝试猜想值,使红色十字架尽可能的分布在棋盘格的各个角点上,如果不在角点上必须的不断的尝试,直至靠近所有的角点才能处理下一张校正图片。

完成了所有图片的标定之后,之后不断的微调部分误差较大的图的校正值,使之误差尽可能的集中,如果不控制整个误差的分布的话会影响整个参数的精度,必须通过微调部分误差较大的图的校正值,控制那些离散性较大的值,使误差尽可能的均匀分布,完成了这些之后就可以导出校正后的参数了

当然也可以导出校正图片在空间排列的3D重建示意图,通过这个3D示意图可以对比图片在校正拍摄前是否和自己设定的位置一样。

同样也可以导出对应的镜头畸变向量图,这个图反映了标定镜头各个方向畸变的向量趋势图。

最后导出标定后的参数导出的参数包括了内参数,畸变系数,焦距等关键参数。

把导出的标定参数放入xml文件,然后用cvLoad就可以读入OpenCV了,然后通过内部相关的函数调用参数值,就可以实现失真图片的校正了。

为了验证标定的参数是否正确把参数代入Matlab进行图片校正看看是否达到预期效果如果达到预期效果就说明参数正确否则就还得重新校正。

如图4.2-9所示,校正后的图片较校正前的图片明显的变化,并且校正后的图片的棋盘格基本上是真正意义上的正方形了,说明校正的参数是正确的。

使用Visual Studio,通过OpenCV库对摄像头数据的读取和算法实现,使用cvCapture- FromCAM函数和cvSetCaptureProperty就可以直接连接到PC端的摄像头,通过这两个基本函数就可以很方便的读取摄像头,引用OpenCV库函数直接跳过了相关的硬件驱动的开发和调试,极大的加快和方便了软件开发。

到图片后其实是彩色的图片,但在本系统设计张感兴趣的只是亮光点,和相关的颜色信号无关,所以必须把图片二值化,以方便后面算法的实现,当然为了进一步提高后面定位的精确性,所以在图片二值化前可以使用cvThreshold 对单通道图片数据应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作,得到二值图像同时取得噪声,列如滤掉很小或者很大的图形点。

得到二值化图像后,接下来要做的就是查找所有兴趣点的轮廓,OpenCV里的findContours是轮廓检测函数之一,这个函数可以使用多边形来近似表示一个轮廓其次,多边形逼近的目的是为了减少轮廓的顶点数目。但多边形逼近的结果依然是一个轮廓,只是这个轮廓相对要粗旷一些。如果要使得查找的轮廓平滑一点可以使用approxPolyDP函数对该多边形曲线做适当近似,如果要画出查找到的轮廓的话,就可以配合使用drawContours函数,使用函数boundingRect,还可以得到轮廓的外包络矩形。定位包络矩形的中心点在图片中的坐标,然后就可以检测到手指的位置,然后可以投射到键盘对应的位置。

找到兴趣点的轮廓,定位到对应兴趣点在图片中的位置后,接下来的就是映射键盘了,虽然镜头是有线性失真的,但是通过一定的算法校正后,还是能保持线性的,所以只要把图片比例化之后,然后划分按键位置的坐标,就可以直接映射到对应的按键位置了。

由于篇幅原因,软件设计就介绍到这里~后面还有整机调试篇,有待更新~可以关注我【张巧龙】,或者是我的公众号【大鱼机器人】

————————————————————

其实程序设计还有很多细节没有讲清,无妨。我有论文!上面有更详细的论述和制作过程。然后免费开源(论文+代码+电路)所有的资料!

附上原帖:(资料获取方式),关注微信公众号「大鱼机器人」 后台回复:虚拟键盘

下面是一个简单的运行视频~

https://www.zhihu.com/video/1021478543557001216

——————————————————————

最后发个车~自己做了个公众号【大鱼机器人】,我会在上面分享一些学习资料、生活分享,需要的可以关注,愿者上钩。嘻嘻。

这里不仅仅有免费资料,省去了你找资料的麻烦,还有许多免费开源项目~(基于体感仿生的手势机器人、自动跟随平衡机器人、虚拟镭射键盘、mini全向轮移动机器人等等)

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等!在公众号内回复「更多资源」,即可免费获取,期待你的关注~

最后再放几个~

查看原文 >>
相关文章