一个验证码识别的代码

字体固定,位置固定,干扰点和字体颜色深度没有交叉,比如下面的样例,是我前几天帮朋友写投票机刷票时碰到的一个具体案例。


基本就三步,确定特征码-分割图片-逐个匹配,代码很简单,不超过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);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索1
, int
, static
, return
, number
, true
, num
, jboss7 1 1
, servlet3 1
, etbeans7 1
, 1 1
, ispermitted()-1
, 1:1
javawebmyeclipse1...
java验证码识别代码、验证码识别代码、python识别验证码代码、qq验证码识别代码、12306验证码识别,以便于您获取更多的相关知识。

时间: 2024-08-02 18:11:34

一个验证码识别的代码的相关文章

验证码识别,发票编号识别(转)

   毕业设计做了一个简单的研究下验证码识别的问题,并没有深入的研究,设计图形图像的东西,水很深,神经网络,机器学习,都很难.这次只是在传统的方式下分析了一次. 今年工作之后再也没有整理过,前几天一个家伙要这个demo看下,我把一堆东西收集,打包给他了,他闲太乱了,我就整理记录下.这也是大学最后的一次作业,里面有很多记忆和怀念. 这个demo的初衷不是去识别验证码,是把验证的图像处理方式用到其他方面,车票,票据等. 这里最后做了一个发票编号识别的的案例: 地址:http://v.youku.co

php制作的简单验证码识别代码_php实例

一直想写这个,过了很久今天兴趣来了索性记录下. 验证码 全自动区分计算机和人类的公开图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序.在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答.这个问题可以由计算机生成并评判,但是必须只有人类才能解答.由于计算机无法解答CAPTCHA的问题,

新手刚来,想求一个免费的或者便宜的(100块以下)通用验证码识别控件。。

问题描述 刚来没什么分,见谅...求一个能下的免费通用验证码识别控件,只要能识别些很简单的就行,或者低价买个便宜的..谢谢,给几个链接.. 解决方案 解决方案二:简单的就是黑白的,那你自己应该可以做的,对BMP图片按像素进行数字编码,黑点0,白点1,这样把自己生成的和程序生成的比对即可.

车牌识别及验证码识别的一般思路

本文源自我之前花了2天时间做的一个简单的车牌识别系统.那个项目,时间太紧,样本也有限,达不到对方要求的95%识别率(主要对于车牌来说,D,0,O,I,1等等太相似了.然后,汉字的识别难度也不小),因此未被对方接受.在此放出,同时描述一下思路及算法. 全文分两部分,第一部分讲车牌识别及普通验证码这一类识别的普通方法,第二部分讲对类似QQ验证码,Gmail验证码这一类变态验证码的识别方法和思路. 一.车牌/验证码识别的普通方法 车牌.验证码识别的普通方法为: (1)将图片灰度化与二值化 (2)去噪,

爬虫 在网页定位验证码,然后显示出来,手动输入验证码,求代码

问题描述 爬虫 在网页定位验证码,然后显示出来,手动输入验证码,求代码 爬虫,在网页定位验证码,然后不管在哪里显示出来都行,然后手动输入验证码,继续爬,不需要登录,但是需要搜索功能,跪求完整代码,可以想象爬有验证码的百度. 解决方案 - 我已经搞定了,直接复制图片链接, 放在img的src里 然后写个输入框 post一起提交过去 解决方案二: 以下是部分python代码: #!usr/bin/env python#-*- coding: utf-8 -*-import osimport urll

轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能

       这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了,并且得到了不小的关注,有25颗star,被fork了38次.有了大家的鼓励,工具类一直也在完善中.最近比较忙,两个多月前的修改在今天刚修改测试完成,今天再次分享给大家.        验证码识别这项技术并不是本工具类的功能,而是通过一个开源的api来识别验证码的.这里做了一个简单的封装,主要是用来解决登陆时的验证码的问题.在线验证码识别官网:http://lab.ocrking.com/,github地址

Python验证码识别处理实例(转)

一.准备工作与代码实例 1.PIL.pytesser.tesseract (1)安装PIL:下载地址:http://www.pythonware.com/products/pil/(CSDN下载) 下载后是一个exe,直接双击安装,它会自动安装到C:\Python27\Lib\site-packages中去, (2)pytesser:下载地址:http://code.google.com/p/pytesser/,(CSDN下载) 下载解压后直接放C:\Python27\Lib\site-pack

C# 验证码识别基础方法及源码

原文:C# 验证码识别基础方法及源码 先说说写这个的背景 最近有朋友在搞一个东西,已经做的挺不错了,最后想再完美一点,于是乎就提议把这种验证码给K.O.了,于是乎就K.O.了这个验证码.达到单个图片识别时间小于200ms,500个样本人工统计正确率为95%.由于本人没有相关经验,是摸着石头过河.本着经验分享的精神,分享一下整个分析的思路.在各位大神面前献丑了. 再看看部分识别结果   是不是看着很眼熟? 处理第一步 去背景噪音和二值化 对于这一块,考虑了几种方法. 方法一:统计图片颜色分布,颜色

jsp中如何判断文本框输入的和图片上的验证码一致,代码如下:

问题描述 jsp中如何判断文本框输入的和图片上的验证码一致,代码如下: var aa=$("#vadCode").val(); alert(aa); 这里获取图片上的验证码为空,请问该如何获取 解决方案 你在生成验证码图片的同时,把图片上的验证码放到input框里不就可以取值了吗? 解决方案二: 验证码 是先用 验证码生成器生成一个随机的6位数字,然后在将这6个数字生成一张图片的,你直接获得肯定是不对的 解决方案三: 你要用ajax发送输入的aa到服务器端和用session存储的验证码