激光投影虚拟键盘的设计与实现

  • 原理和实现流程
  • 硬件系统
  • 效果图
  • 部分代码

对大学期间做的一些设计的汇总之一

原理和实现流程

激光投影虚拟键盘是基于OpenCV结合一字红外激光、图像摄像头、红外滤光片组成。

使用摄像头获取到原始图像、对原始图像进行二值化、查找图像轮廓、获取中心坐标,进而检测出由于手指遮挡所引起的一字红外激光反射生成的光点,通过对光点中心位置的检测映射到键盘位置,从而实现了对应的按键行为。
使用OpenCV视觉库可以很快捷查找由图像摄像头获取到的手指头轮廓和定位手指头的位置以及校正由图像摄像头引起的图像曲面失真。

硬件系统

硬件:一个摄像头(视角尽可能大一点),一块arduino板,一个一字红外发射器,一个滤波片,一个键盘投影,一台电脑
注意:用于装在摄像头前的滤波片要能正好过滤可见光并不能过滤红外光,但尽管是这样,在白天自然光的时候效果依然做不到很好,所以就在晚上关灯调试。

我这里的摄像头因为视角太小就只能装的比较高。自上而下的三个硬件分别为摄像头、键盘投影器、一字红外发射器。

效果图


因为图像读取是有一定延迟的,多按键被识别为按下,输出结果可能会出错。
我这里的处理是二值图的中心点所在按键位置,所以比如同时按A和L,可能处处结果为G。

部分代码

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <cv.h>
#include <highgui.h>
#include <stack>
#include <opencv2/video.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include<ostream>
#include<fstream>
#include<Windows.h>using namespace cv;
using namespace std;void refresh(String a) {//保存到txtofstream fout;fout.open("data.txt",std::ios::out|std::ios::app);fout << a;fout.close();
}int main()
{VideoCapture capture(0);Mat frame;capture >> frame;if (!capture.isOpened()){printf("can not open ...\n");return -1;} //获取视频的第一帧,并框选目标 while (1){capture.read(frame);if (!frame.empty()){namedWindow("output", WINDOW_AUTOSIZE);imshow("output", frame);//setMouseCallback("output", draw_rectangle, 0);waitKey(250);}Mat img, imgGray, two;img = frame;cvtColor(img, imgGray, CV_BGR2GRAY);//先对彩色图像进行灰度化threshold(imgGray, two, 10, 255, CV_THRESH_BINARY);//对灰度图进行二值化//    vector<vector<Point>> contours;//   vector<Vec4i> hierarchy;//    findContours(two, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);//  cvNamedWindow("二值化");// 创建一个名为窗口 //   imshow("二值化", two);// 在窗口中显示Mat ele = getStructuringElement(MORPH_RECT, Size(2, 2));//图像侵蚀Mat des;erode(two, des, ele);vector<Point2f> point;int count = 0;int x = 0, y = 0;RNG& rng = theRNG();Mat image(600, 600, CV_8UC3);for (int j = 0; j < des.rows; j++) {//求二值图的白点的点集for (int i = 0; i < des.cols; i++) {if (des.at<uchar>(j, i) == 255) {point.push_back(Point2f(i, j));count++;x += i;y += j;}}}if (count != 0) {//Sleep(200);Point2f center;//寻找最小面积的包围圆float radius = 0;try {minEnclosingCircle(Mat(point), center, radius);}catch (Exception) {}//测位置代码:/*int ox=0,oy=0;ox=center.x;oy=center.y;cout<<"ox:"<<ox<<"  oy:"<<oy<<endl;Sleep(100);*/String o="";//根据键盘实际位置来调整if (center.y > 198 && center.y <= 234) {//数字显示if (center.x > 90 && center.x <= 132) {o = "1";}else if (center.x <= 174) {o = "2";}...//以下类似}else if (center.y > 234 && center.y <= 270) {//字母第一行...}else if (center.y > 270 && center.y < 306) {//字母第二行...}else if (center.y > 306 && center.y < 342) {//字母第三行...}else if (center.y > 342 && center.y < 378) {//空格行if (center.x > 265 && center.x <= 445) {o = " ";}}else {cout << "wrong" << endl;}cout << o ;refresh(o);Sleep(200);//消抖}cvNamedWindow("轮廓图");// 创建一个名为窗口  imshow("轮廓图", des);// 在窗口中显示}return 0;
}

激光投影虚拟键盘的设计与实现相关推荐

  1. ubuntu下qt模拟键盘按键按下_基于QT的跨平台虚拟键盘设计与实现

    摘  要: 针对QT在Windows.Linux.以及嵌入式Linux-arm等不同平台下没有开源.高效的虚拟键盘(包含中文输入法),以及QT版本升级造成代码不兼容等问题,设计并实现了一个跨平台的虚拟 ...

  2. 基于激光投影技术的虚拟键盘

    今天给大家带来的开源项目是:基于激光投影技术的虚拟键盘 原文链接:https://mp.weixin.qq.com/s/shFAY6kA9EGqWNZB_Wv8PA 直接看图,看了你就明白了!(键盘运 ...

  3. matlab 软键盘,(转载)DIY激光虚拟键盘低成本自制【全面讲解二】

    本帖最后由 gazelle 于 2013-8-15 10:58 编辑 转载请注明出处:CLK.blog实现过程 器件选择 有前面的原理分析可知,本激光键盘至少需要摄像头.投射键盘画面的激光器以及一字线 ...

  4. 激光投影键盘32G内存 惊艳01 Phone

    苹果 iPhone Phone的神秘新机有望再续iPhone风采,同样具备震撼业界的配置和外形.这款名为01 Phone的最大特色是采用全触屏设计,但却拥有一个激光投影键盘. 图为01 Phone 0 ...

  5. qt 文字倾斜投影_帅呆!钢铁侠中的激光投影键盘终于量产了,炫酷又好用

    看过电影<钢铁侠>的朋友,估计都会被钢铁侠的各种黑科技所折服,比如钢铁装甲.全息投影.人工智能贾维斯等等.不过这些黑科技想要实现还需要一段时间.但其中有一项黑科技已经被国产厂商实现了,那就 ...

  6. 2021-2027全球及中国激光投影键盘行业研究及十四五规划分析报告

    [报告篇幅]:121 [报告图表数]:163 [报告出版时间]:2021年1月 [报告出版机构]:恒州博智(QYR)消费品研究中心 报告摘要 2019年,全球激光投影键盘市场规模达到了xx亿元,预计2 ...

  7. 安卓虚拟键盘_像科幻片里那样隔空打字,虚拟键盘会成为未来趋势吗?

    最极客最具极客精神的新媒体近日,Facebook Reality Labs为虚拟现实体验开发了一种名为"PinchType"的输入法.主要依靠手部追踪,将不同字母输入固定分配给特定 ...

  8. 3.0时代:激光投影让娱乐更真实

    说到北京,气势雄浑的天坛.故宫.颐和园随即映入脑海,雍容大气的宏伟建筑让人肃然起敬.时过境迁,皇家古城已不复当日,但也平添了几分俏意.在北京,除了以上种种,很多人还会去南锣鼓巷.五道营.798.三里屯 ...

  9. 手机虚拟摄像头_没键盘也能打字?三星展示最新虚拟键盘Selfie Type:是真的

    1月8日消息,三星在近日举行的2020 CES国际消费电子展上展示了虚拟键盘Selfie Type,它是一款全新的概念产品,由三星内部的创意实验室C-Lab研发,能够通过手机的前置摄像头来智能识别用户 ...

最新文章

  1. ps -ef |grep 输出的具体含义
  2. luogu P4726 多项式指数函数(模板题FFT、多项式求逆、多项式对数函数)
  3. linux mysql cron_定时MySQL动作-Linux下用Cron现定时执行脚本
  4. WPF:使用Json.NET在TreeView中树形显示JSON数据
  5. c#窗口科学计算机,c#窗口科学计算器连等如何实现,大神帮忙一下好么?
  6. zookeeper中展示所有节点_分布式协调服务之Zookeeper
  7. 64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...
  8. 北京大学c语言试题及答案,北大网络教育(计算机专业)C程序设计作业答案
  9. Java写播放器好写吗_java写mp3播放器
  10. 细谈getRequestDispatcher()与sendRedirect()的区别
  11. 【转】重装Ubuntu时如何保留/home分区中的数据
  12. python设置执行服务环境变量_Python执行.sh脚本cataline环境变量配置
  13. C语言小游戏之贪吃蛇
  14. uniapp小程序解压压缩包 (使用jszip)
  15. 股市最好用的大数据软件_炒股软件app哪个最好用?老股民说你有这个就够了
  16. 如果没有传智播客和张老师,我现在不可能有机会在一家上市公司工作
  17. 记录日记软件哪个好用
  18. 【分享】光模块PPT
  19. 解决idea中每次创建项目都要重复配置maven,全网几步配置
  20. 百度惠生活升级:开始并入百度搜索排名

热门文章

  1. iOS开发之Xcode8:subsystem: com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, defaul
  2. 数据库 / 悲观锁和乐观锁
  3. 钢板弹簧的设计(说明书+9张CAD图纸)
  4. db2导入发生错误显示不是绝对路径_AE入门教程: ae模板的导入与使用方法
  5. matlab两组数据的相关度,怎么分析两组数据的相关性?比如A=【1 2 3 4 5 6 7 】 B=【2 3 4 5 6 7 8】 最好用MATLAB...
  6. scanf中的\n问题
  7. AI二次开发C#使用RGBColor
  8. 日常生活英语口语怎么学
  9. 用matlab求上三角矩阵的逆,现代科学运算—MATLAB语言与应用-中国大学mooc-题库零氪...
  10. 10分钟做出一张酷炫的数据地图,会这6步就够了!