If Abs(nCount_Middle - Number_Count_Middle(j)) > 6 Then Total
= Total + Abs(nCount_Middle - Number_Count_Middle(j)) * 2 Else _
Total = Total + Abs(nCount_Middle - Number_Count_Middle(j))
If Abs(nCount_Down - Number_Count_Down(j)) > 6 Then Total = Total +
Abs(nCount_Down - Number_Count_Down(j)) * 2 Else _
Total = Total + Abs(nCount_Down - Number_Count_Down(j))
If Abs(nCount_Left - Number_Count_Left(j)) > 6 Then Total = Total +
Abs(nCount_Left - Number_Count_Left(j)) Else _
Total = Total + Abs(nCount_Left -
Number_Count_Left(j)) * 0.5
If Abs(nCount_Right - Number_Count_Right(j)) > 6 Then Total = Total
+ Abs(nCount_Right - Number_Count_Right(j)) Else _
Total = Total + Abs(nCount_Right - Number_Count_Right(j)) * 0.5
If Total < MinVal Then
MinVal = Total
Result(i) = j
'MsgBox MinVal & " " & j
End If
Next
Next i
LblResult.Caption = "识别结果:" & Result(0) & Result(1) & Result(2) &
Result(3)
End Sub
上述代码中,变量 Total 用于统计总的差异值。在某个区域内,如果差异值大于 6,
那么它需要乘以2再加到Total上,这样是为了扩大差异。当一个区域中的差异特别大时候,
那么我们基本可以排除这个数字,于是将差异扩大。
另外值得注意的是,上、中、下三部分的参数是 100%,而左、右两侧的参数是 50%。
产生倾斜后,上中下的可信度没有发生太大改变,但是左右的可信度已经降低,于是人工置
50%。
窗体载入时,我们把Settings.ini中的数据读入全局变量中,避免识别时再次进行文
件读写操作。
Option Explicit
'声明两个数组,保存统计的像素点
Dim Number_Count_Up(0 To 9) As Integer
Dim Number_Count_Middle(0 To 9) As Integer
Dim Number_Count_Down(0 To 9) As Integer
Dim Number_Count_Left(0 To 9) As Integer
Dim Number_Count_Right(0 To 9) As Integer
Private Sub Form_Load()
'Picture1中默认已装载一张验证码
Picture1.AutoRedraw = True
Picture2.AutoRedraw = True
'读入每个数字的深色像素点统计个数
Dim i As Integer
For i = 0 To 9
Number_Count_Up(i) = GetValueFromIni(App.Path & "\Settings.ini",
"Count", "Number" & i & "_Up")
Number_Count_Middle(i) = GetValueFromIni(App.Path &
"\Settings.ini", "Count", "Number" & i & "_Middle")
Number_Count_Down(i) = GetValueFromIni(App.Path & "\Settings.ini",
"Count", "Number" & i & "_Down")
Number_Count_Left(i) = GetValueFromIni(App.Path & "\Settings.ini",
"Count", "Number" & i & "_Left")
Number_Count_Right(i) = GetValueFromIni(App.Path & "\Settings.ini",
"Count", "Number" & i & "_Right")
Next
End Sub
到此代码编写结束,运行示例程序,如图4所示:

本文介绍了识别倾斜验证码的一种简单方法:分区块统计像素点个数。采用此方法可以
很容易识别区块差异很大的数字,例如:7,1,4。但程序对0,6,8,9等数字的识别成功
率却不高。
以后我们将讨论采取更多方法识别倾斜验证码,以提高识别的成功率。 |