【先上一张效果图】:

一、原理:

其实原理很简单:

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:热烈欢迎广大道友一起交流、指点,大家一起更上一层楼!)

出处:https://www.cnblogs.com/donkeysmall/p/8319792.html

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

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

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

  2. PHP:基于百度大脑api实现OCR文字识别

    有个项目要用到文字识别,网上找了很多资料,效果不是很好,偶然的机会,接触到百度大脑.百度大脑提供了很多解决方案,其中一个就是文字识别,百度提供了三种文字识别,分别是银行卡识别.身份证识别和通用文字识别 ...

  3. 百度Ocr文字识别

    简述 最近开发一个项目需要用到Ocr文字识别技术来识别手写文字,在评估过程中体验了百度的文字识别和腾讯的文字识别.查找官方开发文档,发现它们都有印刷体和手写体两种符合项目需求的识别模式,但是腾讯的手写 ...

  4. 百度OCR 文字识别 Android安全校验

    百度OCR接口使用总结: 之前总结一下关于百度OCR文字识别接口的使用步骤(Android版本 不带包名配置 安全性弱).这边博客主要介绍,百度OCR文字识别接口,官方推荐使用方式,授权文件(安全模式 ...

  5. 百度OCR文字识别-Android安全校验

    本文转载自好基友upuptop:https://blog.csdn.net/pyfysf/article/details/86438769 效果图: 如下为文章正文: 百度OCR接口使用总结:之前总结 ...

  6. 小白学Python——用 百度AI 实现 OCR 文字识别

    百度AI功能还是很强大的,百度AI开放平台真的是测试接口的天堂,免费接口很多,当然有量的限制,但个人使用是完全够用的,什么人脸识别.MQTT服务器.语音识别等等,应有尽有. 看看OCR识别免费的量 快 ...

  7. Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)

    身份证识别:https://github.com/wenchaosong/OCR_identify 遇到一个需求,要用手机扫描纸质面单,获取面单上的手机号,最后决定用tesseract这个开源OCR库 ...

  8. OCR文字识别笔记总结

    OCR的全称是Optical Character Recognition,光学字符识别技术.目前应用于各个领域方向,甚至这些应用就在我们的身边,比如身份证的识别,交通路牌的识别,车牌的自动识别等等.本 ...

  9. 云+社区分享——腾讯云OCR文字识别

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云+社区运营团队发布在腾讯云+社区 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识 ...

随机推荐

  1. 20145118 《Java程序设计》 第3周学习总结

    20145118 <Java程序设计> 第3周学习总结 教材学习内容总结 第四章开始接触到了Java的核心内容---对象这个概念,在这里为避免混淆,列举面向过程和面向对象的区别: 面向对象 ...

  2. InstallShield 2015 LimitedEdition VS2012 运行bat文件

    转载:http://www.cnblogs.com/fengwenit/p/4271150.html  运行bat文件 网上很多介绍如何运行bat的方法,但我这个是limted 版本,不适用. 1. ...

  3. 再也不学AJAX了!(三)跨域获取资源 ③ - WebSocket & postMessage

    让我们先简单回顾一下之前谈到的内容,AJAX是一种无页面刷新的获取服务器资源的混合技术.而基于浏览器的"同源策略",不同"域"之间不可以发送AJAX请求.但是在 ...

  4. Kali2018.1

    目录 制作U盘启动盘 安装 Kali Linux 之后的事 更新源 配置 Zsh 配置 Vim 修改 Firefox 语言为中文 安装 Gnome 扩展 美化 安装 Google 拼音输入法 安装常用 ...

  5. 论OI中最大值的选取

    为什么我的Floyd会输出负数啊? 为什么我的代码写对了却全都爆零了啊? 那么很可能是你的INF取大/小了! 那么inf到底应该取什么值呢? 首先,inf应该要比一般的题目中出现的数据要大,但是又不能 ...

  6. a href 属性

    两种用法: 页面跳转时使用 url (部分浏览器会阻止新窗口弹出页面),其他情况一律遵循          ‘结构样式行为分离’ 1. url href="#"     文档顶部  ...

  7. Java回顾之集合

    在这篇文章里,我们关注Java中的集合(Collection).集合是编程语言中基础的一部分,Java自JDK早期,就引入了Java Collection Framework.设计JCF的那个人,后来 ...

  8. Java Spring-JdbcTemplate

    2017-11-10 22:55:45 Spring 对持久层技术支持 : JDBC : org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 ...

  9. C#使用(NamedPipe)命名管道通信的例子

    https://blog.csdn.net/yl2isoft/article/details/20228279

  10. JDK环境变化配置

    JDK环境变化配置 第一"JAVA_HOME" JAVA_HOME的内容是jdk安装目录.如小编安装的位置:D: \Java\jdk1.7.0_60,并且后边不带分号 第二, CL ...