数独X——Android openCV识别数独并自动解决,以填充APP开发过程

APP开发


浏览:1071 次

作者:AchillesL

如果文章被转载,请注明文章来源

第一个订单

这是一款起源于18世纪瑞士的数学游戏。这是一种用纸和笔进行的计算。玩家需要遵循9×9对于磁盘上的已知数字,推导所有剩余的空白数字,并确保每行、每列和粗行(3*3)中的数字包含1-9,不重复。

数独

最近,我经常做数独谜题,思考是否可以编写一个APP,自动解决数独问题,并最终将结果填入APP。

钓鱼的发展过程,这里省略了10N条钓线

最后,编写一个APP:数独X。对于作者常用的数独APP(本文的实现基于此APP),我们可以识别、求解并自动填写答案。平均专家水平在1秒内完成解决方案(包括图像编号提取和识别过程),所有操作在8秒内完成。

本文将简要介绍相关功能的实现。这篇文章有点长。如果您需要童鞋,可以使用浏览器的页面搜索功能。数独X的使用效果如下:

渲染,加载会有点慢

2下载链接

数独APP链接:

数独X APP链接:

数独X源代码链接:

[注意]数独X需要Android 7.0或更高版本的手机。

3内容

实施思路简介

项目结构介绍

如何创建浮动窗口

如何在第三方App中获取控制信息

如何在没有root的情况下实现跨App截图

如何提取数独九宫中的数字

如何实现数字识别

如何编写求解数独的代码

如何实现模拟屏幕点击

后记

参考文献

4实施思路介绍

第一步:我们需要在数独APP中获取九宫格。由于数独App是第三方App,因此无法直接获取数独信息。作者的想法是在打开数独界面后调用屏幕截图,然后通过图像处理提取九宫格的人物。同时,为了避免在屏幕捕获过程中阻塞App,数独X的工作窗口应该是浮动窗口的形式。

第二步:截屏后,我们需要进一步捕获数独面板图像以进行数字提取。我们可以写死面板坐标、宽度和高度来提取屏幕截图中的面板。当然,这里有一种更好的方法可以通过辅助功能AccessibilityService获得数独App的数独面板坐标信息。

步骤3:获得数独面板的图像后,使用openCV框架提取数字的轮廓,生成数字图像,然后调用TessTwo框架将图像转换为数字,生成原始二维数独数组。

第四步:数独解,生成答案,生成要填写的数字序列。

步骤5:最后,通过辅助功能AccessabilityService类的相关方法点击模拟屏幕,输入数字以填写数独。

流程图

5项目结构简介

本项目主要包括以下文件:

项目主要文件

类名称

作用

文件存储帮助程序

此类封装了将资产目录复制到SD卡的方法

位置文本信息

此类型记录数独网格的行和列编号以及相应的编号

主要活动

此类实现了App启动窗口,主要用于申请权限、屏幕截图和其他操作

屏幕快照助手

这个类是一个屏幕截图助手类,它封装了一些获取屏幕截图的方法

SP实用程序

此类封装了SharedPreferences的一些操作

数独辅助功能

此类继承了AccessibilityService,以实现第三方App的控制获取和屏幕模拟点击

数独分析

此类用于数独解决方案。输入原始二维数独数组并返回求解的二维数独阵列

数独XOrc

此类用于数独识别。输入数独图像Bitmap并返回原始二维数独数组

数独X服务

该类用于实现浮动窗口、App的工作窗口和数独X的主逻辑

数独XUtils

此类存储恒定信息,如广播操作和屏幕大小

TessTwo助手

此类封装了TessBaseApi的相关方法以实现字符识别

顺序图

6如何创建悬浮窗口

Android的界面渲染是通过WindowManger的serv实现的