ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 蓝天630902

[分享] 验证码识别讲座

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:图像处理和GDI
本帖最后由 cumulonimbus 于 2012-8-8 09:50 编辑
蓝天630902 发表于 2012-8-8 09:19
我说了,上面的代码是练手的,不能通用。
通用的,也只是稍微通用(注意我的用词),也解决不了所有问题 ...


请问有无相关的学习链接,或者可否上传你的提取方法心得,让大家学习学习,帮助大家提高。
建议兄弟写一下自己提取验证码的方法、心得、体会,上传分享之。
如:excelhome热贴 正则表达式

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 09:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 蓝天630902 于 2012-8-8 16:53 编辑
cumulonimbus 发表于 2012-8-8 09:41
没整明白,你从得出结论bisize是4个字节?
这是汉字处理的:
a(1) = Val(bytClipData(0)) + Val(bytCli ...


a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(bytClipData(2)) * 65536 + Val(bytClipData(3)) * 4294967296# 这个才是正确的

a1 = bytClipData(0),这个也是算是正确的,因为文件小没有用到更高位
a1 = bytClipData(0) + bytClipData(1) * 256 + bytClipData(2) * 4096 + bytClipData(3) * 65536,这个肯定错了,当时没考虑清楚,但结果确对了,也是因为有没有用到高位

不好意思,年纪大了,丢三落四,请原谅!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 09:58 | 显示全部楼层
cumulonimbus 发表于 2012-8-8 09:47
请问有无相关的学习链接,或者可否上传你的提取方法心得,让大家学习学习,帮助大家提高。
建议兄弟写 ...

识别应该是一件很简单的事情,理解DIB(是标准的 Windows 位图格式),加一些算法滤去不要的,留下需要的,然后比对,然后输出结果。但是十分的繁琐、十分消耗精力。

TA的精华主题

TA的得分主题

发表于 2012-8-8 10:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
待有时间,学习一下这个帖子。等过些时候离开这个论坛,没那么遗憾。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 10:20 | 显示全部楼层
kangatang 发表于 2012-8-8 10:07
待有时间,学习一下这个帖子。等过些时候离开这个论坛,没那么遗憾。

这个帖子,没有多少东西可学,只要理解透彻BMP 文件结构,就差不多到家了,慢慢地就可以登峰造极。
不过我刚刚入门,一直很惶恐,即使想说清楚“方法、心得、体会”都没办法做到,

TA的精华主题

TA的得分主题

发表于 2012-8-8 14:31 | 显示全部楼层
在你上传的第一个验证码识别中有如下代码:
a1 = bytClipData(0) + bytClipData(1) * 256 + bytClipData(2) * 4096 + bytClipData(3) * 65536
而在汉字识别中是:
a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(bytClipData(2)) * 65536 + Val(bytClipData(3)) * 4294967296#
两个公式不同,应该第一公式是错误的,而第二个公式是正确的吧
之所以错误的变成了正确,是因为没有用到高位?如何知道图片的高位是多少呢?这个算法是什么?
你上次说的ts(图像点的BGR值的均值)这个值的算法又是什么?要如何得知?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 15:48 | 显示全部楼层
本帖最后由 蓝天630902 于 2012-8-8 16:30 编辑
cumulonimbus 发表于 2012-8-8 14:31
在你上传的第一个验证码识别中有如下代码:
a1 = bytClipData(0) + bytClipData(1) * 256 + bytClipData ...


就拿73楼你发过来的图片“着主”来说吧,虽然文件名是jpg,却是一个BMP文件,这个文件包含3个部分:
1、位图文件头结构BITMAPFILEHEADER
2、位图信息头结构 BITMAPINFOHEADER
4、位图像素数据

但缺少第三部分:3、调色板 PALETTE

现在就对这个文件做一个说明,因为缺少调色板,所以下面的附件就不好通用:

BMP格式说明.rar

145.56 KB, 下载次数: 122

TA的精华主题

TA的得分主题

发表于 2012-8-8 18:03 | 显示全部楼层
蓝天630902 发表于 2012-8-8 15:48
就拿73楼你发过来的图片“着主”来说吧,虽然文件名是jpg,却是一个BMP文件,这个文件包含3个部分 ...

谢谢,我学习学习。
兄弟可否弄出一个计算ts(图像点的BGR值的均值)的程序来?谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 20:04 | 显示全部楼层
本帖最后由 蓝天630902 于 2012-8-8 20:07 编辑

其实这个应该是非常简单的事,就是数组里面的数相加:
1、如果是有调色板,就从第bfOffBits字节(其实是第bfOffBits+1个数)开始,一个字节表示一个点,但是这个点的颜色要到调色板里面去找。比如说
http://www.gzaic.gov.cn/GZCX/WebUI/Content/Handler/ValidateCode.ashx,另存为bmp文件,就是一个有调色板的图片。它的bfOffBits=00 00 04 36=1078
,什么意思呢?就是BMP 文件 4个部分中的前三个部分的长度之和,因为第一部分固定为14,第二部分固定为40,所以调色板长度为1078-14-40=
1024。从53字节开始到1077字节结束。调色板实际上是一个数组,共有biClrUsed 个元素,biClrUsed =00 00 01 00=1024。同样得出1024。数组中每个元
素的类型是一个RGBQUAD 结构,占4 个字节:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //该颜色的蓝色分量(占1字节)
BYTE rgbGreen; //该颜色的绿色分量(占1字节)
BYTE rgbRed; //该颜色的红色分量(占1字节)
BYTE rgbReserved; //保留值(占1字节)
} RGBQUAD;
从1078~2486(bfSize=00 00 09 B6=2486)就是图片数据。
知道了调色板位置,现在就来找一找。比如说1078字节,是图片左下角第一个点,它的字节值是A9,A9就是169,就是第169个RGBQUAD ,它的位置=
169×4+54=730,就是说:左下角第一个点的调色板位置在730字节~733字节共4字节。B=153、G=153、R=153、rgbReserved=0。
现在可以算ts了:
ts=(153+153+153)/3=153。
再比如说1919字节,是图片第1919-1078+1=842个点,位于从下往上数14=13+1行,从从左往右数第10个点,怎么知道是这样呢?因为图像的
宽度是63,不是4的倍数,所以每行是64个点,842-13×64=10。它的字节值是2C,2C就是44,就是第44个RGBQUAD ,它的位置=44×4+54=230,就
是说:从下往上数14行,从从左往右数第10个点的调色板位置在230字节~233字节共4字节。B=153、G=0、R=0、rgbReserved=0。
ts=(153+0+0)/3=51。

TA的精华主题

TA的得分主题

发表于 2012-8-8 21:03 | 显示全部楼层
蓝天630902 发表于 2012-8-8 20:04
其实这个应该是非常简单的事,就是数组里面的数相加:
1、如果是有调色板,就从第bfOffBits字节(其实是第 ...

太深啦,看得我就像掉进大海里一样哈
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-9 06:58 , Processed in 0.047783 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表