[转载]C#联通新版验证码识别的实现 – 幸福海 – 博客园.
以前写了篇 联通充值卡自动充值的实现,最近发现联通官网改版了,随便看了下发现新版的验证码和以前的不同,发了点时间研究了下他的识别码,它现在的验证码如下
现在将识别步骤说下
1,转换灰度图片
2,清除2px的边框
3,分割验证码个数 (4)
4,生成字模库
经过以上步骤,可以得到下面这个效果
下面为部分实现代码
<span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > </span><span class = "typ" >GetCheckString</span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >UnCodebase</span><span class = "pln" > ud </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >UnCodebase</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "typ" >GrayByPixels</span><span class = "pun" >();</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "typ" >ClearPicBorder</span><span class = "pun" >(</span><span class = "lit" >2</span><span class = "pun" >);</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "typ" >CutMap</span><span class = "pun" >(</span><span class = "lit" >14</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >15</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >);</span><span class = "pln" > bitmap </span><span class = "pun" >=</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "pln" >bmpobj</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > // bitmap = ud.ClearNoise(128, 1);</span><span class="pln"> </span><span class = "typ" >String</span><span class = "pln" > chkcode </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pun" >[]</span><span class = "pln" > arrmap </span><span class = "pun" >=</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "typ" >SplitImg</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >4</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >1</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > foreach </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > item </span><span class = "kwd" > in </span><span class = "pln" > arrmap</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > str </span><span class = "pun" >=</span><span class = "pln" > ud</span><span class = "pun" >.</span><span class = "typ" >GetCodebybitmap</span><span class = "pun" >(</span><span class = "pln" >item</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" >128</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Boolean</span><span class = "pln" > isEques </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > false </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > foreach </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > strss </span><span class = "kwd" > in </span><span class = "pln" > code</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pun" >[]</span><span class = "pln" > a </span><span class = "pun" >=</span><span class = "pln" > strss</span><span class = "pun" >.</span><span class = "typ" >Split</span><span class = "pun" >(</span><span class = "str" > ':' </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >str </span><span class = "pun" >==</span><span class = "pln" > a</span><span class = "pun" >[</span><span class = "lit" >1</span><span class = "pun" >])</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > chkcode </span><span class = "pun" >+=</span><span class = "pln" > a</span><span class = "pun" >[</span><span class = "lit" >0</span><span class = "pun" >];</span><span class = "pln" > isEques </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > true </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > break </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(!</span><span class = "pln" >isEques</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > strCurrent </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "str" > "" </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > double </span><span class = "pln" > max </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0.0</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > foreach </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > strss </span><span class = "kwd" > in </span><span class = "pln" > code</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > len1</span><span class = "pun" >,</span><span class = "pln" > len2</span><span class = "pun" >,</span><span class = "pln" > min</span><span class = "pun" >,</span><span class = "pln" > count </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pun" >[]</span><span class = "pln" > a </span><span class = "pun" >=</span><span class = "pln" > strss</span><span class = "pun" >.</span><span class = "typ" >Split</span><span class = "pun" >(</span><span class = "str" > ':' </span><span class = "pun" >);</span><span class = "pln" > len1 </span><span class = "pun" >=</span><span class = "pln" > a</span><span class = "pun" >[</span><span class = "lit" >1</span><span class = "pun" >].</span><span class = "typ" >Length</span><span class = "pun" >;</span><span class = "pln" > len2 </span><span class = "pun" >=</span><span class = "pln" > str</span><span class = "pun" >.</span><span class = "typ" >Length</span><span class = "pun" >;</span><span class = "pln" > min </span><span class = "pun" >=</span><span class = "pln" > len1</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >min </span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > len2</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > min </span><span class = "pun" >=</span><span class = "pln" > len2</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > i </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" >0</span><span class = "pun" >;</span><span class = "pln" > i </span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "pln" > min</span><span class = "pun" >;</span><span class = "pln" > i</span><span class = "pun" >++)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >str</span><span class = "pun" >[</span><span class = "pln" >i</span><span class = "pun" >]</span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > a</span><span class = "pun" >[</span><span class = "lit" >1</span><span class = "pun" >][</span><span class = "pln" >i</span><span class = "pun" >])</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > count</span><span class = "pun" >++;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > double </span><span class = "pln" > currrent </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >count </span><span class = "pun" >*</span><span class = "pln" > </span><span class = "lit" >100.0</span><span class = "pln" > </span><span class = "pun" >/</span><span class = "pln" > min</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >max </span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "pln" > currrent</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > max </span><span class = "pun" >=</span><span class = "pln" > currrent</span><span class = "pun" >;</span><span class = "pln" > strCurrent </span><span class = "pun" >=</span><span class = "pln" > a</span><span class = "pun" >[</span><span class = "lit" >0</span><span class = "pun" >].</span><span class = "typ" >Trim</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > chkcode </span><span class = "pun" >+=</span><span class = "pln" > strCurrent</span><span class = "pun" >.</span><span class = "typ" >Trim</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > chkcode</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span> |
通过这些处理后,识别成功率在90+%以上,
下面附上测试地址,代码 100%C#实现,方便ASP.NET调用,如果是C/C++实现 ASP.NET 调非托管的有些麻烦,非得放到System32 或是一个绝对路径下麻烦
测试地址
http://www.fox163.com/UniconTest.aspx
–幸福海