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

     

  • 相关阅读:
    【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)
    Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)
    【PAT甲级】1042 Shuffling Machine (20 分)
    【PAT甲级】1041 Be Unique (20 分)(多重集)
    【PAT甲级】1040 Longest Symmetric String (25 分)(cin.getline(s,1007))
    【PAT甲级】1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)
    Codeforces Round #588 (Div. 2)E(DFS,思维,__gcd,树)
    2017-3-9 SQL server 数据库
    2017-3-8 学生信息展示习题
    2017-3-5 C#基础 函数--递归
  • 原文地址:https://www.cnblogs.com/LightSmile/p/8306869.html
Copyright © 2011-2022 走看看