本帖最后由 sanmoking 于 2009-11-26 22:46 编辑
楼上程序解决了以下几个问题:
1 图像识别任意字符串的方法(指图片数量-不是字符数量-比较少的情况下,比如那个荷官的名字,估计他整个网站全部算下来也就十几二十个吧,将来增加的话也是一点一点的增加的,那时候手动增加识别数据也不麻烦),如果没有数据可以自动添加,以便下次识别.
2 不同位数数字图像的识别(有的数字是一位数,有的数字是两位),这种情况如何识别的方法,以往验证码识别都是固定位数(4位哈)
3 怎样用一个算法去计算在窗体位置和桌面分辨率不同的情况下的截图位置
4 网格状的图片的截取....嵌套循环..
楼主公开源码跟论坛网友一起交流学习,我也把我的源码放出来让各位网友一起切磋哈..:
源码里面有很详细的注释..源码其实很短的,100来行左右........
压缩包里面包含如下文件:
lunpan.au3 -------源码
识别数据.exe -------编译后的exe
卸载.bat -------卸载验证码识别组件Captchio.dll
注册.bat -------注册验证码识别组件Captchio.dll
11111.cdb ------36个数字的识别库
Captchio.dll -------验证码识别组件
cls.ini---------------存储荷官识别数据的ini
下面说明一下我的思路,以便各位网友互相讨论:
拿到这个轮盘游戏之后,一开始想通过读取内存来进行数据统计,后来跟了一下Cheat Engine,本人菜鸟,没弄出来个头绪(关键是没找出来几个重要的基址)
于是放弃内存,转为图像识别...
但是遇到了数字位数的困扰,有些数字1位,有些2位,本想着Captchio.dll这样的通用组件算没戏了,不过灵机一动,开始研究那些数字的规律,
虽然那些色块的底色看上去没什么规律,但是后来发现,其实每个数字的底色都是固定的,只不过位置不同罢了..而且所有的数字颜色都是白的,哈哈
说明总的算下来其实只有38张图片(0-36,空白),用Captchio.dll轻松搞定.....
因为Captchio.dll必须指定每张验证码的字符位数必须一致,多亏我脑袋够用,哈哈,直接把所有37张图片都作为只有一个字符来对待,
0-9对应0-9,10-35对应a-z,36对应◇(菱形方块),其实这都无所谓,随便哪个汉字对应就行了,回头识别出来之后在还原成数字呗....
比如Captchio.dll识别出来Q,那就翻译成26,哈哈,大家仔细看我源码就好了,其实也幸亏就37个图片,再多我就该头大啦........
为什么说37张图片,不是38张么,因为还有个空白图片,用Captchio.dll来进行识别的时候,这张空白的图片颜色是ffffff,而其他有字符的图片上文字的颜色也是ffffff,那会使识别库出现混乱(所有那些带字符的图片都识别成空白了,汗...)而使验证失败...怎么解决这个问题呢?
用文件大小来解决!
因为jpg图片的原理,同样大小的图片颜色越单一的文件体积越小,所以,截取下来的图片(17*18像素)是空白的话那么体积一定小于750字节(基本上是630左右),而其他有字符的图片一定大于800字节(基本上超过1k了),仅靠这个就能完全识别出来空白图片,所以先把空白图片减出去之后,再用Captchio.dll来识别....,识别率99%是谦虚啦.....
另外大家可能会怀疑每次截图的准确性,应该会有个别像素上的误差吧,,哈哈,,精确到0素误差都没有...靠读取窗体坐标,控件坐标,屏幕分辨率这三个参数来计算的.截取到的每张数字图片一定是标准的17*18像素,一个像素都不错,对于jpg的损耗问题,<ScreenCapture.au3>可以设置jpg用100%的原始质量保存,每个像素点都不会有误差....
怎么识别窗口\识别控件\读取窗口坐标\控件坐标\以及怎么截图.....这就不说了.....
最后说下荷官的识别.......
这个游戏的荷官算来算去就那十几个,另外荷官的名字是人家GM根据自己爱好随机取的,可能是英文,也可能是中文,更可能是任意的奇怪字符.所以图片靠识别那算白费劲了,如果哪天人家gm起个[饕餮簩罫]的名字,靠图片识别的话就该吐血去死了......所以不可能为了这十几个人去做这么大的工作....
不过我的方法也还是得截图来进行识别........
[就算截图没有截全或者截得多了都没关系的]
上边的图片都是我的程序截取的,机器般的精确(不过你们拿到的exe在识别完图片都就删除了....我有源码嘛,不让删掉就删不掉喽....)
这里截取荷官名称的方法和上面截取数字图块的一样,所以截图的像素准确性是100%,每次截取的位置没有一点误差,再加上100%的jpg质量保存下来的文件,所以同一个荷官每次截取到的文件数据肯定丝毫不差.......
就因为这个丝毫不差,再加上jpg文件的保存算法,,所以只要显示的图案有一个像素不一样,那么截图保存的文件肯定不同(我猜的)....这个不同就体现在文件(大小,md5等hash值)上,我使用的就是文件体积(偷懒了,没有去验证hash值是否一样....回头再说把,不过光靠文件大小真的很不准确的,大家可别用这招....)......汗吧......
把每个荷官截取到的图片文件hash值保存到ini里面就是识别数据了.....如果遇到两个文件hash一点都不差,却图像显示的内容不同,那么就和中了3.6亿彩票的概率差不多(相对的,没经过考证,哈哈,别相信我啊)...哈哈
如果发现ini没有记录这个hash的话,就显示个InputBox,让使用者保存一下这个新出现的荷官好了,没几个荷官,不会影响使用者的操作的,这个可不是缺点,这是可扩充性,哈哈.........
其实楼主的题目,看似很简单,其实很麻烦,其实还是很简单,
编程就是用最合理的方法去解决问题...条条大路通罗马,哪个最近,哪个最通畅,哪个最合理......大家给我加分吧,自从论坛提高下载附件的收费之后,我都快穷死了....
我大概看了一下楼主那个方案的使用方法,虽然使用的技术很高级,但是有点高射炮打蚊子的感觉,所耗费的工作量难度都有点太高啦...另外程序使用的时候占用资源等方面估计也得高,特别是识别荷官的时候,,.....
刚才测试了一下,发现只要截图参数正确一致,前后截取到的相同画面保存下来的文件,结论是hash值完全相tong(包括文件大小,md5,crc32,SHA1等hash值都一摸一样),所以以后对于数量比较少但是识别难度太大的图像识别可以使用这些hash值来验证了........所以貌似最上面那38张图片也可以用这个办法来识别了哈???
注意:没有测试网页验证码程序生成的相同画面的图像hash值是否一致........
这是一个小代码用来证明我上面的结论 |