[转载]C#联通新版验证码识别的实现 - 幸福海 - 博客园

[转载]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

–幸福海

博客地址:http://www.cnblogs.com/ningqhai/

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册