先对各位关注易本地工作室的同学们说声抱歉,这么久没发文了,因为最进在忙于开发手机APP,话说现在一个公司没有个APP在运营,出去都不好意思说是搞互联网的公司。(手动滑稽)
言归正传,今天依然教大家去识别验证码。请看下图:
公式验证码
今天一个小项目遇到这样的验证码,我们可以利用之前教大家的Tesseract识别验证码的方式来处理这样的验证码。因为字体还算比较规整,所以出来起来不算难。这里我们以C#为例,分析此类验证码的识别方式。
首先我们需要对图片进行二值化处理。这里提供给大家自己写的一个算法来处理这类图片。
/// <summary>
/// 对图片进行二值化处理
/// </summary>
/// <param name="oldbitmap">原图</param>
/// <param name="rr">红色阀值</param>
/// <param name="gg">绿色阀值</param>
/// <param name="bb">蓝色阀值</param>
/// <returns>处理后的图片</returns>
public static Bitmap GetImgInColor(Bitmap oldbitmap, int rr, int gg, int bb)
{
if (oldbitmap == null)
{
return null;
}
int Height = oldbitmap.Height;
int Width = oldbitmap.Width;
Bitmap newbitmap = new Bitmap(Width-10, Height);
Color pixel;
for (int y = 0; y < Height; y++)
{
for (int x =0; x < Width-10; x++)
{
int r, g, b;
pixel = oldbitmap.GetPixel(x+5, y);
r = pixel.R;
g = pixel.G;
b = pixel.B;
if (r >= rr && g >= gg && b >= bb)
{
newbitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
}
else
{
newbitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
}
}
}
return newbitmap;
}
对于此次的图片,我们的参数设置为90,10,40为最佳(这个值大家可以用这个算法写个公式,改变不同的输入值查看输出效果。能获取到完整的黑白字符为准)。
处理后的效果如下图:
这样我们直接用Tesseract进行识别。这里要注意对Tesseract进行初始化的时候,设置白名单字符为“0123456789+-*/=?”就可以了,因为这些公式中只可能有这些字符。这样可以提高识别率。
Tesseract.TesseractEngine te = new TesseractEngine(Application.StartupPath + "\\tessdata", "eng", EngineMode.Default);
te.SetVariable("tessedit_char_whitelist", "0123456789+-*/=?");
te.DefaultPageSegMode = PageSegMode.SingleLine;
进行识别操作:
Page PG = te.Process(PixConverter.ToPix(bChapcha), PageSegMode.SingleLine);//bChapcha为处理后的图片。
string sVailCode = KeyReplace(PG.GetText());
PG.Dispose();
得到识别结果:1+7=?这时候我们只需要通过程序计算这个公式的结果就可以了。我们首先用正则表达式(.+?)=获取该题的计算部分,也就是等号前面的部分,后面的不管啦,如果没有识别出等于号。基本上就是这个图片识别失败,正则获取结果为空,这样的结果我们直接重新下载再处理就可以了。
获取公式部分后我们可以直接用算法计算出结果:
try
{
DataTable table = new DataTable();
sVailCode = table.Compute(sVailCode, "").ToString();
}
catch
{
sVailCode = "";
}
这里利用的DataTable自带的算式计算功能,简单方便。得到的结果为8,提交给服务器,验证码通过。这种验证码就形同虚设了。
部分关键代码
好了,今天就教大家这些,如果觉得文章不错,还请收藏分享,因为您的支持这是小编活着的动力来源。