亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

一個驗證碼識別的代碼

系統 2064 0

字體固定,位置固定,干擾點和字體顏色深度沒有交叉,比如下面的樣例,是我前幾天幫朋友寫投票機刷票時碰到的一個具體案例。

基本就三步,確定特征碼-分割圖片-逐個匹配,代碼很簡單,不超過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);
  

一個驗證碼識別的代碼


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 羞羞视频在线观看视频 | 正在播放国产精品 | 新香蕉视频在线 | 久草福利站 | 国产精品久久久久不卡绿巨人 | 日本wwwsss| 伊人涩| 国产一区二区三区精品久久呦 | 网友自拍视频悠悠在线 | 成人在线免费视频 | 在线免费午夜视频 | 久热爱免费精品视频在线播放 | 国产夜色| 奇米中文字幕 | 欧美视频在线观看一区二区 | 国产h片在线观看 | 亚洲福利影院 | 国产欧美日韩精品a在线观看高清 | 精品国产_亚洲人成在线高清 | 亚洲美女性视频 | 欧美一级爱操视频 | 亚洲国产第一区二区香蕉 | 欧美高清理论片在线观看 | 欧美曰韩免费视频一区 | 国产香蕉一区二区在线观看 | 久久亚洲综合伊人 | 久久欧美久久欧美精品 | 久久人人爽人人爽人人片av不 | 国产日韩欧美自拍 | 日色视频| 91粉色视频在线观看 | 在线视频这里只有精品 | 久久综合99re88久久爱 | 日韩国产欧美精品综合二区 | 91精品一区二区三区久久久久 | 日韩免费高清一级毛片久久 | 琪琪色播 | 看一级大片 | 国产成人精品男人的天堂538 | 久久机热这里只有精品无需 | 精品欧美一区二区在线观看 |