Python

基于“投屏识别”方案的超快超轻量答题机器人

2018-01-08  本文已影响0人  soda32
预览demo

本文好些个数据都基于不严谨的瞎测,但方案绝对是好用的。如果有错误烦请指正,不要喷 :)

引言

近来,类似于HQ Trivia模式的在线答题软件吸引了很多人的注意。主流的平台包括百万英雄冲顶大会芝士超人

有很多童鞋提出了很多答题的辅助手段。其中如何获取题目和答案内容是第一步,也是最关键的,作者能想到的无非是OCR图片识别语音识别REST接口直接获取。

其中Restful接口获取难度较大,需要进行比较多的前期工作,OCR进而成为一种比较可行的通杀方案。

本文将讨论Windows加Android情况下,如何加速题目的获取和解答。

为什么OCR法很慢

截屏OCR法是先对手机屏幕进行截图,然后传输到电脑,进行文字识别的一种方法。但是速度却很不理想,原因其实不难找到:

比起本地识别所消耗的时间,实际上截图拉回图片所消耗的时间和资源更多。

思考

提出方案

利用手机屏幕投影软件,将屏幕投影到Windows上。取得投屏软件句柄后,利用Win的原生API进行局部截图操作,提交云端OCR进行识别,获取题目后进行答案预测的工作。

经过肉眼测试,不同网络进行投屏连接,sigma-rt.com1的TC DS已经快爆,看不到延迟如果使电脑和手机在同一局域网下,或者使用数据线连接电脑和手机,速度可能更快。

当然,直接对模拟器进行截图也是可以的,这样可能更快一步。使得整个过程加速的秘诀就在于砍掉了安卓机自截图和传图的流程,使用快到爆的Windows原生API2进行局部截图

实践前的准备

Pywin32请下载和你的Python对应的版本,比如你的Windows是64位,但是你的Python3.6是32位的,那么请下载Pywin32-Python3.6.exe。如果你的Python3.7是64位的,请下载Pywin32-AMD64-Python3.7.exe。

快速截图例子

先来一个简单例子,Python如何根据软件的标题,调用Win的原生API进行局部截图。这是加速整个OCR识别的核心所在。

参考pyfunc的回答:Python实现屏幕截图的最快方式

import win32gui, win32ui, win32con, win32api

title="安卓投屏大师 TC DS - 镜像"
dlg=win32gui.FindWindow(None, title)

def window_capture(hwnd, filename, w=355, h=655):
    hwndDC = win32gui.GetWindowDC(hwnd)
    mfcDC = win32ui.CreateDCFromHandle(hwndDC)
    saveDC = mfcDC.CreateCompatibleDC()
    saveBitMap = win32ui.CreateBitmap()
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
    saveDC.SelectObject(saveBitMap)
    saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
    saveBitMap.SaveBitmapFile(saveDC, filename)

window_capture(dlg,"2.jpg")

未完待续…

上一篇 下一篇

猜你喜欢

热点阅读