【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏
原文:【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

【先上一张效果图】:

一、原理:

其实原理很简单:

1.手机投屏到电脑;

2.截取投屏画面的题目部分,进行识别,得到题目和三个答案;

3.将答案按照一定的算法,进行搜索,得出推荐答案;

4.添加了一些其他辅助功能,比如:浏览器搜索结果展示、关键字高亮、浏览器可点击等;

二、二营长,把我的意大利...............代码,呈上来,给友军看看

1.手机投屏:

方式很多,这里只列举几个比较常用、且自己感觉简单易用的:

A.IOS:局域网内,可以利用iTools里的苹果录屏大师(airplay),进行投屏;

B.安卓:利用连接线,可以用Totall Control,将安卓手机的画面投到电脑上;而且电脑上还能直接操作手机;

C.模拟器:一般都是安卓模拟器;可以自行下载并安装;

2.截取画面中的题目和答案

A.先设置要截图的区域。

我创建了一个窗体,专门用于设置截图区域,给它取名叫:frmCutter。

原理:在主窗体打开frmCutter时,就将frmCutter全拼显示。同时截取一张整个屏幕的图片,把它设置成frmCutter窗体的背景图片。

这样就能在frmCutter上自由地设置了。

主窗体打开frmCutter窗体时:

 1 // 新建一个和屏幕大小相同的图片
 2 Bitmap catchBmp = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
 3
 4 // 创建一个画板,让我们可以在画板上画图
 5 // 这个画板也就是和屏幕大小一样大的图片
 6 // 我们可以通过Graphics这个类在这个空白图片上画图
 7 Graphics g = Graphics.FromImage(catchBmp);
 8
 9 // 把屏幕图片拷贝到我们创建的空白图片 catchBmp中
10 g.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height));
11
12 // 创建截图窗体
13 frmCutter _frmCutter = new frmCutter();
14 _frmCutter.Tag = this;
15
16 // 指示窗体的背景图片为屏幕图片
17 _frmCutter.BackgroundImage = catchBmp;
18
19 _frmCutter.Width = Screen.AllScreens[0].Bounds.Width;
20 _frmCutter.Height = Screen.AllScreens[0].Bounds.Height;
21 DialogResult dr = _frmCutter.ShowDialog();

然后再frmCutter窗体中,写入几个事件:

  1 //点击鼠标右键时,取消设置
  2 private void frmCutter_MouseClick(object sender, MouseEventArgs e)
  3 {
  4     if (e.Button == MouseButtons.Right)
  5     {
  6         this.DialogResult = DialogResult.OK;
  7         this.Close();
  8     }
  9 }
 10
 11 //点击鼠标左键时,开始画区域图
 12 private void frmCutter_MouseDown(object sender, MouseEventArgs e)
 13 {
 14     // 鼠标左键按下是开始画图,也就是截图
 15     if (e.Button == MouseButtons.Left)
 16     {
 17         // 如果捕捉没有开始
 18         if (!_catchStart && !_catchFinished)
 19         {
 20             _catchStart = true;
 21
 22             // 保存此时鼠标按下坐标
 23             Point newPoint = new Point(e.X, e.Y);
 24
 25             _downPoint = newPoint;
 26
 27             Tools.StartPoint = newPoint;
 28         }
 29     }
 30 }
 31
 32 //鼠标移动时,根据移动的鼠标和点击时的第一个点,绘制矩形
 33 private void frmCutter_MouseMove(object sender, MouseEventArgs e)
 34 {
 35     #region 确保截图开始
 36     if (_catchStart && !_catchFinished)
 37     {
 38         // 新建一个图片对象,让它与屏幕图片相同
 39         Bitmap copyBmp = (Bitmap)Tools.ScreenShots.Clone();
 40
 41         // 获取鼠标按下的坐标
 42         Point newPoint = new Point(_downPoint.X, _downPoint.Y);
 43
 44         // 新建画板和画笔
 45         Graphics g = Graphics.FromImage(copyBmp);
 46         Pen p = new Pen(Color.Red, 1);
 47
 48         // 获取矩形的长宽
 49         int width = Math.Abs(e.X - _downPoint.X);
 50         int height = Math.Abs(e.Y - _downPoint.Y);
 51         if (e.X < _downPoint.X)
 52         {
 53             newPoint.X = e.X;
 54         }
 55         if (e.Y < _downPoint.Y)
 56         {
 57             newPoint.Y = e.Y;
 58         }
 59
 60         _catchRectangle = new Rectangle(newPoint, new Size(width, height));
 61
 62         Tools.CatchRectangle = new Rectangle(newPoint, new Size(width, height));
 63         Tools.CatchRectangleSize = new Size(width, height);
 64
 65
 66         // 将矩形画在画板上
 67         g.DrawRectangle(p, _catchRectangle);
 68
 69         // 释放目前的画板
 70         g.Dispose();
 71         p.Dispose();
 72         // 从当前窗体创建新的画板
 73         Graphics g1 = this.CreateGraphics();
 74
 75         // 将刚才所画的图片画到截图窗体上
 76         // 为什么不直接在当前窗体画图呢?
 77         // 如果自己解决将矩形画在窗体上,会造成图片抖动并且有无数个矩形
 78         // 这样实现也属于二次缓冲技术
 79         g1.DrawImage(copyBmp, new Point(0, 0));
 80         g1.Dispose();
 81         // 释放拷贝图片,防止内存被大量消耗
 82         copyBmp.Dispose();
 83     }
 84     #endregion
 85 }
 86
 87 //鼠标点击后,弹起来时,完成矩形的绘制
 88 private void frmCutter_MouseUp(object sender, MouseEventArgs e)
 89 {
 90     if (e.Button == MouseButtons.Left)
 91     {
 92         // 如果截图已经开始,鼠标左键弹起设置截图完成
 93         if (_catchStart)
 94         {
 95             Tools.EndPoint = new Point(e.X, e.Y);
 96
 97             _catchStart = false;
 98             _catchFinished = true;
 99         }
100     }
101 }
102
103 //双击,确定当前选择的设置
104 private void frmCutter_MouseDoubleClick(object sender, MouseEventArgs e)
105 {
106     if (e.Button == MouseButtons.Left && _catchFinished)
107     {
108         if (this.Tag != null)
109         {
110             frmMain _frmMain = (frmMain)this.Tag;
111             if (_frmMain != null)
112             {
113                 //_frmMain.btnRead.Focus();
114                 _frmMain.ReadImageResult();
115             }
116         }
117
118         this.DialogResult = DialogResult.OK;
119         this.Close();
120     }
121 }

B.设置好截图区域后,每次题目出现时,变对该区域截图:

 1 //截取设置的区域屏幕图片
 2 Bitmap _screenShots = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
 3 // 创建一个画板,让我们可以在画板上画图
 4 // 这个画板也就是和屏幕大小一样大的图片
 5 // 我们可以通过Graphics这个类在这个空白图片上画图
 6 Graphics g_screenShots = Graphics.FromImage(_screenShots);
 7 // 把屏幕图片拷贝到我们创建的空白图片 CatchBmp中
 8 g_screenShots.CopyFromScreen(new Point(0, 0), new Point(0, 0), new Size(Screen.AllScreens[0].Bounds.Width,   Screen.AllScreens[0].Bounds.Height));
 9
10 //剪切的图片
11 _catchBmp = new Bitmap(Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height);
12 Graphics g = Graphics.FromImage(_catchBmp);
13 g.DrawImage(_screenShots, new Rectangle(0, 0, Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height),   Tools.CatchRectangle, GraphicsUnit.Pixel);
14 g.Dispose();
15 g_screenShots.Dispose();
16
17 //显示图像
18 this.imgCut.BackgroundImage = (Image)_catchBmp;

C.将截到的问题和答案图片,用OCR识别

比如,我现在设置并截取到了这张图片:

识别图片中的文字,OCR软件和API也不少。以前我用的谷歌tesseract4.0,安装在本机的,没做词库,识别率一般。

后来发现百度OCR每天免费调用500次,果断转场!事实证明,正确率还是高很多。

D.得到识别结果,将识别结果处理后,进行百度搜索:

创建了一个试题实体,后面用起来就方便了:

 1 /// <summary>
 2 /// 试题类
 3 /// </summary>
 4 public class QuestionModel
 5 {
 6     /// <summary>
 7     /// 问题
 8     /// </summary>
 9     public string Question { get; set; }
10
11     /// <summary>
12     /// 答案1
13     /// </summary>
14     public string Answer1 { get; set; }
15
16     /// <summary>
17     /// 答案2
18     /// </summary>
19     public string Answer2 { get; set; }
20
21     /// <summary>
22     /// 答案3
23     /// </summary>
24     public string Answer3 { get; set; }
25 }

E.百度搜索,并显示参考答案:

a).算法搜索:

1.用题目去百度搜索。在搜索的结果中,查询答案出现的次数。

2.用题目+答案去搜索。得到每个组合的百度结果个数。

然后将上述两种方法,根据权重权衡,用户可以自行决定偏向于哪种结果。

b).辅助搜索:

右边还放了一个浏览器,可以在得到识别结果的第一时间,呈现出根据题目搜索百度的结果;并且在里面高亮显示3个答案关键字。

三、坐等吃鸡!

自动截图、自动识别、自动搜索、自动给出参考答案、自动展现出搜索页面并高亮显示关键字……

多了一系列的辅助功能,想不吃鸡都难啊~

(PS:热烈欢迎广大道友一起交流、指点,大家一起更上一层楼!)

2018.01.25.

posted on 2018-01-25 23:13 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/8353644.html

【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏...相关推荐

  1. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  2. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏...

    [先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...

  3. python 投屏_python实现《吃鸡大法》加文字识别 玩转百万英雄!

    <百万英雄>比较火.最近我也在玩,把高中的知识都还给教员了.10秒的答题时辰让人根柢来不及去百度搜索.于是我建造了这个剧本,对问题问题停止文字识别,主动翻开网页停止搜索.首先来看一下测试成 ...

  4. 吃鸡 python开发_python实现《吃鸡大法》加文字识别 玩转百万英雄!

    <百万英雄>比较火.最近我也在玩,把高中的知识都还给教员了.10秒的答题时辰让人根柢来不及去百度搜索.于是我建造了这个剧本,对问题问题停止文字识别,主动翻开网页停止搜索.首先来看一下测试成 ...

  5. 用计算机录入稿件,如何利用OCR文字识别软件快速录入信息到电脑上?

    原标题:如何利用OCR文字识别软件快速录入信息到电脑上? 如何利用OCR文字识别软件快速录入信息到电脑上?作为一名文员,一般需要从事文件处理工作,经常会遇到需要将手上的稿件资料录入到电脑上的工作.如果 ...

  6. 为什么别的程序员天天吃鸡,你却顿顿吃土?

    作者 | 倪家禹 责编 | 胡巍巍 上周七夕节的时候,我的暗恋对象邀我共进晚餐,这把我激动的!!!万年单身的我终于可以不再寂寞了.去了才知道,原来她被闺蜜们放了鸽子,奈何近期有喜事,需要找人一起喝酒, ...

  7. ABBYY FineReader2023最新版本OCR文字识别软件PDF

    很多小伙伴在下载OCR文字识别软件时,会习惯性去找绿色.那么到底什么是绿色的软呢?其实绿色的软见,都是通过非法的手段,破除的安全权限制作而成的.因此,使用这些绿色工具存在很多安全的问题. 为了自身设备 ...

  8. OCR文字识别在教育行业的贡献

    寒霜苦读十余载,留给我们的除了知识与成绩还有手上磨的手茧,小编现在中指就是最好见证,八零九零时期信息发展还未达到现在的智能科技化,回想上学时期,所有的笔记都需要手写,每次写到手都超级酸,小编当时就超级 ...

  9. 让程序员少吃些哑巴亏——认识论辩的逻辑谬误和辩驳原则

    让程序员少吃些哑巴亏--认识论辩的逻辑谬误和辩驳原则 在长期的工作中,发现技术人员和产品经理,业务部门的交流中常常会比较"吃亏".具体表现在很多情况下,自己本来有做很多工作,结果被 ...

  10. 程序员是吃青春饭的吗?未来发展前途如何?

    行文之前,先问大家几个问题: 1,你开始逐渐担忧自己的年纪? 2,你开始觉得加班熬不过小年轻? 3,你开始因未知新兴技术而慌张? 4,你开始跳不动槽? 如果以上的回答都"是",那么 ...

最新文章

  1. 数据团队做什么,看这篇就够了!
  2. 我看过的密码学方面的好文章
  3. [LeetCode] Remove Element
  4. 专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图
  5. MySQL多表数据记录查询详解
  6. 轻松scrum之旅 思维导图读书笔记
  7. 北京市强化电信用户信息安全保护
  8. 数据从mysql迁移至oracle时知识点记录(一)
  9. 大数据安全分析有哪些常见问题
  10. 计算机网络物理结构两大部分组成,计算机网络的组成部分 -华强电子网
  11. TIA博途中如何将CPU导出为GSD文件与其他PLC进行PROFINET通信?
  12. 音视频基础知识---视频编码格式
  13. 编码器 x264vfw
  14. 功率 db 和dbm 的区别
  15. XRecyclerView
  16. 童玲:蚂蚁金服区块链在真实业务场景的实践与突破
  17. 【电子学会】2019年09月图形化一级 -- 猫捉老鼠
  18. Mac上备份iphone照片
  19. Zcash中的description
  20. 不同年龄段的孩子如何选择编程课程?它又能为我们带来什么?

热门文章

  1. Flex Builder 破解和注册方法
  2. 使用 onpropertychange 和 oninput 检测 input、textarea输入改变
  3. springboot制作补丁包通用解决方案
  4. 这些年的项目管理心得
  5. 毕向东 Java学习 笔记一
  6. 常见问题数组索引越界异常
  7. 不用找,你想要的人物Flash动画素材都在这里
  8. [HP NX6320] 安装 windows2003 操作系统 全过程
  9. 基于Java毕业设计在线商城系统源码+系统+mysql+lw文档+部署软件
  10. 远比系统看图更好的图片浏览器Honeyview,Picasa