C 識別簡單的驗證碼 下)

2021-07-04 15:16:57 字數 2836 閱讀 6050

在這一篇中將講驗證碼識別,也就是我們要實現自動化處理的部分。有了前面的知識,這一部分將會變得很容易,下面先說下具體的流程,如下圖所示:

1. 將樣本庫載入到記憶體

首先需要再回顧下樣本庫的格式,如下:

}

上面的**又定義了兩個新的類,codelist類和database類。codelist是由一系列codestruct所組成,這些codestruct擁有共同的字元。而database是由長度為36的字元陣列所構成。36代表字元的個數,這些字元的定義如下: 

public static readonly string charactertable =

;

實際上在驗證碼生成的過程中,數字0和字母o由於太過接近,無法區分,這兩個字元都不會出現在驗證碼中。

2. 字元匹配

/// /// to improve the effcience, add a colomn threshold, 

/// if one colomn is small than this threshold, return 0

///

///

///

///

///

public static double matchtwocodes(ulong code1, ulong code2)

return 1.0 - count / total;

}

從上面的**可以看到,字元匹配其實就是對字元掃瞄所生成的碼陣列進行匹配,這裡預設兩個碼陣列有相同的長度,也就是在影象中為相同的寬度。匹配就是對兩個陣列中的碼(ulong型別)做異或運算。異或運算的規則是相同為0,相反為1.因此可以統計異或運算結果中1的個數,就可以得到不匹配的畫素個數了。這裡統計1的個數採用下面的方法,執行效率比較高。

/// /// swift aglorthim

///

/// 這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。

/// 如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。

/// 其原理是不斷清除n的二進位制表示中最右邊的1,同時累加計數器,直至n為0

///

/// 舉個例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),

/// 清除了8最右邊的1(其實就是最高位的1,因為8的二進位制中只有乙個1)。

/// 再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),

/// 清除了7的二進位制表示中最右邊的1

///

///

///

public static int bitcount(ulong n)

return c ;

}

另外給出一種常規的方法,以作比較:

/// /// 任意給定乙個32位無符號整數n,求n的二進位制表示中1的個數,

/// 比如n = 5(0101)時,返回2,n = 15(1111)時,返回4

///

///

///

public static int bitcount(uint n)

return c ;

}

3. 總體流程

private void button16_click(object sender, eventargs e)

if (matchrate >= tools.matchratethreshold_perfectmatch) // 0.99}}

}temp.dispose();

}bm.dispose();

// 對匹配結果進行刪減

listresultlist = tools.sorthashtable(table);

if (resultlist.count == 4)

else

messagebox.show("couldn't match!!!");}}

注意到在上面的**中定義了乙個hashtable用來儲存匹配結果大於閾值(0.95)的結果。而如果匹配率大於0.99,則認為是完美匹配,立刻結束迴圈,這樣可以提高程式執行效率。這個hashtable的鍵和值分別為中字元左邊界的列數和匹配的結果。這麼做是因為這裡閾值不能太過嚴格,否則會有很多字元無法與樣本庫匹配。而如果閾值不高,就會有多個結果滿足條件。我們需要對匹配的結果進行進一步的刪減。刪減的原理為如果下乙個匹配結果的列數遇上乙個相差10以上,就認為是下乙個字元,否則認為是同乙個字元。

public static listsorthashtable(hashtable ht)

}return rtn;

}

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

C 下的驗證碼識別

引言 演算法分析 驗證碼識別原理及 演示 for int i 0 i bmpobj.height i 遍歷高度 灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將...

C 下的驗證碼識別

轉 引言 演算法分析 驗證碼識別原理及 演示 c sharp view plain copy print?灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2...