图片验证码识别(我和小福的故事之二)

 

潘多拉的JS(我和小福的故事之一)

图片验证码识别(我和小福的故事之二)

网站选号的规则(我和小福的故事之二补一)

北京联想(我和小福的故事之三)

数据中心(我和小福的故事之四)

完美的架构(我和小福的故事之五)

道歉信(我和小福的故事之六)

满满的回忆,留在了潍柴汽车(我和小福的故事之七)

驶向深蓝的海洋(我和小福的故事之八)

 

 
某网站的最后提交数据时,给出一张图片验证码,要求用户填写图片中算数题的结果,输入正确后才能顺利提交数据。



                


这一下就把人难住了。

在此之前,都是程序自动填写数据,自动提交数据,以最快的速度模拟人来完成网站选号过程。

但到这一步,如果还是人来填写图片中的结果,最理想状态,花费的时间可能也是好几秒。

这几秒的时间,可能就会被同行或别人选走,要想第一个完成选号,必须要用程序完成对图片的识别。

这是一个棘手的问题,我也从来没有写过类似的功能,从程序要实现的功能上来看,图片识别同一般的程序也差别很大,

所以我预计可能要花很长的时间才能解决,不过该图片比较简单,可以预见网站的开发者是一个什么程度。



难度高的技术活,我首先找到了老五,当我还在吃力的看VC书时,他已经在看编译原理的书了,

从前在合作外挂时教过我内存数据识别功能关键技术,我想他可能有些办法。

果然,按他的思路,要用人工智能算法来做这件事情,解决看来是没有问题的,

但是最终完成的时间遥遥无期,而我当时缺的就是时间。

当时感觉必须在很快的时间搞定这关,才能击败竞争对手。



于是我又找到了淘宝,已经有不少提供这个技术的卖家,我准备花点钱来完成这件事情,

但卖家发过来的DLL都超大,居然很多还不是VC搞的,这样势必会影响我的程序的速度,

而在我看来VC代码中调用其它高级语言的功能简直是一种倒退。


在没有最好的解决办法之后,我开始尝试自己编码来识别搞定这个图片。
这里有一个前提,就是这种自动产生的图片里的元素非常简单,简单到我都可以搞定它。
如果图片太复杂,或里面的内容比较多,估计我就不可能在一周内彻底设别了,所谓击破纸盾,其实只需要一把木刀就可以了。

网站制作者第一个白痴设置的地方:图片中的干扰线和数字符号不是一种颜色,而是纯黑色,而更简单的是居然是先画干扰线,
再画的数字和符号。数字符号和干扰线重叠的地方,只会保留数字符号。那么这种干扰线还有什么用呢,完全是一个摆设。 
程序把图片中的像素按点阵读取后,简单的拿掉全部黑色的点,干扰线就完全去除了。



网站制作者第二个白痴的地方是:图片中的元素少,仔细观察图片,会发现图片中的元素只有0123456789加减乘除等号,而变化只有大和小2种,那么,图片中出现的图形就是大数字10个,小数字10个,大符号5个,小符号5个,一共才30个! 不用半天时间,我就按30个元素,建立了点阵库。所谓点阵库,就是按一个数字的大小,白色点转成0,黑色点转成1的一堆数组。为了后面对比的快速,我使用了一维数组,从上到下19个点,从左到右14个点,依次放在一个一维数组里。

在算法操作中,首先把数据元素按白色的间隔区分开,比如?X1=8,被区分成 ? , X , 1 , = , 8 五块14*19大小的图片,然后一块一块的读出点阵数据去同30个模版数组比较。比如第一块?,它有14*19共266个点,同30个模版数组里每一个点比较,统计同30个模版比较后的相似度。 相似度最高的,往往就是我们要的正确结果。



最后的一关也解决了,使用自己的图形识别模块,几乎在几个MS之内,就可以完成对验证码图片的识别,
一次成功率大概在90%以上,就算识别错了,程序可以接着再重复处理一次搞定,已经大大超过了人类。

至此我的程序非常的高效,从填数据到最后的提交,全部由电脑处理。

所谓天下武功唯快不破,第一个提交数据,几乎击败了竞争对手。这在当时来看,非常好的事情,其实后来想想也不尽然。。。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值