【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏
【先上一张效果图】:
一、原理:
其实原理很简单:
1.手机投屏到电脑;
2.截取投屏画面的题目部分,进行识别,得到题目和三个答案;
3.将答案按照一定的算法,进行搜索,得出推荐答案;
4.添加了一些其他辅助功能,比如:浏览器搜索结果展示、关键字高亮、浏览器可点击等;
二、二营长,把我的意大利...............代码,呈上来,给友军看看
1.手机投屏:
方式很多,这里只列举几个比较常用、且自己感觉简单易用的:
A.IOS:局域网内,可以利用iTools里的苹果录屏大师(airplay),进行投屏;
B.安卓:利用连接线,可以用Totall Control,将安卓手机的画面投到电脑上;而且电脑上还能直接操作手机;
C.模拟器:一般都是安卓模拟器;可以自行下载并安装;
2.截取画面中的题目和答案
A.先设置要截图的区域。
我创建了一个窗体,专门用于设置截图区域,给它取名叫:frmCutter。
原理:在主窗体打开frmCutter时,就将frmCutter全拼显示。同时截取一张整个屏幕的图片,把它设置成frmCutter窗体的背景图片。
这样就能在frmCutter上自由地设置了。
主窗体打开frmCutter窗体时:
// 新建一个和屏幕大小相同的图片
Bitmap catchBmp = new Bitmap(Screen.AllScreens[].Bounds.Width, Screen.AllScreens[].Bounds.Height); // 创建一个画板,让我们可以在画板上画图
// 这个画板也就是和屏幕大小一样大的图片
// 我们可以通过Graphics这个类在这个空白图片上画图
Graphics g = Graphics.FromImage(catchBmp); // 把屏幕图片拷贝到我们创建的空白图片 catchBmp中
g.CopyFromScreen(new Point(, ), new Point(, ), new Size(Screen.AllScreens[].Bounds.Width, Screen.AllScreens[].Bounds.Height)); // 创建截图窗体
frmCutter _frmCutter = new frmCutter();
_frmCutter.Tag = this; // 指示窗体的背景图片为屏幕图片
_frmCutter.BackgroundImage = catchBmp; _frmCutter.Width = Screen.AllScreens[].Bounds.Width;
_frmCutter.Height = Screen.AllScreens[].Bounds.Height;
DialogResult dr = _frmCutter.ShowDialog();
然后再frmCutter窗体中,写入几个事件:
//点击鼠标右键时,取消设置
private void frmCutter_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
} //点击鼠标左键时,开始画区域图
private void frmCutter_MouseDown(object sender, MouseEventArgs e)
{
// 鼠标左键按下是开始画图,也就是截图
if (e.Button == MouseButtons.Left)
{
// 如果捕捉没有开始
if (!_catchStart && !_catchFinished)
{
_catchStart = true; // 保存此时鼠标按下坐标
Point newPoint = new Point(e.X, e.Y); _downPoint = newPoint; Tools.StartPoint = newPoint;
}
}
} //鼠标移动时,根据移动的鼠标和点击时的第一个点,绘制矩形
private void frmCutter_MouseMove(object sender, MouseEventArgs e)
{
#region 确保截图开始
if (_catchStart && !_catchFinished)
{
// 新建一个图片对象,让它与屏幕图片相同
Bitmap copyBmp = (Bitmap)Tools.ScreenShots.Clone(); // 获取鼠标按下的坐标
Point newPoint = new Point(_downPoint.X, _downPoint.Y); // 新建画板和画笔
Graphics g = Graphics.FromImage(copyBmp);
Pen p = new Pen(Color.Red, ); // 获取矩形的长宽
int width = Math.Abs(e.X - _downPoint.X);
int height = Math.Abs(e.Y - _downPoint.Y);
if (e.X < _downPoint.X)
{
newPoint.X = e.X;
}
if (e.Y < _downPoint.Y)
{
newPoint.Y = e.Y;
} _catchRectangle = new Rectangle(newPoint, new Size(width, height)); Tools.CatchRectangle = new Rectangle(newPoint, new Size(width, height));
Tools.CatchRectangleSize = new Size(width, height); // 将矩形画在画板上
g.DrawRectangle(p, _catchRectangle); // 释放目前的画板
g.Dispose();
p.Dispose();
// 从当前窗体创建新的画板
Graphics g1 = this.CreateGraphics(); // 将刚才所画的图片画到截图窗体上
// 为什么不直接在当前窗体画图呢?
// 如果自己解决将矩形画在窗体上,会造成图片抖动并且有无数个矩形
// 这样实现也属于二次缓冲技术
g1.DrawImage(copyBmp, new Point(, ));
g1.Dispose();
// 释放拷贝图片,防止内存被大量消耗
copyBmp.Dispose();
}
#endregion
} //鼠标点击后,弹起来时,完成矩形的绘制
private void frmCutter_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// 如果截图已经开始,鼠标左键弹起设置截图完成
if (_catchStart)
{
Tools.EndPoint = new Point(e.X, e.Y); _catchStart = false;
_catchFinished = true;
}
}
} //双击,确定当前选择的设置
private void frmCutter_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && _catchFinished)
{
if (this.Tag != null)
{
frmMain _frmMain = (frmMain)this.Tag;
if (_frmMain != null)
{
//_frmMain.btnRead.Focus();
_frmMain.ReadImageResult();
}
} this.DialogResult = DialogResult.OK;
this.Close();
}
}
B.设置好截图区域后,每次题目出现时,变对该区域截图:
//截取设置的区域屏幕图片
Bitmap _screenShots = new Bitmap(Screen.AllScreens[].Bounds.Width, Screen.AllScreens[].Bounds.Height);
// 创建一个画板,让我们可以在画板上画图
// 这个画板也就是和屏幕大小一样大的图片
// 我们可以通过Graphics这个类在这个空白图片上画图
Graphics g_screenShots = Graphics.FromImage(_screenShots);
// 把屏幕图片拷贝到我们创建的空白图片 CatchBmp中
g_screenShots.CopyFromScreen(new Point(, ), new Point(, ), new Size(Screen.AllScreens[].Bounds.Width,
Screen.AllScreens[].Bounds.Height)); //剪切的图片
_catchBmp = new Bitmap(Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height);
Graphics g = Graphics.FromImage(_catchBmp);
g.DrawImage(_screenShots, new Rectangle(, , Tools.CatchRectangleSize.Width, Tools.CatchRectangleSize.Height),
Tools.CatchRectangle, GraphicsUnit.Pixel);
g.Dispose();
g_screenShots.Dispose(); //显示图像
this.imgCut.BackgroundImage = (Image)_catchBmp;
C.将截到的问题和答案图片,用OCR识别
比如,我现在设置并截取到了这张图片:
识别图片中的文字,OCR软件和API也不少。以前我用的谷歌tesseract4.0,安装在本机的,没做词库,识别率一般。
后来发现百度OCR每天免费调用500次,果断转场!事实证明,正确率还是高很多。
D.得到识别结果,将识别结果处理后,进行百度搜索:
创建了一个试题实体,后面用起来就方便了:
/// <summary>
/// 试题类
/// </summary>
public class QuestionModel
{
/// <summary>
/// 问题
/// </summary>
public string Question { get; set; } /// <summary>
/// 答案1
/// </summary>
public string Answer1 { get; set; } /// <summary>
/// 答案2
/// </summary>
public string Answer2 { get; set; } /// <summary>
/// 答案3
/// </summary>
public string Answer3 { get; set; }
}
E.百度搜索,并显示参考答案:
a).算法搜索:
1.用题目去百度搜索。在搜索的结果中,查询答案出现的次数。
2.用题目+答案去搜索。得到每个组合的百度结果个数。
然后将上述两种方法,根据权重权衡,用户可以自行决定偏向于哪种结果。
b).辅助搜索:
右边还放了一个浏览器,可以在得到识别结果的第一时间,呈现出根据题目搜索百度的结果;并且在里面高亮显示3个答案关键字。
三、坐等吃鸡!
自动截图、自动识别、自动搜索、自动给出参考答案、自动展现出搜索页面并高亮显示关键字……
多了一系列的辅助功能,想不吃鸡都难啊~
(PS:热烈欢迎广大道友一起交流、指点,大家一起更上一层楼!)
2018.01.25.
下面给大家推荐两个小福利:
- 支付宝领红包,每天都能领取,最高99元。领取的红包在支付时可以抵扣现金!
- 一款覆盖淘宝、天猫全场商品95%的内部优惠券搜索神器。
扫描二维码下载APP后,输入激活码:code888,即可自用省钱 + 分享赚钱!最高帮您节省90%的购物资金!
【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏的更多相关文章
- 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏
[先上一张效果图]: 一.原理: 其实原理很简单: 1.手机投屏到电脑: 2.截取投屏画面的题目部分,进行识别,得到题目和三个答案: 3.将答案按照一定的算法,进行搜索,得出推荐答案: 4.添加了一些 ...
- 对OCR文字识别软件的扫描选项怎么设置
说到OCR文字识别软件,越来越多的人选择使用ABBYY FineReader识别和转换文档,然而并不是每个人都知道转换质量取决于源图像的质量和所选的扫描选项,今天就给大家普及一下这方面的知识. ABB ...
- 怎么提高OCR文字识别软件的识别正确率
在OCR文字识别软件当中,ABBYY FineReader是比较好用的程序之一,但再好的识别软件也不能保证100%的识别正确率,用户都喜欢软件的正确率高一些,以减轻识别后修正的负担,很多用户也都提过这 ...
- OCR文字识别软件许可文件被误删了怎么办
使用任何一款软件,都会有误操作的情况发生,比如清理文件时一不小心删除了许可文件,对于ABBYY FineReader 12这样一款OCR文字识别软件,因失误错误删除了许可文件该怎么办呢?今天就来给大家 ...
- 怎么使用OCR文字识别软件图像压缩功能
ABBYY FineReader是一款非常实用的OCR文字识别软件,在使用ABBYY FineReader保存文档时可以选择图像格式和压缩方法,通过图像压缩可以减小文件的大小,图像压缩方法视压缩率和数 ...
- 云+社区分享——腾讯云OCR文字识别
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云+社区运营团队发布在腾讯云+社区 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识 ...
- 如何精准实现OCR文字识别?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算基础发表于云+社区专栏 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识别-- ...
- 超强OCR文字识别软件首选ABBYY FineReader
提到纸质文档—转换—文本格式—可编辑这些字眼,相信大家的第一反映都是OCR文字识别软件,如何排除错误或利用辅助信息提高识别正确率,是OCR最重要的课题,衡量一个OCR系统性能好坏的主要指标无非是精确度 ...
- Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)
身份证识别:https://github.com/wenchaosong/OCR_identify 遇到一个需求,要用手机扫描纸质面单,获取面单上的手机号,最后决定用tesseract这个开源OCR库 ...
随机推荐
- 使用 Kafka 和 ELK 搭建测试日志系统(1)
本文仅供自己学习,不合适转载. 这是两篇文章的第一部分. 1. 安装 ELK 1.1 安装 ElasticSearch 在海航云上创建一个 Ubutu 16.4 虚机,2核4GB内存. (1)执行以下 ...
- lesson - 6 Linux下磁盘管理
1. 查看磁盘或者目录的容量df 查看磁盘各分区使用情况 不加参数以k为单位 df -i inode数,df -h 以G或者T或者M df -m 以M单位显示 du 查看目录或者文 ...
- Oracle学习笔记_09_字符串相关函数
二.参考资料 0.Oracle中的字符串类型及相关函数详解 1.ORACLE 字符串操作 2.oracle函数大全-字符串处理函数
- Disruptor并发框架(一)简介&上手demo
框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一 ...
- 图片放大功能如何做?jquery实现
花了很长时间撸了个网站,观点,其中需要一个图片放大功能,网上找了半天发现都没有中意的,最后无奈之下自己写了一个,演示地址,演示图片: 自我感觉效果还不错,现在分享开来给大家看看,哪里不好还请多多指教, ...
- JS对时间的操作
JS时间操作大全 1.获取每个月的开始和结束. 2.获取每个季度的开始和结束. 3.获取当前季度. 4.把日期转换为字符串(支持各种格式) ... 5.未完待续,不断添加 String.prototy ...
- 每天学一点Docker(6)——镜像和DockerFile
镜像的分层结构: 实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的.比如我们现在构建一个新的镜像,Dockerfile 如下: ① 新镜像不再 ...
- css中的 nav ul li ul 与 nav>ul>li 这两种写法的区别
<nav> <ul id="a"> <li>a1</li> <li>a2</li> <li>a3 ...
- 中文版microbit:TurnipBit显示动态滚动字符教程实例
随着当今社会的发展,社会的进步,家长们越来越忙碌,致使家长们在孩子成长过程中陪孩子的互动的时间越来越少,为此,TurnipSmart公司制作的一款MicroPython开发板--TurnipBit,这 ...
- 使用dropwizard(4)-加入测试-jacoco代码覆盖率
前言 dropwizard提供了一个简单的测试框架.这里简单集成并加入jacoco测试. Demo source https://github.com/Ryan-Miao/l4dropwizard 本 ...