字体固定,位置固定,干扰点和字体颜色深度没有交叉,比如下面的样例,是我前几天帮朋友写投票机刷票时碰到的一个具体案例。
基本就三步,确定特征码-分割图片-逐个匹配,代码很简单,不超过100行
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace BmpNumber
{
class Number
{
//数字特征库
static int[,] _num0 = new int[7, 10] { { 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 0, 0, 0, 0, 0, 0, 1, 1 },
{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 } };
static int[,] _num1 = new int[7, 10] { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
static int[,] _num2 = new int[7, 10] { { 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, { 0, 1, 1, 1, 0, 0, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, { 1, 1, 0, 0, 0, 1, 1, 0, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }, { 0, 1, 1, 1, 0, 0, 0, 0, 1, 1 } };
static int[,] _num3 = new int[7, 10] { { 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, { 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 },
{ 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 1 },
{ 1, 1, 0, 0, 1, 0, 0, 0, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 0, 1, 1, 1, 0, 0 } };
static int[,] _num4 = new int[7, 10] { { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 1, 0, 1, 1, 0, 0 }, { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 } };
static int[,] _num5 = new int[7, 10] { { 0, 0, 0, 1, 1, 1, 0, 1, 1, 0 }, { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }, { 1, 1, 0, 1, 1, 0, 0, 0, 1, 1 },
{ 1, 1, 0, 1, 1, 0, 0, 0, 1, 1 }, { 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 }, { 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 } };
static int[,] _num6 = new int[7, 10] { { 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 1, 1, 1, 0, 1, 1, 0, 0, 1, 1 }, { 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }, { 0, 1, 1, 0, 0, 1, 1, 1, 1, 0 } };
static int[,] _num7 = new int[7, 10] { { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 }, { 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 }, { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 } };
static int[,] _num8 = new int[7, 10] { { 0, 1, 1, 1, 0, 0, 1, 1, 1, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 0, 1, 1, 1, 0, 0, 1, 1, 1, 0 } };
static int[,] _num9 = new int[7, 10] { { 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 }, { 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, { 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
{ 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 0, 0 } };
static private int[,] getNum(Bitmap bmp, int index)
{
//分割图片
int[,] _num = new int[7, 10];
for (int i = index * 10 + 2; i < index * 10 + 9; i++)
{
for (int j = 6; j < 16; j++)
{
Color c = bmp.GetPixel(i, j);
if (c.R < 100)
{
_num[i - 2 - index * 10, j - 6] = 1;
}
}
}
return _num;
}
static private int CheckNumber(int[,] number)
{
if (CheckNumber(_num0, number) == true) return 0;
if (CheckNumber(_num1, number) == true) return 1;
if (CheckNumber(_num2, number) == true) return 2;
if (CheckNumber(_num3, number) == true) return 3;
if (CheckNumber(_num4, number) == true) return 4;
if (CheckNumber(_num5, number) == true) return 5;
if (CheckNumber(_num6, number) == true) return 6;
if (CheckNumber(_num7, number) == true) return 7;
if (CheckNumber(_num8, number) == true) return 8;
if (CheckNumber(_num9, number) == true) return 9;
return 6;
}
static private bool CheckNumber(int[,] dic, int[,] number)
{
//逐个匹配
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 10; j++)
{
if (dic[i, j] == 1 && number[i, j] != 1)
{
return false;
}
}
}
return true;
}
static public string getNumber(Bitmap bmp)
{
//调用
string str = "";
for (int i = 0; i <= 3; i++)
{
int[,] number = getNum(bmp, i);
int m = CheckNumber(number);
str += m.ToString();
}
return str;
}
}
}
用以下代码调用就可以看到输出结果为9637了,这个识别代码没有用到任何高级算法,所以也只能识别初级的验证码,但是对特征库扩展之后也可以识别出规范的字母。
System.Net.WebClient wb = new System.Net.WebClient();
byte[] b=wb.DownloadData("http://p.blog.csdn.net/images/p_blog_csdn_net/jinjazz/355056/o_rrr.bmp");
System.IO.MemoryStream ms=new System.IO.MemoryStream(b);
System.Drawing.Bitmap bmp = new Bitmap(ms);
string str = BmpNumber.Number.getNumber(bmp);
Console.WriteLine(str);
分享到:
相关推荐
在这个场景中,我们有一个简单的验证码识别代码,可能是用VC++编写的,这是一个非常基础且广泛使用的编程语言,尤其在Windows平台下开发桌面应用程序。 验证码识别通常包括以下几个关键步骤: 1. **图像预处理**:...
本文将深入探讨一个基于C#的验证码识别代码示例,该示例适用于VS2012开发环境。我们将讨论验证码识别的基本原理、涉及到的技术以及如何通过提供的代码进行理解和应用。 验证码(CAPTCHA)是一种用于防止机器自动...
易语言验证码识别代码,可以识别99%的验证码
只要你有一定的c#编程基础,只要半天时间仔细阅读这份代码,你就可以从完全不懂验证码识别的菜鸟变成一个能破解一些傻瓜验证码的高手。 希望尊重他人劳动成果,不要上传此代码到别的地方。谢谢!
VB6.0编写通达信股票交易软件验证码识别源代码,利用它可实现自动登陆交易软件,扩展自动交易系统。
首先,图像分割是验证码识别的第一步,它的目标是将含有文字的图像区域与背景分离,以便后续的字符识别。在处理汉字验证码时,由于汉字形状多样,可能与其他图像元素混合,因此需要精确的分割算法。常见的方法包括...
验证码识别技术是信息安全领域中的一个重要组成部分,主要用于防止自动化的机器人或恶意软件进行非法操作,如批量注册、恶意登录等。中文验证码识别则是针对含有中文字符的验证码进行解析,增加了识别难度,因为汉字...
总之,这个项目为我们提供了一个深入理解验证码识别和C#编程实践的机会,同时也展示了如何将图像处理和机器学习技术应用于实际问题中。对于想要提升这方面技能的开发者,这是一个很好的学习资源。
在给定的"ReCapcha-master"文件中,我们可以推断这可能是针对谷歌的reCAPTCHA验证码识别的一个项目。reCAPTCHA是一种高级验证码系统,它利用人类用户的输入来帮助验证大量网络内容,同时也防止了机器人滥用。 实现...
易语言验证码识别源码是一种用易语言编程实现的...对于想要学习易语言或者验证码识别技术的开发者来说,这是一个很好的实践案例。通过阅读和理解源码,可以深入掌握相关知识,并可能进一步改进和优化算法,提高识别率。
车牌识别与验证码识别是计算机视觉领域中的两个重要子领域,它们在智能交通、安防监控、自动支付等场景中发挥着关键作用。 车牌识别(Vehicle License Plate Recognition,简称VLPR)是一项利用图像处理技术来自动...
7. **主函数**:描述中提到的main函数可能包含两个方法,一个是生成验证码的地址,另一个是执行验证码识别的过程。生成验证码地址的部分可能涉及到随机生成字符组合,并将其转化为图像。 在实际应用中,验证码识别...
总之,这个VB6验证码识别代码是一个实用工具,可以帮助开发者在特定场景下快速处理验证码识别问题。不过,对于更高级的安全需求,可能需要考虑使用更新的技术栈,如Python的OpenCV和Tesseract等库,或者利用深度学习...
在实际项目中,"OCRDEMO"可能是一个包含示例代码和库的压缩包,提供了用于演示验证码识别的C#实现。使用者可以在此基础上进行定制和改进,以适应特定场景的需求,例如识别特定格式的验证码或者提高识别速度。 总的...
总的来说,验证码识别是深度学习在计算机视觉领域的一个重要应用,通过结合卷积和循环神经网络,我们可以构建出强大的模型,有效地应对各种复杂的验证码。这个项目提供了实践这一技术的机会,对于深入理解和应用神经...
本文档基于一位开发者早期编写的验证码识别代码,通过一系列步骤介绍了如何实现简单的验证码识别过程。尽管作者自评其代码质量不佳,但对于初学者而言仍具有一定的参考价值。 #### 二、验证码识别流程概述 验证码...
总的来说,这个压缩包中的源代码可能是实现了一个简单的验证码识别系统,涉及到了图像处理、网络通信、控件编程等多个方面的知识。通过深入理解和学习这些代码,可以掌握验证码识别的基本原理和技术。
总的来说,这个C#验证码识别示例为初学者提供了一个了解图像处理和机器学习在实际问题中应用的基础平台。然而,实际的验证码识别系统通常需要更复杂的图像处理算法和更强大的机器学习模型,以及对各种验证码类型的...
验证码识别程序源代码是计算机视觉领域的一个重要应用,主要用于自动化处理网页或应用中的图形验证码。在本案例中,提供的源代码包含了解析和识别验证码的算法,以及脚本化的运行机制,这使得用户能够直接运行并测试...
以下是一个简化的C# OCR验证码识别流程示例: 1. 导入必要的库,如AForge.NET和Tesseract OCR。 2. 读取验证码图片并进行预处理(例如,使用AForge.NET的ImageFilters类进行灰度化和二值化)。 3. 使用图像处理技术...