标题:[原创]采用3线法和像素判别法来识别验证码
只看楼主
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
结帖率:73.33%
 问题点数:0 回复次数:6 
[原创]采用3线法和像素判别法来识别验证码
采用3线法和像素判别法来识别数字
验证码地址http://passport.

所谓3线法(不知道以前有没有这样做,这个是我偶然想到的)就是竖线1条,横线两条,判断于图像的交点,用交点个数来做数字的代号,代号如有相同,则采用像素判别(比较大小)来区分

当然该方法有很大潜力改进,我今天无意间想到,就写出来供大家研究

Private check(1 To 3) As Integer
Private num(0 To 5) As Integer

Private Sub Command1_Click()
Dim i As Integer
Dim x, y, a, b, m, n As Integer
Dim blue As Integer
Dim clr, p As Long
Dim dis1, dis2, temp, clm As Integer


For i = 0 To 5
    Select Case i ‘6个数字分别分段识别
    Case 0
    dis1 = 0
    dis2 = 230
    clm = 150
    Case Else
    temp = dis2
    dis2 = dis2 + 180
    dis1 = temp
    clm = clm + 180
    End Select
   
   
   
    a = 0

For y = 0 To 450                   ’画竖线得交点
       clr = Picture1.Point(clm, y)
       blue = (clr \ &H10000) Mod &H100
      
       If blue < 254 Then
          If b = 0 Then
             a = a + 1
             b = 1
          End If
       Else
          b = 0
       End If
Next y
   
    check(1) = a
     a = 0
 
 
For x = dis1 To dis2                   ‘范围画2横向线,得交点

       clr = Picture1.Point(x, 170)
       blue = (clr \ &H10000) Mod &H100
      
       If blue < 254 Then
          If b = 0 Then
             a = a + 1
             b = 1
          End If
       Else
          b = 0
       End If
Next x

    check(2) = a
     a = 0
For x = dis1 To dis2
       clr = Picture1.Point(x, 240)
       blue = (clr \ &H10000) Mod &H100
      
       If blue < 254 Then
          If b = 0 Then
             a = a + 1
             b = 1
          End If
       Else
          b = 0
       End If
Next x
      
      check(3) = a
      
      
 If check(1) = 4 And check(2) = 2 And check(3) = 2 Then  ’用check做交点编码,找相应的数字,如果编码相同则判断蓝色像素的多少来区分
             p = 0
            
   For m = dis1 To dis2 Step 4
     For n = 0 To 450 Step 4
         clr = Picture1.Point(m, n)
         blue = (clr \ &H10000) Mod &H100
         If blue < 254 Then p = p + 1
     Next n
   Next m
  
   If p < 1300 Then
      num(i) = 0
   Else
      num(i) = 8
   End If
 End If
 
 If check(1) = 4 And check(2) = 1 And check(3) = 1 Then
              p = 0
            
   For m = dis1 To dis2 Step 4
     For n = 0 To 450 Step 4
         clr = Picture1.Point(m, n)
         blue = (clr \ &H10000) Mod &H100
         If blue < 254 Then p = p + 1
     Next n
   Next m
   
   If p < 1010 Then
      num(i) = 2
   Else
      num(i) = 3
   End If
End If


   If check(1) = 3 And check(2) = 1 And check(3) = 1 Then
              p = 0
            
   For m = dis1 To dis2 Step 4
     For n = 0 To 450 Step 4
         clr = Picture1.Point(m, n)
         blue = (clr \ &H10000) Mod &H100
         If blue < 254 Then p = p + 1
     Next n
   Next m
   
   If p < 950 Then
      num(i) = 7
   Else
      num(i) = 4
   End If
End If

 If check(1) = 2 And check(2) = 1 And check(3) = 1 Then num(i) = 1
 If check(1) = 5 And check(2) = 1 And check(3) = 1 Then num(i) = 5
 If check(1) = 5 And check(2) = 1 And check(3) = 2 Then num(i) = 6
 If check(1) = 4 And check(2) = 2 And check(3) = 1 Then num(i) = 9
 
Next i

MsgBox num(0) & num(1) & num(2) & num(3) & num(4) & num(5)

End Sub


Private Sub Timer1_Timer()  ‘更新图片
Picture1.Picture = LoadPicture(".\验证图片\验证码" & Text1.Text & ".gif ")
End Sub

[[it] 本帖最后由 我是菜鸟哦 于 2008-10-13 20:41 编辑 [/it]]

验证码识别.rar (22.79 KB)


未命名.jpg (10.65 KB)
搜索更多相关主题的帖子: 申精 像素 判别 验证 
2008-10-13 19:44
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
这种贴都看完不给顶,又不是我抄袭的

偶是菜鸟鸟偶惧WHO?!!!!
2008-10-15 22:37
abc5566
Rank: 1
等 级:新手上路
帖 子:201
专家分:0
注 册:2007-9-15
得分:0 
顶~~~~~~~~~~~谢谢斑竹............
2008-10-16 00:33
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
得分:0 
路过顶一下,不过如果是有杂点的,或者字体相当飘逸的,或者字符位置不确定的,你能判断出来吗?

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-10-16 14:43
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
具体情况具体分析呗

偶是菜鸟鸟偶惧WHO?!!!!
2008-10-16 19:54
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
我只挑一点错好不?
Dim dis1, dis2, temp, clm As Integer

这里面,定义的 dis1 的类型是什么??
Integer ??

错,是 Variant  类型。

所以不能学C里的写法 int dis1,dis2;
C里前面是类型定义符,后面是变量。
VB里,每个变量必须指定类型,如果没有指定类型的,就全是 Variant

最后,现在的 OS 都是 32位的。integer 是16位的,Long 是32位。
这二种数据类型中,自然是与 OS 字长相同的类型 long 运行速度更快。你们可以去测试。
所以,如果不是内存特别紧张的系统上,个人不推荐使用 integer 变量作为普通变量的类型来使用。
这个,可以测试:
新建一个工程,在窗体拉一个 Command1 ,位置不要顶格。
程序原理,就是执行500*60000 的循环,循环里做一个 加法。计算时间。直接显示在窗体上。integer 的那个怎么都要大一些,虽然这个数据很小,但对于如果是操作密集型的运算来说,这个就有点可观了。

Private Sub Command1_Click()
Dim i1 As Single, i2 As Single
Dim b1 As Integer, b2 As Long
Dim k As Long
Dim m As Long

Me.Cls
    i1 = Timer
For m = 1 To 500
    For b1 = -30000 To 30000
        k = b1 + 1
    Next b1
Next m
    i1 = Timer - i1
   
    i2 = Timer
For m = 1 To 500
    For b2 = -30000 To 30000
        k = b2 + 1
    Next b2
Next m
    i2 = Timer - i2
   
    Me.Print TypeName(b1); "类型用时:"; i1, TypeName(b2); "类型用时:"; i2, "差:"; i1 - i2
   
End Sub

修改了一个代码。
你可以把 b1的定义的类型去掉,然后测试看看时间差和B1的类型,

[[it] 本帖最后由 风吹过b 于 2008-10-16 21:19 编辑 [/it]]
收到的鲜花
  • multiple19022008-10-16 21:22 送鲜花  28朵   附言:我很赞同

授人于鱼,不如授人于渔
早已停用QQ了
2008-10-16 21:15
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
得分:0 
谢谢指教,学习ING

偶是菜鸟鸟偶惧WHO?!!!!
2008-10-17 20:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-238037-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.282520 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved