zoukankan      html  css  js  c++  java
  • 聊聊C#与冲顶大会

    一、由跳一跳开始

    2018年初,跳一跳小程序着实火了一把。一时间,各种攻略,甚至辅助工具也应运而生。作为.net阵营的一员,园友的这篇http://www.cnblogs.com/bqh10086/p/8253973.html跳一跳辅助程序文章,可以说是让人眼前一亮。实现思路大体如下:

    1.下载adb工具;

    2.打开手机usb调试模式;

    3.通过命令行调用adb工具,向手机发送命令

        3.1发送截图命令

        3.2将截图从手机复制到磁盘

        3.3将手机截图绘制到winform窗体的PixtureBox

        3.4鼠标左键单击小人底部,右键单击目标点

        3.5将小人底部的点,目标点之间的距离转换为屏幕按压时间

        3.6发送屏幕按压命令

    4.手动完成一次跳跃

    二、偶遇冲顶大会

    有意无意得总是遇见冲顶大会几个字,通过搜索后,发现是一款在线限时答题类app。每道题三个选项,10s内作答,共12道题目,去不答对以后与其他全答对的人均分奖金。奖金从50000-300000不等。

    https://livc.io/blog/204?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 这篇文章提供了一个答题辅助思路:

    1.截取手机屏幕图片

    2.识别截图中的题目

    3.调用浏览器,搜索题目

    不过,此思路是基于ios手机操作系统,采用 iOS + Mac+WDA+免费ocr识别来实现的。

    三、跳一跳与冲顶大会

    本着生命在于折腾的原则,想着在android手机操作系统+windows操作系统上也能实现一个答题辅助工具。借(剽)鉴(窃)上面的实现思路,说下,具体的实现过程。

    1.发送获取屏幕截图命令 ”adb shell screencap -p /sdcard/xxx.png”

    2.发送将手机截图复制到本地磁盘的命令  ”pull /sdcard/xxx.png

    3.获取题目所在区域

        3.1 自己的手机屏幕分辨率为1080*1920,手机截图长度为16.5cm,题目开始出现的位置距离图片顶部为3cm,题目宽度大概为2cm(题目为2行文字),这一步,跳一跳辅助工具已经实现了。

        3.2 调用算法,从手机截图中截取题目所在区域大小的图片 Bitmap map = GetPart(file, 0, 0, 1080, (int)(1920 * (5.5 - 3) / 16.5), 0, (int)(1920 * 3 / 16.5));

     1         /// <summary>
     2         /// 获取图片指定部分
     3         /// </summary>
     4         /// <param name="pPath">图片路径</param>
     5         /// <param name="pPartStartPointX">目标图片开始绘制处的坐标X值(通常为0)</param>
     6         /// <param name="pPartStartPointY">目标图片开始绘制处的坐标Y值(通常为0)</param>
     7         /// <param name="pPartWidth">目标图片的宽度</param>
     8         /// <param name="pPartHeight">目标图片的高度</param>
     9         /// <param name="pOrigStartPointX">原始图片开始截取处的坐标X值</param>
    10         /// <param name="pOrigStartPointY">原始图片开始截取处的坐标Y值</param>
    11         private  Bitmap GetPart(string pPath, int pPartStartPointX, int pPartStartPointY, int pPartWidth, int pPartHeight, int pOrigStartPointX, int pOrigStartPointY)
    12         {
    13             Image originalImg = Image.FromFile(pPath);
    14 
    15             Bitmap partImg = new Bitmap(pPartWidth, pPartHeight);
    16             Graphics graphics = Graphics.FromImage(partImg);
    17             Rectangle destRect = new Rectangle(new Point(pPartStartPointX, pPartStartPointY), 
    18                 new Size(pPartWidth, pPartHeight));//目标位置
    19             Rectangle origRect = new Rectangle(new Point(pOrigStartPointX, pOrigStartPointY), 
    20                 new Size(pPartWidth, pPartHeight));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)
    21 
    22             graphics.DrawImage(originalImg, destRect, origRect, GraphicsUnit.Pixel);
    23 
    24             return partImg;
    25         }
    GetPartPicture

        3.3 使用开源ocr识别库Tesseract,识别上一步截图map中的题目

     1      
     2        public static string GetOcrText(string startPath,string fileName)
     3         {
     4             var result = string.Empty;
     5 
     6             if (string.IsNullOrEmpty(fileName))
     7             {
     8                 return string.Empty;
     9             }
    10 
    11             try
    12             {
    13                 
    14                 using (var engine = new TesseractEngine(startPath + @"/tessdata", "chi_sim", EngineMode.Default))
    15                 {
    16                     using (var img = Pix.LoadFromFile(fileName))
    17                     {
    18                         using (var page = engine.Process(img))
    19                         {
    20                             result = page.GetText();
    21                         }
    22                     }
    23                 }
    24             }
    25             catch (Exception ex)
    26             {
    27             }
    28 
    29             
    30             return result;
    31         }
    GetOcrText

        3.4 去除题目中的换行,处理特殊字符。

        3.5调用浏览器,搜索题目

    1 private void Search(string searchContent)
    2         {
    3             
    4             //s就是你的默认浏览器,不过后面带了参数,把它截去,不过需要注意的是:不同的浏览器后面的参数不一样!  
    5             //"D:Program Files (x86)GoogleChromeApplicationchrome.exe" -- "%1"  
    6             Process.Start(browserPath, string.Format("http://www.baidu.com/s?wd={0}", searchContent));
    7         }
    Search

    四、问题

    1.问题1:题目所在区域的获取,题目有时为一行,有时为两行,图片大小不太固定

    2.问题2:从获取发送截图命令,将截图复制到本地磁盘,截取题目所在区域大小图片,识别图片中题目内容,调用浏览器搜索,呈现搜索结果共耗时6s左右,答题时间仅有10s,有点不太够用

    五、总结

    虽然,到头来结果不是太理想,但这个举一反三的探索过程却是有收获的。从一开始ocr识别不支持中文,到Tesseract库项目编译失败,再到搜索Tesseract支持的中文识别依赖文件chi_sim.traineddata,是解决问题能力的锻炼,也是涨姿势的过程。总的来说还不错。欢迎交流,欢迎点赞。

    项目地址:https://github.com/LightSmileMu/JumpToTop

     

  • 相关阅读:
    .html(),.text()和.val()的差异总结:
    获取或设置checkbox radio select的值
    sublime 搜索时忽略文件夹
    转载------一小时包教会 —— webpack 入门指南
    转载--git教程
    转载--网站数据统计分析中的日志收集原理及其实现
    devexpress 安装及破解
    基于socket的客户端和服务端聊天简单使用 附Demo
    Ajax技术原理小结
    oracle 资源学习汇总
  • 原文地址:https://www.cnblogs.com/LightSmile/p/8306869.html
Copyright © 2011-2022 走看看