而且现在有了强大的 opencv 图像处理库,实现这样的虚拟激光投射键盘变得易如反掌。投影键盘的基本原理。键盘由三个主要部件组成:摄像头、键盘图案投射器、一字线性感应激光头。见下图:图上从上到下分别是键盘图案投射器、摄像头、一字线性感应激光头。当然,摄像头放在键盘图案投射器上面也是可以的,比如。1. 键盘图案投射器在平坦的桌面投出清楚键盘图案2. 最底下的一字线性激光(一般采纳红外线的,这样眼睛不可见)发出一字型激光,平行于桌面射出,这样假如手指有按键活动,会在手指上形成激光光斑3. 摄像头捕获激光光斑,对应于键盘图案映射的位置,就可以知道哪些键被按下OK,原理很简单,剩下的关键就是摄像头的图像处理算法了,而且现在有了 opencv,实现也不是难事。这里说一下实现方法。由于人眼对激光的反应不一样,780nm-808nm 的激光人眼不敏感,可看到微弱的一丝红光。850nm 至 1064nm 波长人眼不可见,通过红外感光仪器等专业设备可以看到,其中 808-850nm 通过摄像头可以看到。980-1064nm 通过倍频片可以看到。所以我在网上买了一个 808nm-810nm 红外一字线激光器。这样配上滤光片,可以滤去绝大多数其他波长的杂光,只剩下红外激光的光斑。这样做的好处是减少干扰,增加键盘的可靠性,而且使算法处理更加简单有效。加上前面的 650nm 虚拟键盘激光组件,总共也就花了 100 块钱左右。25mw 808nm-810nm 红外一字线激光器 激光头直径 18mm 可见光截止 400-750nm 滤光片,800-1000nm 高透在摄像头上看到的红外激光光斑投射到手指的图像如下图:对于光斑的跟踪我找了个现成的 opencv 扩展库 cvblob,具体可以参考它的文档和例子,google code 上有这个项目的托管。待会儿会奉上代码。cvblob 可以跟踪多个光斑,所以很容易就可以实现 ctrl+alt+delete之类的组合键。再来两键盘图:顺便说一句,本文中的摄像头放的位置只能捕捉到部分键盘图像,所以 demo 只是演示了部分键盘的按键。不过丝毫不影响原理介绍。假如要获得全部键盘图像,或者去买一个广角的摄像头,或者把这个摄像头位置提高,不是什么难事。时间有限,不想折腾了。代码:#include #include #include "opencv/cv.h"#include "opencv/highgui.h"#include "cvblob.h"using namespace cvb;typedef struct key{char c;int x0;int y0;int x1;int y1;};key g_keymap[] ={{'4',525,350,588,419},{'5',4...