【程序员的吃鸡大法】利用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.

原文地址:https://www.cnblogs.com/donkeysmall/p/8319792.html

时间: 2024-10-05 05:06:56

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

怎样利用OCR文字识别软件实现图片转文字操作?

图片对于大家来说都是一个很熟悉的东西,可往往是越熟悉的东西,我们越会忽略它更多地东西.今天小编就交给大家一种利用OCR文字识别软件实现图片转文字的操作. 第一步:今天小编分享给大家的是利用OCR文字识别软件实现图片转文字的操作,于是OCR文字识别软件就是我们需要借助的工具了.那么就需要点击OCR文字识别软件工具里的极速识别功能键了,进入到极速识别的页面. 第二步:进入到极速识别功能界面后,我们需要的就是点击添加文件,把我们要识别的图片文件给添加进去. 第三步:选择好图片文件后,需要考虑一下图片的

最新OCR文字识别软件提高OCR性能的方法

新一代ABBYY FineReader OCR文字识别软件在处理文件时,能够快速.准确的进行文件扫描和转换,并提供智能工具以增加工作效率,使企业和个人生产力在OCR性能上显着增强至新水平,包括新的黑白模式,提高了文件的处理速度.在精简的文件转换过程中,FineReader可以进一步提高其独特的能力,重建原生的多页文件格式,还支持最流行的格式轻松创建电子图书.此外,它扩展其业界领先的语言支持,使获奖的解决方案可用于新的全球市场. "ABBYY FineReader可以帮助人们在较短的时间内完成事半

什么ocr文字识别软件好用

图片文字都需要进行转换才能进行二次利用,因为这些文字都是不能编辑和复制的“死文字”.进行转换的话就需要借助软件帮忙,图片文字转换成word软件好用吗?这是用户比较关心的问题,如果你拿软件跟手动输入相比较那好的不是一点点,根本就不在一个级别没有可比性,通常人工需要几个小时才能解决的问题,软件只需要几分钟就能解决.因为市场上图片文字转换成word软件种类多种多样,要从中选择好用的软件.图片文字转换成word软件好用吗?小编在此推荐捷速ocr文字识别软件,因为小编试用过网友推荐的几款软件,捷速在各个方

OCR文字识别软件拆分对页和校正文本方向的教程

在使用ABBYY FineReader Pro for Mac OCR文字识别软件转换文档的时候,如果检测到的已识别文本片段方向错误,或片段的文本反转,表示片段中可能包含大量错误,那么应该怎样正确地识别此类文本呢?本文为大家详细讲解. 要正确识别此类文本: 1.在"图像"窗口中选择含有竖排区域或反转文本的表格单元格. 2.单击主工具栏中的"检查器",然后单击"区域检查器"按钮. 在"文本属性"面板中: ?在"反向&q

OCR文字识别软件:数字信息化不可或缺的重要组成部分

OCR文字识别技术,是在国家"863"计划国家自然科学基金长期支持下,清华大学电子工程系智能图文信息处理研究室汉字识别研究工作的基础上开发完成的.该软件能够快速地将印刷的文档转化为可供阅读和可编辑的高质量电子文档,进而将电子文档应用到各类数据库.电子出版物.数字图书馆.网络资源等新型资源的建设和再版图书生产中,是行业数字信息化不可或缺的重要组成部分. 主要功能模块 OCR文字识别软件识别核心 OCR文字识别软件内置高性能文字识别引擎,中文识别率达99.8%以上.英文.日文.韩文的识别率

浅析android OCR文字识别

这学期有门课程老师要求用JAVA实现一个OCR文字识别的程序,所以就花了一些时间研究了一下在安卓端如何实现 OCR的引擎是用的开源项目tesseract-ocr 这个安卓版的地址:https://code.google.com/p/tesseract-android-tools/ 但是自己在编译的时候老是出错,于是在网上寻找到了别人编译好安卓可用的tess-two导入到项目中(参考文章地址 http://www.cnblogs.com/hangxin1940/archive/2012/01/13

怎么提高OCR文字识别软件的识别正确率

在OCR文字识别软件当中,ABBYY FineReader是比较好用的程序之一,但再好的识别软件也不能保证100%的识别正确率,用户都喜欢软件的正确率高一些,以减轻识别后修正的负担,很多用户也都提过这样的问题,今天就为大家讲讲如何提高ABBYY FineReader的识别正确率(这里以ABBYY FineReader 12为例). 1.打开ABBYY FineReader 12主界面,找到"文档语言",在满足条件的情况下选择尽可能少的语言,这样就可以降低识别产生的错误. 2.选定合适的

OCR文字识别技术的用处

图片文字识别软件ABBYY FineReader是现在办公室的必备软件,它可以识别JPG.GIF.PNG.BMP.TIF和PDF源文件.PDF扫描件,也就是说我们在日常工作中能够遇到的不能编辑的文字都可以通过ABBYY FineReader图片文字识别软件来识别,识别得到的文字可以自由的进行编辑.有很多人有这样的疑问,图片文字识别软件的技术原理是什么呢? 1.图文输入:是指通过输入设备将文档输入到计算机中,也就是实现原稿的数字化.现在用得比较普遍的设备是扫描仪.文档图像的扫描质量是OCR软件正确

OCR文字识别软件中怎么把图像转换成HTML

之前给大家介绍了使用OCR文字识别软件ABBYY FineReader Mac版将PDF转换成HTML文档(详见PDF转换成HTML文档首选ABBYY Mac),其实ABBYY FineReader无论Mac版还是Windows版都可以实现这一点,除此之外还可以将图像文件转换成HTML文档,本文具体讲讲这一功能. ABBYY FineReader是一款OCR图文识别软件,当前最新版本为ABBYY FineReader 12,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜