分享

解密大漠插件文字识别原理(带源码)

 quasiceo 2015-07-30

发表于 2014-3-16

本帖最后由 冷月无痕 于 2014-4-26 16:02 编辑

首先,好吧,必须承认我标题党了...

文字识别原理在很多人面前已经不是什么秘密了,但是通过理解这些原理,我们可以更好的使用大漠插件文字识别功能

事情的起源是我异想天开的想用纯TC代替大漠插件进行文字识别,又懒得自己写一个字库制作工具,就想利用大漠综合工具制作的字库进行文字识别...

于是乎就开始探索大漠字库的奥秘...

402807FF801002$1$0.0.17$11

以上是一个1字的大漠字库信息,我们可以很明显的看到,信息字串用"$"符号,分为4个部分,下面我们就来一一分析这4个部分代表什么,有什么用

第一部分 402807FF801002 很明显是一个十六进制字符串

我们知道电脑显示图也好字也好,都是以像素颜色点来显示的.

那么一个字的组成,就是一个点阵的组合,如下图:

我们可以看到,这是一个二值化点阵,点阵只有两种色块(像素点)组成,黑色(字体色)和灰色(背景色)

大漠插件用1表示黑色(字体色),用0表示灰色(背景色),如下

00100

11100

00100

00100

00100

00100

00100

00100

00100

00100

11111

以从上到下,从左到右的顺序排列

那么上面的点阵,就是:0100000000101000000001111111111110000000000100000000001

最后,每4个点阵为一组,作为二进制,转换为十六进制,如下图:

我们可以看到最后一组多加了一个0,这个0是怎么加的呢?

以字体点阵的最大宽度(例:5)除以4,余数是多少就加多少个0(例:5/4余1)

402807FF801002,我们可以看到字库的点阵信息就还原出来了

那么,字库信息的第一部分就是字体点阵的信息

用TC把二值化点阵信息转换为大漠字库点阵信息的代码为:

本帖隐藏的内容

功能 点阵转为字库信息(点阵)

长度 = 字符串.长度(点阵),信息

遍历(计次=0;计次<长度%4;计次++)

点阵&="0"

遍历结束

位置 = 0

遍历(计次=0;计次<长度/4;计次++)

内容 = 字符串.截取(点阵,位置,位置+4)

信息 &= 字库信息分析.二进制转十六进制(内容)

位置 = 位置 + 4

遍历结束

返回 信息

功能结束

功能 二进制转十六进制(待转换)

转换

选择(待转换)

条件 "0000":

转换 = "0"

条件 "0001":

转换 = "1"

条件 "0010":

转换 = "2"

条件 "0011":

转换 = "3"

条件 "0100":

转换 = "4"

条件 "0101":

转换 = "5"

条件 "0110":

转换 = "6"

条件 "0111":

转换 = "7"

条件 "1000":

转换 = "8"

条件 "1001":

转换 = "9"

条件 "1010":

转换 = "A"

条件 "1011":

转换 = "B"

条件 "1100":

转换 = "C"

条件 "1101":

转换 = "D"

条件 "1110":

转换 = "E"

条件 "1111":

转换 = "F"

选择结束

返回 转换

功能结束

复制代码

第二部分 1  我们制作字库时定义的字

这个就不用再详细解释了吧,这是代表了字库点阵信息的字符,是我们在制作字库时,自己定义的(系统字库自动定义).如下图:

多余说一点,自己制作字库时,这个不是强制性的,比如上图的1,我们可以定义为"壹",而在写代码的时候,我们可以写找"壹"字,那么当游戏画面出现1时,就会返回1字的坐标

第三部分 0.0.17  字体点阵有效像素点数量

这个比较复杂,比较难形象的描述出来

首先,这个部分又以.分隔为3个小部分,第三个小部分比较简单,就是字体点阵黑色点(字体像素点),也就是1的数量(例:17,就是点阵中有17个1)

前面两个小部分,简单描述就是,从大漠综合工具,我们可以看到,大漠提取字体点阵最多只会显示11行,那么超过11行的点阵是不是就不提取了呢?

答案当然是否定的

第一部分 表示的就是,超过11行的点阵信息中最左边的字体点阵黑色点(字体像素点,也就是1)的所在列,超过11行以内的点阵信息中最左边的字体点阵黑色点(字体像素点,也就是1)的所在列的差值

简单的说就是当字体点阵超过11行以后,11行以后的点阵中最左边的1超过了11行以内最左边的1的列数(好吧,我自己都说绕了),看下图:

6FE510AA154EA857CAA1546A8010$岸$1.0.49$12

例如系统字库宋体9号中的"岸"字,如下图:

大漠工具提取的点阵(只显示了11行)

通过放大,我们可以看到第十二行的黑色像素(1),超过了上面的零到十一行的黑色像素(1),1列

那么第二小部分,就是当字体点阵超过11行以后,11行以后的点阵中最右边的1超过了11行以内最右边的1的列数

用以上的示例来说:

1字的 0.0.17 就是字体点阵超过11行以后,没有比11行以内的像素更宽的了,整个点阵有17个有效像素点(黑色,1)

岸字的 1.0.49 就是字体点阵超过11行以后,最左边超过了1列,最右边没有超过11行以内的像素点,整个点阵有49个有效像素点(黑色,1)

这说明,当我们提取点阵的时候,如果是1.0.49 岸字这样的情况,就要比提取11行以内的点阵x坐标减1(向左多取一列),这样的范围才是精准匹配的

好吧,代码比较长,我就不放出来了...

第四部分 11  字体点阵有效行数

也就是大漠字体点阵信息一共提取了几行(这说明,大漠也不是全部提取的,比如上面的宋体9的岸,一共是13行51个像素点(1),大漠只提取了12行49个像素点(1))

最后,是测试速度,在10*15的范围内,3000字的系统字库,找示例1的速度为952毫秒(也就是近1秒,汗一个...好吧,这是没有优化的结果,其实还可以优化的)

返回的是左边第一个1字的左上角坐标

1字的字库信息保存在,3000字系统字库中最后一行

下面是部分测试代码:

本帖隐藏的内容

功能 开始测试()

x,y

字库信息分析.设置字库(0,辅助.获取资源路径("rc:")&"字库.txt")

计时 = 系统.获取毫秒()

字库信息分析.找字(86,47,96,62,"1",#000000,1.0,0,x,y)//范围10*15

计时 = 系统.获取毫秒() - 计时

辅助.消息框(x&","&y&" 耗时:"&计时&" 毫秒")

功能结束

功能 设置字库(序号,路径)

总数

数组空间.大小(字库路径,总数)

如果(序号 < 总数)

字库路径[序号] = 路径

否则

数组空间.增加(字库路径,路径,1)

如果结束

当前字库 = 字库路径[0]

功能结束

功能 切换字库(序号)

当前字库 = 字库路径[序号]

功能结束

功能 找字(范围1,范围2,范围3,范围4,待找字,颜色值,相似度,查找方向,&x,&y)

记录,标记,列数,待找字,左偏移,右偏移,行数

调试输出(范围3-范围1)

调试输出(范围4-范围2)

遍历(横=0;横<范围3-范围1;横++)

遍历(竖=0;竖<范围4-范围2;竖++)

标记 = 0,记录=""

遍历(i=0;i<11;i++)

当前色 = 图像.坐标点取色(范围1+横,范围2+i)

如果(当前色 == 颜色值)

记录&="1"

否则

记录&="0"

如果结束

如果(记录 == "00000000000")

标记 = 1

跳出

如果结束

遍历结束

调试输出(记录)

如果(标记 == 1)

继续

如果结束

点阵 = 字库信息分析.点阵提取(范围1+横,范围2+竖,颜色值,相似度,查找方向,左偏移,右偏移,行数)

如果(点阵 == "")

继续

如果结束

信息 = 字库信息分析.点阵转为字库信息(点阵)

调试输出(信息)

数量 = 字库信息分析.取像素点数量(点阵)

调试输出(数量)

匹配 = 字库信息分析.配置字库(信息&"[        DISCUZ_CODE_1        ]quot;&待找字&"[        DISCUZ_CODE_1        ]quot;&左偏移&"."&右偏移&"."&数量&"[        DISCUZ_CODE_1        ]quot;&行数)

如果(匹配)

x = 范围1+横

y = 范围2+竖

返回 0

如果结束

遍历结束

遍历结束

x = -1

y = -1

返回 -1

功能结束

功能 取像素点数量(点阵)

返回串,数量

字符串.分割(点阵,"1",返回串)

数组空间.大小(返回串,数量)

返回 数量-1

功能结束

功能 点阵提取(x,y,颜色值,相似度,查找方向,&左偏移,&右偏移,&行数)复制代码

其实,这就是个玩...大家伙不必跟冷月较真的...

冷月只是想在那些有事没事就在你电脑里搜索大漠插件的游戏里,也可以识字而已...

好吧,以上就当小说看了吧,下面才是本贴正题......哈哈哈

大漠识字基础常识1: 以颜色像素为点阵进行记录(说明无论是字还是图我们都可以利用大漠工具做成字库进行识别)

大漠识字基础常识2: 字库信息中并无颜色的记录(说明字库里的信息是没有保存字体颜色信息的,我们在写识字或找字命令时,用什么颜色值参数,就以什么颜色值进行匹配)

大漠识字基础常识3: 做字库时,大漠工具显示的点阵是否完整并不影响找字识字效果

大漠识字基础常识4: 做字库时,字体点阵是否完整的字并不影响找字识字效果,如下图:

这样并不影响找字识字,只要颜色值不会变,就会提取相同的点阵并匹配到对应的字

大漠识字基础常识5:....

还有很多,大家知道了原理都可以自己领悟...冷月就不一一列举了

通过这次学习,我们可以学到一个很重要的秘诀...不知道你们学到没,反正冷月是学到了...

了解原理,能使我们更灵活的运用

比如:T语言的基础语法,T语言的线程,T语言的对象,图色键鼠模拟脚本的基本原理......

这样我们再也不会为语法错误,怎么多开,怎么多开时使用插件,怎么模拟一个游戏里的操作功能等等等问题而烦恼了

最后祝大家使用TC工具愉快,开发脚本顺利,马年赚钱马不停蹄......(以下省略78个字)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多