当前位置:文档之家› 常见验证码的弱点与验证码识别

常见验证码的弱点与验证码识别

常见验证码的弱点与验证码识别
常见验证码的弱点与验证码识别

科普好文:常见验证码的弱点与验证码识别实例详细解说

发表于2年前| 作者: seay | 分类: 科普专线, 编程开发 | 孵化于:2013年06月18日| 文章热度:4,108 次全屏阅读

显示不全请点击全屏阅读

0x00 简介

验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助。

全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。(from wikipedia)

大部分验证码的设计者都不知道为什么要用到验证码,或者对于如何检验验证码的强度没有任何概念。大多数验证码在实现的时候只是把文字印到背景稍微复杂点的图片上就完事了,程序员没有从根本上了解验证码的设计理念。

验证码的形式多种多样,先介绍最简单的纯文本验证码。

纯文本验证码

纯文本,输出具有固定格式,数量有限,例如:

?1+1=?

?本论坛的域名是?

?今天是星期几?

?复杂点的数学运算

这种验证码并不符合验证码的定义,因为只有自动生成的问题才能用做验证码,这种文字验证码都是从题库里选择出来的,数量有限。破解方式也很简单,多刷新几次,建立题库和对应的答案,用正则从网页里抓取问题,寻找匹配的答案后破解。也有些用随机生成的数学公式,比如随机数[+-*/]随机运算符随机数=?,小学生水平的程序员也可以搞定……

这种验证码也不是一无是处,对于很多见到表单就来一发的spam bot来说,实在没必要单独为了一个网站下那么大功夫。对于铁了心要在你的网站大量灌水的人,这种验证码和没有一样。下面讲的是验证码中的重点,图形验证码。

图形验证码

先来说一下基础:

识别图形验证码可以说是计算机科学里的一项重要课题,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域……

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、

色彩、线型、线宽等非几何属性组成。计算机涉及到的几何图形处理一般有2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正。对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等。

在破解验证码中需要用到的知识一般是像素,线,面等基本2维图形元素的处理和色差分析。常见工具为:

?支持向量机(SVM)

?OpenCV

?图像处理软件(Photoshop,Gimp…)

?Python Image Library

支持向量机SVM是一个机器学习领域里常用到的分类器,可以对图形进行边界区分,不过需要的背景知识太高深。

OpenCV是一个很常用的计算机图像处理和机器视觉库,一般用于人脸识别,跟踪移动物体等等,对这方面有兴趣的可以研究一下

PS,GIMP就不说了,说多了都是泪啊……

Python Image Library是pyhon里面带的一个图形处理库,功能比较强大,是我们的首选。

SVM图像边界区分

SVM原理,把数据映射到高维空间,然后寻找能够分割的超平面

识别验证码需要充分利用图片中的信息,才能把验证码的文字和背景部分分离,一张典型的jpeg 图片,每个像素都可以放在一个5维的空间里,这5个维度分别是,X,Y,R,G,B,也就是像素的坐标和颜色,在计算机图形学中,有很多种色彩空间,最常用的比如RGB,印刷用的CYMK,还有比较少见的HSL或者HSV,每种色彩空间的维度都不一样,但是可以通过公式互相转换。

RGB色彩空间构成的立方体,每个维度代表一种颜色

HSL(色相饱和度)色彩空间构成的锥体,可以参考:

https://https://www.doczj.com/doc/e313821726.html,/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9 %BA%E9%97%B4

了解到色彩空间的原理,就可以用在该空间适用的公式来进行像素的色差判断,比如RGB空间里判断两个点的色差可以用3维空间中两坐标求距离的公式:

distance=sqrt[(r1-r2)^2+(g1-g2)^2+(b1-b2)^2]

更加直观的图片,大家感受一下:

随便把一张图片的每个像素都映射到RGB色彩空间里就能获得一个这样的立方体。

通过对像素颜色进行统计和区分,可以获得图片的颜色分布,在验证码中,一般来说使用近似颜色最多的像素都是背景,最少的一般为干扰点,干扰线和需要识别文字本身。

对于在RGB空间中不好区分颜色,可以把色彩空间转换为HSV或HSL:

0x01 验证码识别的原理和过程

第一步:二值化

所谓二值化就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵。

第二步:文字分割

为了能识别出字符,需要对要识别的文字图图片进行分割,把每个字符作为单独的一个图片看待。

第三步:标准化

对于部分特殊的验证码,需要对分割后的图片进行标准化处理,也就是说尽量把每个相同的字符都变成一样的格式,减少随机的程度

最简单的比如旋转还原,复杂点的比如扭曲还原等等

第四步:识别

这一步可以用很多种方法,最简单的就是模板对比,对每个出现过的字符进行处理后把点阵变成字符串,标明是什么字符后,通过字符串对比来判断相似度。

在文章的后半部分会详细解释每步的各种算法

二值化算法

对于大部分彩色验证码,通过判断色差和像素分布都能准确的把文字和背景分离出来,通过PS 等工具把图片打开,用RGB探针对文字和背景图的颜色分别测试,在测试多张图片后,很容易可以发现文字和背景图的RGB差距总是大于一个固定的阈值,即使每次图片的文字和背景颜色都会变化,比如:

新浪和discuz的验证码

通过对文字部分和干扰部分取样可以发现,文字部分的R、G值一般在100左右,B值接近255,但是背景干扰的R、G值则大大高于文字部分,接近200,比较接近文字轮廓部分的像素的RG 值也在150以上。通过程序遍历一遍像素就可以完全去掉背景。

Discuz的验证码同理

对于一些和文字颜色相同但是较为分散和单一的干扰像素点,我们可以用判断相邻像素的方法,对于每个点判断该点和相邻8个点的色差,若色差大于某个值,则+1,如果周围有超过6个点的色差都比较大,说明这个点是噪点。对于图像边界的一圈像素,周围没有8个像素,则统统清除,反正文字都在图片的中间位置。

如下图:假如当前像素的坐标是x,y 图形坐标系的原点是图像的左上角

干扰线对于识别验证码增加了一些难度,不过干扰线只有很小的几率会以大角度曲线的方式出现,大部分时间还是小角度直线,去除算法可以参考

https://www.doczj.com/doc/e313821726.html,/view/63bac64f2b160b4e767fcfed.html

对于1个像素粗细的干扰线,在字符为2个像素以上的时候,可以用去噪点算法作为滤镜,多执行几次,就可以完美的把细干扰线去掉。

对于像素数比干扰点稍大的干扰色块,可以采用的算法有:

油漆桶算法(又叫种子填充算法,Floodfill)

种子填充算法可以方便的计算出任意色块的面积,对于没有粘连字符或者粘连但是字符每个颜色不一样的验证码来说,去除干扰色块的效果很好,你只需要大概计算一下最小的和最大的字符平均占多少像素,然后把这段区间之外像素数的色块排除掉即可。

上下左右4个方向填充还有8个方向填充的不同

判断颜色分布:

对于大多数彩色验证码来说,文字基本在图片中心的位置,每个字符本身的颜色是一样的,也就是说对于文字来说,同一种颜色基本都集中在一个固定的区域范围内,通过统计图片中的像素,按近似颜色分组,同时分析每个颜色组在图片中的分布范围,假如说有一种颜色大部分像素都在图片边缘,那么这个颜色肯定不属于要识别的字符,可以去掉。

对于干扰线,并没有一种十分有效的方式能完全去除并且不影响到文字,不过如果能够成功分割字符的话,少量干扰线对于识别率影响不大。

字符分割算法

破解验证码的重点和难点就在于能否成功分割字符,这一点也是机器视觉里的一道难题,对物件的识别能力。对于颜色相同又完全粘连的字符,比如google的验证码,目前是没法做到5%以上的识别率的。不过google的验证码基本上人类也只有30%的识别率

对于字符之间完全没有粘连的验证码,比如这个->_->

分割起来是非常的容易,用最基本的扫描线法就可以分割,比如从最左侧开始从上到下(y=0—||||y=n)扫描,如果没有遇到任何文字的像素,就则往右一个像素然后再扫描,如果遇到有文字像素存在,就记录当前横坐标,继续向右扫,突然没有文字像素的时候,就说明到了两个字符直接的空白部分,重复这个步骤再横向扫描就能找到每个字符最边缘4个像素的位置,然后可以用PIL内建的crop功能把单独的字符抠出来。

对于有少许粘连但是只是在字符边角的地方重叠几个像素的验证码,可以用垂直像素直方图的统计方法分割。如下图:

图上半部分是垂直像素直方图的一种直观展示,假如图片宽度为100像素,则把图片切割为100个1像素的竖线,下面的红色部分为当前x坐标上所有黑色像素的总和。这么一来可以很容易的通过直方图的波峰波谷把4个字母分割开。图片的下半部分是扫描线分隔法,因为干扰线和字符旋转的存在,只有M和5直接才出现了连续的空白部分。

除了垂直像素直方图,还可以从不同的角度进行斜线方向的像素数投影,这种方式对于每次全体字符都随机向一个角度旋转的验证码效果很好。对于每次字符大小和数量都一样的验证码还可以用平均分割法,也就是直接先把中间的文字部分整体切出来,然后按宽度平均分成几份,这种方

式对字符粘连比较多用其他方式不好分割的验证码很有用,之前的megaupload的3位字母验证码就是通过这种方式成功分割的。

另外对于彩色的验证码,还可以用颜色分割,比如12306的:

12306的验证码,每个字符颜色都不一样,真是省事啊。

作为验证码识别里的难点,分割字符还有很多种算法,包括笔画分析曲线角度分析等等,不过即便如此,对粘连的比较厉害的字符还是很难成功的。

标准化

标准化的意思是指对于同一个字符,尽可能让每次识别前的样本都一致,以提高识别率。而验证码设计者则会用随机旋转,随机扭曲还有随机字体大小的方式防止字符被简单方法识别。

还原随机旋转的字符一般采用的是旋转卡壳算法:

此算法非常简单,对一张图片左右各旋转30度的范围,每次1度,旋转后用扫描线法判断字符的宽度,对于标准的长方形字体,在完全垂直的时候肯定是宽度最窄的。嗯?纳尼?上面的图是中间的最窄?好像的确是这样,不过只要每次旋转后的结果都一样,对于识别率不会有影响。扭曲还原的算法比较蛋疼,效果也不怎么样(其实我不会),不过如果识别算法好的话,对扭曲的字符只要人能认出来,识别率也可以达到接近人类的水准。

还有一些常用到的算法,对于提高识别率和减少样本数量有一定帮助:

骨架细化:腐蚀算法

腐蚀算法的原理有点像剥洋葱,从最外层沿着最外面的一层像素一圈一圈的去掉,直到里面只剩下一层像素为止。腐蚀算法里面需要用到另一个算法,叫做凸包算法,用来找一堆像素点里面最外围的一层。

最后就是把字符变成统一大小,一般而言是把全部字符都缩到和验证码里出现过的最小的字符一个大小。

详情请自行google……

分割算法差不多就到这里了,都是一些比较基础的内容。下面是最终的识别。

0x02 识别

其实到了这一步,单独的字符已经分离出来了,可以训练tesseract ocr来识别了,样本数量多的话,识别率也是很高的。不过在这里还是要讲一下,如何自己来实现识别过程。

第一步,样本现在应该已经是一个矩阵的形式了,有像素的地方是1,背景是0,先肉眼识别一下,然后把这个矩阵转换为字符串,建立一个键值对,标明这串字符串是什么字符。之后就只需要多搜集几个同样字符的不同字符串变形,这就是制作模板的过程,。

搜集了足够多的模板后,就可以开始识别了,最简单的方法:汉明距离,但是如果字符有少许扭曲的话,识别率会低的离谱。对比近似字符串用的最多一般是编辑距离算法(Levenshtein Distance),具体请自己google。

两种算法的差别在于,对同样两个字符串对比10010101和10101010,汉明距离是6,但是编辑距离是2。

最后一种最NB的识别算法,就是神经网络,神经网络是一种模拟动物神经元工作模式的算法,神经网络有多种不同的结构,但是基本架构分为输入层,隐含层和输出层,输入和输出均为二进制。

对于验证码识别来说,输入和输出节点不宜过多,因为多了很慢……所以如果样本矩阵为20×20 400个像素的话,需要对应的也要有400个输入节点,因此我们需要对整个矩阵提取特征值,比如先横向每两个数字XOR一下,然后再竖向每两个数字XOR。

Python有很多封装好的神经网络库,你所需要的只是把特征值输入神经网络,再告诉他你给他的是什么(字符),这样多喂几次之后,也就是训练的过程,随着训练的进行,神经网络的内部结构会改变,逐渐向正确的答案靠拢。神经网络的优势是,对于扭曲的字符识别成功率非常高。另外神经网络在信息安全中还可以起到很多其他作用,比如识别恶意代码等等。

动画验证码

有些不甘寂寞的程序员又玩出了些新花样,比如各种GIF甚至flv格式的动画验证码,下面我来分析一下腾讯安全中心的GIF验证码。

晃来晃去的看似很难,放慢100倍一帧一帧再看看?

基本上每帧都有一个字符和其他的分开,用最简单的扫描法就能分割出来。

剩下的就很轻松了,旋转还原之后,先填充内部空白,缩小细化之后做成模板对比,识别率怎么也得有90%了。

原本一张图就能搞定的事情,偏偏给了我们8张图,而且每张图还有一点区别,平白无故增大了很多信息量。

另外就是一些所谓的高用户体验的验证码,比如freebuf的:

拖动解锁按钮会触发执行一段js,生成一串随机字符串,ajax给后端程序判断。

破解方式就当留给大家的思考题了,假如我想刷评论的话,怎么办。

还有就是声音验证码的识别,现在很多验证码为了提高用户体验和照顾视觉障碍的用户,都有声音验证码,一般来说是机器生成一段读数字的语音。但是在这方面上很多程序员都偷懒了,预先找了10个数字的声音录音,然后生成的时候把他们随机拼到一起,结果就是这样:

前3秒为语音提示,后面的是数字,有没有发现什么?声音也是可以做成模板的哦

最后就是应该怎么样去设计验证码

?整体效果

?字符数量一定范围内随机

?字体大小一定范围内随机

?波浪扭曲(角度方向一定范围内随机)

?防识别

?不要过度依赖防识别技术

?不要使用过多字符集-用户体验差

?防分割

?重叠粘连比干扰线效果好

?备用计划

?同样强度完全不同的一套验证码

附件添加一个破解验证码的实例包括程序大家自行研究吧:验证码识别

验证码识别常用算法

验证码识别常用算法 图像处理(验证码识别)程序中常用算法:灰度,二值化,去噪(1*1像素或者3*3像素等) 代码: view plaincopy to clipboardprint? //灰度 private void btnGray_Click(object sender, EventArgs e) { try { int Height = this.picBase.Image.Height; int Width = this.picBase.Image.Width; Bitmap newbitmap = new Bitmap(Width, Height); Bitmap oldbitmap = (Bitmap)this.picBase.Image; Color pixel; for (int x = 0; x < Width; x++) { for (int y = 0; y < Height; y++) { pixel = oldbitmap.GetPixel(x, y); newbitmap.SetPixel(x, y, Gray(pixel)); } } this.picBase.Image = newbitmap; } catch (Exception err) { MessageBox.Show("灰度化失败原因:" + err.Message); } } //灰度化算法 protected static Color Gray(Color c) { int rgb = Convert.ToInt32((double)(((0.3 * c.R) + (0.59 * c.G)) + (0.11 * c.B))); return Color.FromArgb(rgb, rgb, rgb); } //灰度 private void btnGray_Click(object sender, EventArgs e) { try { int Height = this.picBase.Image.Height; int Width = this.picBase.Image.Width; Bitmap newbitmap = new Bitmap(Width, Height); Bitmap oldbitmap = (Bitmap)this.picBase.Image; Color pixel; for (int x = 0; x < Width; x++) { for (int y = 0; y < Height; y++) { pixel = oldbitmap.GetPixel(x, y);

验证码识别技术论文.

验证码识别技术论文 验证码识别平台介绍 1、验证码识别的需求 对于打码,首先要了解你的需求是什么?打码赚钱是很多人需要的,无利不起早,利益这个并不是什么不好的东西,也是我们生存的需要。但是对于打码市场有两种不一样的需求,一种是通过自己进行打码进行赚钱,还有一种打码是需要自动识别输入验证码。现在的打码软件也分成两种,一种就是打码输入平台,一种是打码输出平台。目前比较明显的就是人工打码的任务发放,和另外一种如答题吧打码平台的验证码自动输入。 2、验证码识别的目的 打码的目的,根据上述的分析,就是打码的需求不一样,那么进行打码的目的也是不一样的。一种是全人工的手动输入,主要就是各种打码平台对于各种验证码题源的获取,然后雇请网络上的人员进行验证码的人工输入,以达到各种平台对于验证码的自动解答。另外一种的目的就是通过对于这种题源的解答的引用,加上国外验证码识别技术的应用,进行的验证码的自动解答。 3、验证码识别的要求 人工打码的要求就是要求任务的领取与完成,这个的时间是比较的长,需要的成本也是比较大的。而且必须是正确的才能够进行计费,还有就是也有任务也是有时间限定的。另外的打码软件就是随时随地的自动识别,但是要求有第三方软件作为连接才能够进行操作。 4、验证码识别的结果

人工的相对比较的智能,能够对于各种验证码进行识别,识别的正确率也是相当的大的,毕竟这个世界上最聪明的就是人类了。但是另外一种的就是对于验证码的自动识别,也是人工打码资源的应用,识别的是有针对性的。 验证码识别平台有两种形式,一种是我们说熟知的进行任务发放的,人工打码,还有一种就是智能识别验证码的平台 验证码识别平台平台正确率更高的网站验证码识别平台平台正确率是关系着很多使用者最直观的感受的,若正确率太低,还不如不使用此款软件。 在以往用户很难寻找到真正的准确率较高的验证码识别平台,但是在现在已有答题吧验证码识别平台为用户提供优质服务,正确率最高可达99.1%。 提供高速稳定的识别服务: 在中国顶级IDC机房拥有超过20台服务器来保证您的高速稳定。 答题吧自动打码软件优势 1 免费测试:全平台支持免费验证码识别测试,登陆账号后上传图片验证码即可; 2 识别率高:集成各大验证码识别代答商资源的全自动验证码识别平台,企业式管理答题,验证码识别率99.1%; 3 高分成比:最完善的分成系统为开发者提供全天24小时高额分成,最高返50%; 4 价格实惠:为用户提供全网性价比最高,价格更低的图像识别服务; 5 精准计费:计费精准透明,多种查询方式方便轻松 答题吧自动打码软件的原理

八爪鱼验证码登陆-控件识别方法(7.0版本)

https://www.doczj.com/doc/e313821726.html, 八爪鱼验证码登陆-控件识别方法(7.0版本) 本文给大家演示登陆界面有验证码或者其他验证(如滑块验证)的网站通过八爪鱼控件识别进行数据采集的方式。 所讲示例采集数据网址为/login.aspx 小贴士:通过八爪鱼的控件进行识别,这种方式如果需要自动识别,就需要购买验证码套餐,如果不购买也只能进行单机采集然后手动输入,注意这种方法只能是输入验证码的框才可以用这种方式。 步骤1 登陆八爪鱼7.0采集器→点击新建任务→自定义采集,进入到任务配置页面:然后输入网址→保存网址,系统会进入到流程设计页面并自动打开前面输入的网址。 验证码登陆-控件识别方法-图1:输入网址

https://www.doczj.com/doc/e313821726.html, 接下来步骤是输入用户名密码了,八爪鱼模拟的是人的操作行为,所以这一步过程也很简单 步骤2 在浏览器中鼠标点击用户名输入框→在右边弹出的提示里面选择“输入文字”→输入自己的用户名→选择“确定”。 同样的方式输入密码,这样输入用户名密码的步骤就完成了。 验证码登陆-控件识别方法-图2:输入密码

https://www.doczj.com/doc/e313821726.html, 验证码登陆-控件识别方法-图3:输入密码 这里八爪鱼采集器需要知道 1.验证码图片在哪里 2.输入框验证码的框在哪里 步骤3 点击下方浏览器中验证码图片的位置→按照提示框中的提示选择浏览器中的验证码框→再按照提示框中的提示点击浏览器中的登陆按钮

https://www.doczj.com/doc/e313821726.html, 验证码登陆-控件识别方法-图4:点击验证码输入框

https://www.doczj.com/doc/e313821726.html, 验证码登陆-控件识别方法-图5:点击验证码图片位置、登录按钮 接下来需要配置验证码输入失败和成功的两种场景 步骤4 点击提示框中的确认按钮,系统会自动提交一个错误的验证码→然后点击浏览器中的“验证码不正确”提示→再点击提示框中的确认按钮→选择提示框中的“开始配置识别成功场景”→在提示框中输入显示出来的验证码→选择提示框中的“应用到网页并完成配置”选项

图片验证码识别打码软件使用教程

图片验证码识别打码软件 使用教程 目录 一、简介 (2) 二、运行原理 (2) 三、菜单功能 (3) 四、使用流程 (6) 五、注意事项 (9)

一、简介 其实图片验证码识别打码软件是依托一个验证码自动识别平台,根据用户及软件开发者的需求进行平台对接之后自动将软件遇到的验证码进行自动的识别,从而减少验证码给双眼带来的压力,节省验证码识别的时间。其中可以自动识别输入的验证码有数字,字母,数字字母组合,汉字等,但是特殊类型的需要与客服沟通。在目前国内已有的验证码识别的技术的基础上,加入验证码题库,大大提高了验证码识别的准确率。像比较常见的就是对接好答题吧打码平台进行电脑打码。 二、运行原理 1、答题打码平台开发研究要重点研究了用于字符识别的BP神经网络、卷积神经网络和形状上下文算法,给出详细的推导。 2、采用分段线性变换去除图像模糊,利用局部OSTU二值化,得到了比全局阈值更好的分割结果。对传统的投影分割法改进,提出了极小值分割算法,有效解决了验证码字符粘连的问题。并采用简化后的卷积神经网络进行字符训练和识别,达到了99.1%的高识别率。 3、聚类算法和竖直投影结合的方式完成分割,解决了字符叠加和粘连的难题。对单个字符以简化后的卷积神经网络进行训练和识别,识别率达到了53%。 4.对已有的难以分割的验证码,提出了基于形状上下文整体识别

验证码的方法,破解率达到了27.7%。这种整体识别的思想也给其 他较难分割的验证码提供了一个新的识别思路。 三、菜单功能 1、识别测试 在对接操作之前,让用户进行免费测试了解平台的识别准确率的 窗口。将用户名,密码进行填写之后上传测试的图片验证码就可以进 行测试识别。(ps:在线识别测试只支持普通英文、数字或者汉字验 证码,选择题及特殊类型请联系客服) 2、VIP体系 详细介绍了不同的VIP等级享受的福利不一样。基本上是充值的 越多,送的也就越多。一般来说,识别验证码的价格是十分的划算的。 3、价格类型 1)识别验证码类型 纯数字,纯英文字母,字母数字组合,纯汉字,数字英文汉字 三混合。 2)价格详情 1.纯数字 编码类型白天收费点数夜间收费点数超时时间44位纯数字10.0014.0060 61位纯数字10.0012.0060

按键精灵 识别验证码 一般的验证码通杀

Function body(a,b,c) dim aa aa=a aa=mid(aa,instr(aa,b) len(b)) body=left(aa,instr(aa,c)-1) End Function Public Function StringToBytes(ByVal strData, ByVal strCharset) Dim objFile Set objFile = CreateObject("ADODB.Stream") objFile.Type = adTypeText objFile.Charset = strCharset objFile.Open objFile.WriteText strData objFile.Position = 0 objFile.Type = adTypeBinary If UCase(strCharset) = "UNICODE" Then objFile.Position = 2 'delete UNICODE BOM ElseIf UCase(strCharset) = "UTF-8" Then objFile.Position = 3 'delete UTF-8 BOM End If StringToBytes = objFile.Read(-1) objFile.Close Set objFile = Nothing End Function Private Function GetFileBinary(ByVal strPath) Dim objFile Set objFile = CreateObject("ADODB.Stream") objFile.Type = adTypeBinary objFile.Open objFile.LoadFromFile strPath GetFileBinary = objFile.Read(-1) objFile.Close Set objFile = Nothing End Function

数字图像__验证码识别

一、数字图像处理基础 一幅图像可以定义为一个二维数组f(x,y),这里x,y是空间坐标,而在任何一对空间坐标(x,y)上的幅值f称为该点图像的强度或灰度。当x,y和幅值f为有限的、离散的数值时,称该图像为数字图像。 自然界呈现在人眼中的图像是连续的模拟信号,在计算机处理前,必须用图像传感器把光信号转换为表示亮度的电信号,再通过取样和量化得到一副数字图像。取样是对图像在坐标上进行离散化的过程,每一个取样点称为一个像素。量化是对图像灰度上的离散化过程。取样后将得到M*N个像素,每个像素量化得到一个灰度值L,以L表示灰度值的允许取值范围,则数字图像存储需要的比特数b可以表示为: 图像的灰度值取值范围被称为图像的动态范围。把占有灰度级全部有效段的图像称为高动态范围图像,高动态范围图像有较高的对比度。相反,地动态范围的图像看上去是冲淡了的灰暗格调。 二、图像的预处理: 主要是对图像进行灰度化、二值化、抑噪(滤波)等技术。 1、图像的灰度化 RGB系统中一个颜色值由3个分量组成,这样的图像称为彩色图像,RGB系统称为颜色空间模型。常见的颜色空间模型还有HSI、CMYK 等。如果一幅图像的颜色空间是一维的(一个颜色值只有一个颜色分

量),则这幅图像就是一副灰度图。在位图图像中,一般以R=G=B来显示灰度图像。 图 1 原始图片 常用的灰度化方法有以下三种: (2.1) (2.2) (2.3) 其中,公式(2.1)的方法来源于I色彩空间中I分量的计算公式,公式(2.2)来源于NTSC色彩空间中Y分量的计算公式。公式(2.3)是基于采用保留最小亮度(黑色)的方法。 图 2 用公式2.2灰度化后的图片 RGB彩色图像可以看成是由3副单色的灰度图像构成的,可以直 接取RGB通道中的任一个通道得到灰度化图像,如,前提是图像中目标像素的亮度信息主要分布在B通道上,否则灰度化结果将是亮度信息的大量丢失。灰度图像又叫亮度图像,由归一化的取值表示亮度,最大取值表示白色,最小取值表示黑色。

基于目标检测方法的验证码识别方法及系统与制作流程

图片简介: 本技术涉及一种基于目标检测方法的验证码识别方法及系统,其中方法包括:A.收集不同形状的滑块图片并建立数据集,通过selenium库操控浏览器进行网页请求操作,并进行模拟登陆,对验证码图片进行截图;B.对滑块图片进行RGBA四通道转透明通道处理,得到不透明滑块图片,对带缺口的验证码图片进行灰色处理;C.通过OpenCV中的函数对图片进行匹配,计算出不透明滑块图片和带缺口的验证码图片缺口处的坐标,得到滑块图片的位移量; D.通过selenium库模拟鼠标,按照先快后慢的人工滑动规律移动滑块图片,对验证码进行解析。为在各大网站收集数据做前期准备工作,实现自动识别滑动拼图验证码,提高验证码识别的准确率。 技术要求

1.一种基于目标检测方法的验证码识别方法,其特征包括: A.收集不同形状的滑块图片并建立滑块图片数据集,通过selenium库操控浏览器进行网页请求操作,并进行模拟登录,对带缺口的验证码图片进行截图,提取带缺口的验证码图片; B.对数据集中的滑块图片进行RGBA四通道转透明通道处理,得到不透明滑块图片,对所提取的带缺口的验证码图片进行灰色处理; C.通过OpenCV的matchTemaplate函数对所述不透明滑块图片和所述带缺口的验证码图片进行匹配,设置相似度阀值,通过OpenCV中的cv2.TM_CCOEFF_NORMED得到与带缺口的验证码图片最相匹配的不透明滑块图片,计算出不透明滑块图片和带缺口的验证码图片缺口处的坐标,得到不透明滑块图片移动到带缺口的验证码图片缺口处的位移量distance; D.通过selenium库模拟鼠标点击所述滑块图片,并保持模拟鼠标按键的点压状态,按照先快后慢的人工滑动规律移动所述滑块图片,实现将滑块图片移动到所述带缺口的验证码图片的缺口处进行验证码解析。 2.根据权利要求1所述的一种基于目标检测方法的验证码识别方法,其特征在于:步骤B 中,对所述的滑块图片和带缺口的验证码图片进行处理时,对滑块图片进行RGBA四通道转透明通道处理,将RGB三通道的数值设为0,透明通道“A”的数值设置为220,仅保留滑块图的边缘部分;对所述带缺口的验证码图片进行RGB三通道转单通道的灰度处理。 3.根据权利要求1所述的一种基于目标检测方法的验证码识别方法,其特征在于:步骤D 中,所述进行验证码解析的步骤包括: D1.设置阈值mid=distance×3/4,初始滑块位置current=0,时刻t=0.2,初始速度V=0,加速度a=0; D2.初始滑块位置current小于位移量distance时,进入循环: 若当前滑块位置current小于阀值mid时, a=2; 若当前滑块位置current大于阀值mid时, a=-3;

验证码的作用

验证码的作用 验证码的作用:有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能。虽然登陆麻烦一点,但是对社区还来说这个功能还是很有必要,也很重要。但我们还是提醒大家主要保护自己的密码,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码。不要因为只是来iclub问问问题,就随意设置密码,保护你自己的密码也是保护你自己,免得你的账号给人盗用给自己带来不必要的麻烦。~ (1).验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。二像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。 (2).一般注册用户ID的地方以及各大论坛都要要输入验证码 (3).常见的验证码 1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。 2,CSDN网站用户登录用的是GIF格式,目前常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。没有基本图形图像学知识的人,不可破!可惜读取它的程序,在CSDN使用它的第一天,好像就在论坛里发布了,真是可怜! 3,QQ网站用户登录用的是PNG格式,图片用的随机数字+随机大写英文字母,整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊… 4,MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。 5,Google的Gmail注册时候的是JPG格式,随机英文字母+随机颜色+随机位置+随机长度。6,其他各大论坛的是XBM格式,内容随机。 (4)意义:不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

基于GO的图片验证码识别api调用代码实例

基于GO的图片验证码识别api调用代码实例 代码描述:基于GO的图片验证码识别api调用代码实例 代码平台:聚合数据 package main import( "io/ioutil" "net/http" "net/url" "fmt" "encoding/json" ) //---------------------------------- // 验证码识别调用示例代码-聚合数据 // 在线接口文档:https://www.doczj.com/doc/e313821726.html,/docs/60 //---------------------------------- const APPKEY = "*******************"//您申请的APPKEY func main(){ //1.识别验证码 Request1() //2.查询验证码类型代码 Request2() } //1.识别验证码 func Request1(){ //请求地址 juheURL :="https://www.doczj.com/doc/e313821726.html,/vercode/index" //初始化参数 param:=url.Values{} //配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参param.Set("key",APPKEY) //您申请到的APPKEY

param.Set("codeType","") //验证码的类型,<a href="http://www. https://www.doczj.com/doc/e313821726.html,/docs/api/id/60/aid/352" target="_blank">查询&l t;/a> param.Set("image","") //图片文件 param.Set("dtype","") //返回的数据的格式,json或xml,默认为json //发送请求 data,err:=Post(juheURL,param) if err!=nil{ fmt.Errorf("请求失败,错误信息:\r\n%v",err) }else{ var netReturn map[string]interface{} json.Unmarshal(data,&netReturn) if netReturn["error_code"].(float64)==0{ fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result "]) } } } //2.查询验证码类型代码 func Request2(){ //请求地址 juheURL :="https://www.doczj.com/doc/e313821726.html,/vercode/codeType" //初始化参数 param:=url.Values{} //配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参 param.Set("key",APPKEY) //您申请到的APPKEY param.Set("dtype","") //返回的数据的格式,json或xml,默认为json //发送请求 data,err:=Get(juheURL,param) if err!=nil{ fmt.Errorf("请求失败,错误信息:\r\n%v",err) }else{ var netReturn map[string]interface{} json.Unmarshal(data,&netReturn) if netReturn["error_code"].(float64)==0{ fmt.Printf("接口返回result字段是:\r\n%v",netReturn["result "])

验证码新技术趋势

0x00 简介 验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助。 全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。(from wikipedia) 大部分验证码的设计者都不知道为什么要用到验证码,或者对于如何检验验证码的强度没有任何概念。大多数验证码在实现的时候只是把文字印到背景稍微复杂点的图片上就完事了,程序员没有从根本上了解验证码的设计理念。 验证码的形式多种多样,先介绍最简单的纯文本验证码。 纯文本验证码 纯文本,输出具有固定格式,数量有限,例如: ?1+1=? ?本论坛的域名是? ?今天是星期几? ?复杂点的数学运算

这种验证码并不符合验证码的定义,因为只有自动生成的问题才能用做验证码,这种文字验证码都是从题库里选择出来的,数量有限。破解方式也很简单,多刷新几次,建立题库和对应的答案,用正则从网页里抓取问题,寻找匹配的答案后破解。也有些用随机生成的数学公式,比如随机数 [+-*/]随机运算符随机数=?,小学生水平的程序员也可以搞定…… 这种验证码也不是一无是处,对于很多见到表单就来一发的spam bot来说,实在没必要单独为了一个网站下那么大功夫。对于铁了心要在你的网站大量灌水的人,这种验证码和没有一样。 下面讲的是验证码中的重点,图形验证码。 图形验证码 先来说一下基础: 识别图形验证码可以说是计算机科学里的一项重要课题,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。计算机涉及到的几何图形处理一般有2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正。对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等。 在破解验证码中需要用到的知识一般是像素,线,面等基本2维图形元素的处理和色差分析。常见工具为: ?支持向量机(SVM) ?OpenCV ?图像处理软件(Photoshop,Gimp…) ?Python Image Library

php实现验证码的识别(初级篇)

近期研究一些突破验证码方面的知识,记录下来。一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外也希望引起网站管理者的注意,在提供验证码时多些考虑进去。由于刚刚接触这方面的知识,理解比较浅显,有错误再所难免,欢迎拍砖。 验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。 所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。 我们最常见的验证码 1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。 2,随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破!3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。 4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。 简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片. (不知道怎么搞的,CSDN又不能上传图片了,我把这四种图片放到下载包中了,可以下载下来对比察看) 这四种样式,基本上能代表2中所提到的验证码类型,初步看起来第一个图片最容易破解,第二个次之,第三个更难,第四个最难。 真实情况那?其实这三种图片破解难度相同。 第一个图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。 第二个图片,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。第三个图片,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。看似无法突破这个验证码,本篇文章,就一这种类型验证码为例说明,第四个图片,同学们自己搞。 第四个图片,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。 验证码识别一般分为以下几个步骤:

验证码识别原理及实现方法

验证码识别原理及实现方法 验证码的作用:有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。 所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。 我们最常见的验证码 1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。 2,随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破! 3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。 4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。 简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片. 这四种样式,基本上能代表2中所提到的验证码类型,初步看起来第一个图片最容易破解,第二个次之,第三个更难,第四个最难。 真实情况那?其实这三种图片破解难度相同。 第一个图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。 第二个图片,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。 第三个图片,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。看似无法突破这个验证码,本篇文章,就一这种类型验证码为例说明,第四个图片,同学们自己搞。 第四个图片,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。 验证码识别一般分为以下几个步骤: 1.取出字模 2.二值化 3.计算特征 4.对照样本 1:取出字模 识别验证码,毕竟不是专业的OCR识别,并且,由于各个网站的验证码各不相同,所以,最常见的方法就是就是建立这个验证码的特征码库。去字模时,我们需要多下载几张图片,使这些图片中,包括所有的字符,我们这里的字母只有图片,所以,只要收集到包括0-9的图片即可。 2:二值化 二值化就是把图片上的验证数字上每个象素用一种数字表示1,其他部分用0表示。这样就可以计算出每个数字字模,记录下这些字模来,当作key即可。

数字验证码识别算法的研究与设计

数字验证码识别算法的研究和设计 王虎, 冯林, 孙宇哲 Wang Hu, Feng Lin, Sun Yuzhe 大连理工大学大学生创新院,大连116023 Institute of University Students’ Innovation, Dalian University of Technology, Dalian 116023, China E-mail: wlys111@https://www.doczj.com/doc/e313821726.html, Research and Design of Digital character-based CAPTCHA Recognition Abstract:CAPTCHA Recognition can be used in multi-send technology. Digital character-based CAPTCHA Recognition, which is foundation of pattern recognition research, is a kind of OCR. In this paper, we proposed a CAPTCHA Recognition System based on simple distortion and its architecture is template matching. Hilditch thinning algorithm, circle structure searching algorithm and dynamic template analyzing algorithm is chose and the weigh of template is also used to improve the recognition accuracy. The advantage of the system is that the recognition precision is perfect. Key words:Template matching, Weighted Template, dynamic template, grid feature, crossing points feature 摘要:验证码识别技术可以用于网站的群发软件,数字验证码识别是光学字符识别(OCR)的一种,是进行模式识别研究的基础。论文提出了以简单变形的数字字符为理论研究素材,将模板匹配作为基本框架的验证码识别系统。系统采用图像的Hilditch细化算法、环结构的搜索算法、活动模板分析算法,加入模板分量的权值。其优点在于能够对特定数字验证码精确识别,实验中识别准确率基本达到100%。 关键字:模板匹配,加权模板,活动模板,网格特征,交叉点特征 文章编号:文献标识码:A 中图分类号:TP391.43 引言 目前,网络上出现了很多以图片形式出现的基于文本的验证码。所谓验证码,就是将一串随机产生的字符,生成一幅图片,图片里随机的加入一些像素干扰、颜色干扰和形变干扰等等,以达到防止恶意注册等目的。有的验证码是无像素干扰的、大小固定的、质心位置居中,含有形变干扰的数字字符,我们称之为简单变形体。反之,我们称加入了更多干扰的字符为复杂变形体。 验证码千变万化,而当前的识别系统都具有很强针对性,只能够识别一种类型的验证码,而且验证码的技术不断发展,出现了更加复杂的基于图像的验证码系统[5],并且目前人工智能(机器智能)还远未赶上人类智能,但是对于给定的验证码系统,在获知其特点之后,基本能够以一定的准确率进行识别[6、7]。 基金项目: 国家自然科学基金( the National Foundation of China under Grant No.10471051 )。 作者简介: 王虎(1984-),学士,研究方向:计算机图形处理,模式识别与智能控制; 冯林(1969-),博士,教授,研究方向:图像压缩、配准及融合和演化算法; 孙宇哲(-),硕士,研究方向:.

验证码自动识别的应用

验证码自动识别的应用一、验证码的由来 智能时代的到来给我们的生活带来了很多的新鲜词,“验证码”便是在这样的背景之下诞生的。 垃圾评论和垃圾邮件可以轻松通过任何一个网站的注册程序,通过各种方式轰炸人民群众的眼球。 最先想要解决这一问题的是雅虎——作为互联网时代早期最重要的免费邮件提供商,他们一方面要解决用户们每天遇到的数以百计的垃圾邮件轰炸,另一方面,他们自己的免费邮箱,恰恰又是垃圾邮件的最爱耗费无数资源所阻止的垃圾邮件,都来自于自己的服务器。这让雅虎开始认真考虑如何解决人机辨识问题。(摘自网络文章) 二、验证码识别技术的背景 在国内验证码识别技术还是在摸索阶段,但是却无法阻挡它的发展。2009年,A.A. Chandavale等针对EZ-Gimpy 的四类验证码分别进行了识别。2008年,Jeff Yan等人以高达90%以上的识别率破解了微软先前的验证码。2005年,

Edward Aboufadel,Julia Olsen和Jesse Windle通过将字符旋转至水平并对单个字符应用Harr小波滤波结果作为特征,以接近100%的识别率破解了the Holiday Inn Priority Club的验证码。【摘自:验证码识别技术研究】 三、验证码识别技术的技术原理 为简单起见,破解说明主要针对是第2种类型的,先来看看网上常见的这种验证码的图片: 一种,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。 二种,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。 三种,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。 四种,除了第三个图片上提到的特征外,又在文字上加了两

图像识别解决方案(验证码)

图像识别解决方案(验证码) 篇一:用于验证码图片识别的类 用于验证码图片识别的类(C#源码) 最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。但写得多了,也总结出不少相同之处。今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。 封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了:GrayByPixels(); //灰度处理 GetPicValidByValue(128, 4); //得到有效空间 Bitmap[] pics = GetSplitPics(4, 1); //分割 string code = GetSingleBmpCode(pics[i], 128);//得到代码串 using System; using ; using

using ; using ; using ; using ; namespace BallotAiying2 { class UnCodebase { public Bitmap bmpobj; public UnCodebase(Bitmap pic) { bmpobj = new Bitmap(pic); //转换为Format32bppRgb

/// /// 根据RGB,计算灰度值 /// /// Color值 /// 灰度值,整型 private int GetGrayNumColor( posClr) { return ( * 19595 + * 38469 + posClr .B * 7472) >> 16; } /// /// 灰度转换,逐点方式 /// public void GrayByPixels() { for (int i = 0; i { for (int

C#源代码,数字识别,特征识别,新浪数字,验证码识别

using System; using System.Collections.Generic; using https://www.doczj.com/doc/e313821726.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace测试数字提取 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //新浪微博数字识别,根据rgb红色分量150一下的识别 //下面是每个数字的特征 class NewNumber { static int[,] _num1 = new int[9, 7] {{0,0,0,0,1,0,0},{0,0,0,1,1,0,0},{0,0,1,0,1,0,0},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0}, {0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0}}; static int[,] _num2 = new int[9, 7] {{0,0,1,1,1,1,0},{0,1,0,0,0,1,0},{0,1,0,0,0,0,1},{0,0,0,0,0,1,0},{0,0,0,0,0,1,0}, {0,0,0,1,1,0,0},{0,0,1,1,0,0,0,},{0,1,1,0,0,0,0},{0,1,1,1,1,1,1}}; static int[,] _num3 = new int[9, 7] {{0,0,1,1,1,0,0},{0,1,0,0,0,1,0},{0,0,0,0,0,1,0},{0,0,0,0,0,1,0},{0,0,0,1,1,0,0}, {0,0,0,0,0,1,0},{0,0,0,0,0,0,1},{0,1,0,0,0,1,0},{0,0,1,1,1,0,0}}; static int[,] _num4 = new int[9, 7] {{0,0,0,0,0,1,0},{0,0,0,0,1,1,0},{0,0,0,1,1,0,0},{0,0,0,0,0,1,0},{0,0,1,0,0,1,0}, {0,1,0,0,0,1,0},{0,1,1,1,1,1,1},{0,0,0,0,0,1,0},{0,0,0,0,0,1,0}}; static int[,] _num5 = new int[9, 7] {{0,0,1,1,1,1,0},{0,0,1,0,0,0,0},{0,0,0,0,0,0,0},{0,1,1,1,1,1,0},{0,1,0,0,0,0,0}, {0,0,0,0,0,0,1},{0,0,0,0,0,0,1},{0,1,0,0,0,0,0},{0,0,1,1,1,0,0}}; static int[,] _num6 = new int[9, 7] {{0,0,0,1,1,0,0},{0,0,1,0,0,1,0},{0,1,0,0,0,0,0},{0,1,0,1,1,0,0},{0,1,1,0,0,1,0}, {0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,0,1,0,0,1,0},{0,0,1,1,1,0,0}}; static int[,] _num7 = new int[9, 7] {{0,1,1,1,1,1,1},{0,0,0,0,0,1,0},{0,0,0,0,1,0,0},{0,0,0,0,1,0,0},{0,0,0,1,0,0,0}, {0,0,0,1,0,0,0},{0,0,0,1,0,0,0},{0,0,0,0,0,0,0},{0,0,1,0,0,0,0}}; static int[,] _num8 = new int[9, 7] {{0,0,1,1,1,0,0},{0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,0,1,1,1,0,0}, {0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,0,1,1,1,0,0}}; static int[,] _num9 = new int[9, 7] {{0,0,1,1,1,0,0},{0,1,1,0,0,1,0},{0,1,0,0,0,1,0},{0,1,0,0,0,1,0},{0,1,1,0,0,1,0}, {0,0,1,1,1,0,0},{0,0,0,0,0,1,0},{0,1,0,0,0,1,0},{0,0,1,1,1,0,0}}; static int[,] _num0 = new int[9, 7]

相关主题
文本预览
相关文档 最新文档