作者 | 张巧龙

责编 | 伍杏玲

有没有觉得键盘太占地方,敲起来声音太大?今天给大家带来一个超酷炫、无实物的虚拟键盘:基于激光投影技术的虚拟键盘。

键盘运行视频:

没错,就是这么炫酷!

60s测试:你是否适合转型人工智能领域?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

系统总成 

本系统包含两个部分:硬件信号获取和软件数据处理。

硬件部分由广角摄像头、980nm红外滤光片、红外一字激光、键盘投射激光以及覆铜板支架组成。

软件部分由Visual Studio开发环境结合OpenCV视觉库编写和编译而成的上位机软件。

整个系统是由软硬件协调完成。

系统框架如下:

原理介绍

如上图所示,在最下面的红外一字激光发射出红外线覆盖空间中的一个面,当然这个平面要覆盖整个键盘的范围,在中间的键盘投影键盘发出的是键盘形状的轮廓图形主要用于位置的标定。

在最上面的摄像头实时拍摄外界图形并且把数据传递给电脑,因为一字激光发出的光线是和水平面平行的,所以没有物体遮挡时摄像头是不能检测到红外线信号的,但是如果有物体在红外一字激光区域中时,遮挡物体表面就会覆盖,有红外线摄像头就会检测到红外线信号,电脑获取到摄像头发送过来的信号后,经过一定的算法之后,得到红外线亮点在图片中的坐标,然后把这个坐标映射到现实中键盘的位置从而实现其功能。

硬件设计

摄像头

摄像头选择的是:普通CCD摄像头500W像素33帧频,如下图所示,普通的摄像头的镜头的视角是90°的,所以检测到的面积很小,这样就会导致摄像头固定的高度会很高才能检测全部的键盘范围,摄像头安装过高就会减少光线的进入量,从而减少了信号的输入,不方便信号的检测和转换。

红外激光

使用红外线作为信号检测的光源,之所以选择红外激光是因为激光的具有低功耗和集成度效果好,而且其发出光的频率几乎专一,可以让人眼觉察不到,为了考虑到人身安全状况,故选择30mW的980nm红外激光,由于键盘是一个平面,所以不能使用传统的单束激光作为光源,所以只能选择一字形激光,其线角度为120°,只有调节好投影键盘的位置,一字激光可以完全覆盖到所有的键盘范围。

键盘投影激光

此模块用于键盘坐标的标定,在平面上投射出键盘的形,状给用户一个键盘位置的确认,选择650nm的可见光激光因为是650nm波长,所以不会对摄像头检测980nm信号有干扰。

软件设计

使用Visual Studio通过OpenCV库对摄像头数据的读取和算法实现,使用cvCapture- FromCAM函数和cvSetCaptureProperty就可以直接连接到PC端的摄像头。摄像头拍摄的原图如下图:

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

得到二值化图像后,接下来要做的就是查找所有兴趣点的轮廓,OpenCV里的find Contours是轮廓检测函数之一,这个函数可以使用多边形来近似表示一个轮廓其次,多边形逼近的目的是为了减少轮廓的顶点数目。

但多边形逼近的结果依然是一个轮廓,只是这个轮廓相对要粗旷一些。如果要使得查找的轮廓平滑一点,可以使用approxPolyDP函数对该多边形曲线做适当近似,如果要画出查找到的轮廓的话,就可以配合使用drawContours函数,使用函数boundingRect,还可以得到轮廓的外包络矩形。

定位包络矩形的中心点在图片中的坐标,然后就可以检测到手指的位置,最后投射到键盘对应的位置。查找轮廓后的图片如下图:

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

键盘映射后面的图片如下图:

程序流程图设计

作者简介:张巧龙,一名硕士在读的95后男生,一个爱电子、爱生活的标准工科男。目前兼职于一家机器人公司研发工作。

公众号:大鱼机器人(ID:All_best_xiaolong)

源码地址:

https://blog.csdn.net/best_xiaolong/article/details/87624053

声明:本文为作者投稿,版权归其个人所有。

 热

2019人工智能学习路线规划:

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

 推 荐 

☞故宫“瘫痪”程序员怎么办?

☞印度封禁抖音,称导致该国年轻人“文化堕落”!

☞程序员如何避免“滴滴式裁员”悲剧?

☞可视化编程真的有那么糟糕?

☞微服务、Kubernetes和无服务器之后,即将发生的……

☞打打游戏就能在北京二环买套房?区块链大神说:你能靠VR刷怪升级还房贷!

☞帅气中国小哥出“大招”,程序员跳槽面试刷题必备

☞35岁程序员 节后第一天被辞退!

 

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

喜欢就点击“好看”吧

用了这种键盘后,我发现了新世界!相关推荐

  1. 解决 - 移动端(H5) ios 在点击input输入框,弹起软键盘后,顶部输入框失效的问题

    问题: 在项目开发过程中发现这个问题,在安卓下是正常的,ios固定定位就会失效,在网上看了许多ios兼容的博客,都没有效果,卡了很久, ios 的软键盘弹出后,会把页面撑高.他就不在原来的位置定位了 ...

  2. IOS上微信在输入框弹出键盘后,页面不恢复,下方有留白,有弹窗弹出时页面内容感应区域错位...

    问题说明: ios中,键盘的弹起,页面会往上挪动,使输入框展示在页面中间,键盘隐藏页面会下挪恢复原状. 在微信移动端,ios页面不恢复,下方有留白. 收起键盘的瞬间,如果有弹窗弹出,此时时页面内容应区 ...

  3. ios唤起键盘后,页面不收回导致元素错位的问题.(譬如固定在底部的自定义键盘等)...

    解决办法 var u = navigator.userAgent; var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 // ...

  4. Ubuntu18.04连蓝牙键盘后,搜狗输入法导致输入卡顿问题

    1.点击Ubuntu右上角us 2.弹出一列,选择:重新启动即可.(可稍等会儿) 注意:不用重新开机,即可生效!

  5. 关于android:打开键盘后WebView不会滚动

    我有一个包含输入表单的WebView. 当用户选择第一个输入时,将出现键盘,并将滚动WebView以便隐藏输入. 我的问题是在 我已经阅读了很多有关"活动"是否为"全屏& ...

  6. Ubuntu18.04连蓝牙键盘后,搜狗输入法导致输入卡顿问题(六十二)

    1.点击Ubuntu右上角us 2.弹出一列,选择:重新启动即可.(可稍等会儿) 注意:不用重新开机,即可生效!

  7. 计算机怎么接入外接键盘,笔记本在接入外接键盘后,如何让原来笔记本自 – 手机爱问...

    2009-05-28 要笔记本的外接键盘 提供两款: 1.英普瑞MCE无线娱乐键盘 [参考价格]:229元 [联系地址]:中关村e世界A4522 [联系方式]:010-82538127 英普瑞MCE无 ...

  8. 无意间看到程序员的电脑桌面,感觉自己发现了新世界的大门!

    电脑桌面那是作为一位IT人士展现个性的地方,工作的压力本来就大,需要找个地方发泄发泄,于是电脑桌面就成为了不错的地方,各个IT人士会在电脑桌面展现自己的特别.那么作为对电脑最了解的程序员,他们的电脑桌 ...

  9. 那天我无意中看到了程序员的电脑桌面,瞬间感觉发现了新世界!

    电脑桌面那是作为一位IT人士展现个性的地方,工作的压力本来就大,需要找个地方发泄发泄,于是电脑桌面就成为了不错的地方,各个IT人士会在电脑桌面展现自己的特别.那么作为对电脑最了解的程序员,他们的电脑桌 ...

最新文章

  1. MyEclipse 常用设置和操作方法
  2. python中eps参数_2019-01-23 python PIL 编辑 EPS 文件调整大小并拼接-失败告终
  3. python2和3语法区别_python2和3语法区别
  4. 未来无限可能 戴尔易安信开启中国新征程
  5. feign请求的封装
  6. 2017.8.9 老C的键盘 思考记录
  7. android gallery效果,Android RecyclerView封装的Gallery效果控件,android galleryview
  8. Scratch3.0的作品如何转换成H5或.exe
  9. 什么Yate开放模式?
  10. 集合:映射,单射,满射,双射
  11. Sketch 快捷键(UE图、思维图、UI设计、矢量设计图)
  12. 编程实践--决策树分类算法--隐形眼镜材质分类
  13. 【搬运】1 简谱和基本知识
  14. 游戏动画中有哪些动画原理?
  15. vscode中检查单词是否拼写错误的插件
  16. 线程安全的集合和map有哪些?
  17. python提取Excel某几列数据
  18. oracle插入报错-Caused by: java.sql.SQLException: 无效的列类型: 16
  19. Java(JNI)Android使用JNI开发
  20. 计算机考研学长学什么,关于考研的问题,学长们请指教:)

热门文章

  1. 2023第八届少儿模特明星盛典 小超模张娣菘 担任全球赛形象大使
  2. Android Shape 形状
  3. 使用ssh-keygen生成公私钥
  4. System.Drawing.Graphics.FromImage(Image image)引发内存不足
  5. VVC的VTM版本的下载,YUV格式视频播放器
  6. 读书笔记-第五项修炼
  7. c语言 学生注册,c语言学生管理系统之用户注册
  8. Could not initialize class
  9. tkinter播gif图片动画
  10. 索引的基本原理 索引设计的原则