亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

使用C#的aforge類庫識別驗(yàn)證碼實(shí)例

2020-01-24 02:31:11
字體:
供稿:網(wǎng)友

時(shí)間過得真快啊,轉(zhuǎn)眼今年就要過去了,大半年都沒有寫博客了,要說時(shí)間嘛,花在泡妹子和搞英語去了,哈哈。。。前幾天老大問我

怎么這么長時(shí)間都沒寫博客了,好吧,繼續(xù)堅(jiān)持,繼續(xù)分享我的心得體會。

  這個(gè)系列我們玩玩aforge.net,套用官方都話就是一個(gè)專門為開發(fā)者和研究者基于C#框架設(shè)計(jì)的,這個(gè)框架提供了不同的類庫和關(guān)于類庫的

資源,還有很多應(yīng)用程序例子,包括計(jì)算機(jī)視覺與人工智能,圖像處理,神經(jīng)網(wǎng)絡(luò),遺傳算法,機(jī)器學(xué)習(xí),機(jī)器人等領(lǐng)域,這個(gè)系列研究的重點(diǎn)

就是瞎幾把搞下AForge.Imaging這個(gè)命名空間下面的東東,下載網(wǎng)址:http://www.aforgenet.com/framework/downloads.html

    對了,不知道有多少公司是用得仕卡作為員工的福利卡,我們公司就是這樣的,每個(gè)月公司都會充值一些money,然后我們這些屁碼農(nóng)每個(gè)月15號就都開心的去看看發(fā)了多少。

上去看了后,喲呵~ 還有個(gè)90年代的驗(yàn)證碼,我想這年頭估計(jì)找到這樣驗(yàn)證碼的網(wǎng)站已經(jīng)不多了,如果懂一點(diǎn)圖像處理都話,這張驗(yàn)證碼

跟沒有一個(gè)樣,謝謝。。。這篇我們看看怎么去識別它。

一: 驗(yàn)證碼處理

1.  一般處理原則

    這種驗(yàn)證碼為什么說跟沒有一樣,第一點(diǎn):字體規(guī)范工整,第二點(diǎn):不旋轉(zhuǎn)扭曲粘連,第三點(diǎn):字體顏色單一,下面看處理步驟。

這里要注意的是,aforge只接受像素格式為24/32bpp的像素格式圖片,所以處理前,先進(jìn)行格式轉(zhuǎn)化。

復(fù)制代碼 代碼如下:

//轉(zhuǎn)化圖片像素格式
            var bnew = new Bitmap(b.Width, b.Height, PixelFormat.Format24bppRgb);

            Graphics g = Graphics.FromImage(bnew);

            g.DrawImage(b, 0, 0);

            g.Dispose();

<1>圖片灰度化

這是圖像識別通常都要走的第一步,圖片灰度化有助于減少后續(xù)對rgb的計(jì)算量,同時(shí)也方便我們進(jìn)行二值化,在aforge中我們有專門的類一步搞定,簡潔方便。

復(fù)制代碼 代碼如下:

            //灰度化
            b = new Grayscale(0.2125, 0.7154, 0.0721).Apply(b);

<2>二值化

  二值化顧名思義就是二種值,比如非白即黑,非黑即白,那么白和黑的標(biāo)準(zhǔn)就需要提供一個(gè)閾值,大于或者小于怎么樣,在aforge同樣也有相似的類進(jìn)行處理

復(fù)制代碼 代碼如下:

            //二值化
            b = new Threshold(50).Apply(b);

<3> 去噪點(diǎn)

  從上面的圖片可以發(fā)現(xiàn)有很多紅點(diǎn)點(diǎn),搞得像皮膚病一樣,仔細(xì)觀察可以看到這種噪點(diǎn)具有獨(dú)立,體積小的特征,所以判斷的標(biāo)準(zhǔn)就是如果圖中某個(gè)區(qū)塊的大小在我設(shè)置的閾值內(nèi),就將其去掉,同樣也有專門的類進(jìn)行處理。

復(fù)制代碼 代碼如下:

            //去噪點(diǎn)
            new BlobsFiltering(1, 1, b.Width, b.Height).Apply(b);

  這里具體怎么傳遞參數(shù),后續(xù)系列會慢慢解讀。

<4>切割圖片

   切圖片的好處在于我們需要知道真正要識別的元素的有效范圍是多大,同時(shí)也方便我們將這些圖片作為模板保存下來。

代碼如下:

復(fù)制代碼 代碼如下:

/// <summary>
        /// 按照 Y 軸線 切割
        /// (丟棄等于號)
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public List<Bitmap> Crop_Y(Bitmap b)
        {
            var list = new List<Bitmap>();

            //統(tǒng)計(jì)每一列的“1”的個(gè)數(shù),方便切除
            int[] cols = new int[b.Width];

            /*
             *  縱向切割
             */
            for (int x = 0; x < b.Width; x++)
            {
                for (int y = 0; y < b.Height; y++)
                {
                    //獲取當(dāng)前像素點(diǎn)像素
                    var pixel = b.GetPixel(x, y);

                    //說明是黑色點(diǎn)
                    if (pixel.R == 0)
                    {
                        cols[x] = ++cols[x];
                    }
                }
            }

            int left = 0, right = 0;

            for (int i = 0; i < cols.Length; i++)
            {
                //說明該列有像素值(為了防止像素干擾,去噪后出現(xiàn)空白的問題,所以多判斷一下,防止切割成多個(gè))
                if (cols[i] > 0 || (i + 1 < cols.Length && cols[i + 1] > 0))
                {
                    if (left == 0)
                    {
                        //切下來圖片的橫坐標(biāo)left
                        left = i;
                    }
                    else
                    {
                        //切下來圖片的橫坐標(biāo)right
                        right = i;
                    }
                }
                else
                {
                    //說明已經(jīng)有切割圖了,下面我們進(jìn)行切割處理
                    if ((left > 0 || right > 0))
                    {
                        Crop corp = new Crop(new Rectangle(left, 0, right - left + 1, b.Height));

                        var small = corp.Apply(b);

                        //居中,將圖片放在20*50的像素里面

                        list.Add(small);
                    }

                    left = right = 0;
                }
            }

            return list;
        }

        /// <summary>
        /// 按照 X 軸線 切割
        /// </summary>
        /// <param name="b"></param>
        /// <returns></returns>
        public List<Bitmap> Crop_X(List<Bitmap> list)
        {
            var corplist = new List<Bitmap>();

            //再對分割的圖進(jìn)行上下切割,取出上下的白邊
            foreach (var segb in list)
            {
                //統(tǒng)計(jì)每一行的“1”的個(gè)數(shù),方便切除
                int[] rows = new int[segb.Height];

                /*
                 *  橫向切割
                 */
                for (int y = 0; y < segb.Height; y++)
                {
                    for (int x = 0; x < segb.Width; x++)
                    {
                        //獲取當(dāng)前像素點(diǎn)像素
                        var pixel = segb.GetPixel(x, y);

                        //說明是黑色點(diǎn)
                        if (pixel.R == 0)
                        {
                            rows[y] = ++rows[y];
                        }
                    }
                }

                int bottom = 0, top = 0;

                for (int y = 0; y < rows.Length; y++)
                {
                    //說明該行有像素值(為了防止像素干擾,去噪后出現(xiàn)空白的問題,所以多判斷一下,防止切割成多個(gè))
                    if (rows[y] > 0 || (y + 1 < rows.Length && rows[y + 1] > 0))
                    {
                        if (top == 0)
                        {
                            //切下來圖片的top坐標(biāo)
                            top = y;
                        }
                        else
                        {
                            //切下來圖片的bottom坐標(biāo)
                            bottom = y;
                        }
                    }
                    else
                    {
                        //說明已經(jīng)有切割圖了,下面我們進(jìn)行切割處理
                        if ((top > 0 || bottom > 0) && bottom - top > 0)
                        {
                            Crop corp = new Crop(new Rectangle(0, top, segb.Width, bottom - top + 1));

                            var small = corp.Apply(segb);

                            corplist.Add(small);
                        }

                        top = bottom = 0;
                    }
                }
            }

            return corplist;
        }

<5> 圖片精處理

  這里要注意的是,比如數(shù)字“2”,切除上下左右的空白后,再加上噪點(diǎn)的干擾,不一定每次切下來的圖片大小都一樣,所以這里為了方便更好的識別,我們需要重置下圖片的大小,并且將“數(shù)字2”進(jìn)行文字居中。

復(fù)制代碼 代碼如下:

/// <summary>
        /// 重置圖片的指定大小并且居中
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public List<Bitmap> ToResizeAndCenterIt(List<Bitmap> list, int w = 20, int h = 20)
        {
            List<Bitmap> resizeList = new List<Bitmap>();


            for (int i = 0; i < list.Count; i++)
            {
                //反轉(zhuǎn)一下圖片
                list[i] = new Invert().Apply(list[i]);

                int sw = list[i].Width;
                int sh = list[i].Height;

                Crop corpFilter = new Crop(new Rectangle(0, 0, w, h));

                list[i] = corpFilter.Apply(list[i]);

                //再反轉(zhuǎn)回去
                list[i] = new Invert().Apply(list[i]);

                //計(jì)算中心位置
                int centerX = (w - sw) / 2;
                int centerY = (h - sh) / 2;

                list[i] = new CanvasMove(new IntPoint(centerX, centerY), Color.White).Apply(list[i]);

                resizeList.Add(list[i]);
            }

            return resizeList;
        }

其實(shí)精處理后,這些圖片就可以作為我們的模板庫的圖片了,可以將每張模板圖都標(biāo)記下具體的數(shù)字,后續(xù)我們再遇到時(shí),計(jì)算下其相似度就可以了,下面就是已經(jīng)制作好的模板。

<6> 模板匹配識別

  既然模板圖片都制作好了,一切都差不多水到渠成了,下次來的驗(yàn)證碼我都切好后做成精圖片后跟模板進(jìn)行匹配,在afroge里面

有一個(gè)ExhaustiveTemplateMatching,專門用來進(jìn)行模板匹配用的,很方便。

復(fù)制代碼 代碼如下:

 ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.9f);

這里的0.9f就是設(shè)定的閾值,只有大于0.9的閾值,我才認(rèn)為該模板與目標(biāo)圖片相似,然后在所有大于0.9的相似度中取到最大的一個(gè)作為

我們最后識別的圖像。

復(fù)制代碼 代碼如下:

var files = Directory.GetFiles(Environment.CurrentDirectory + "//Template//");

            var templateList = files.Select(i => { return new Bitmap(i); }).ToList();
            var templateListFileName = files.Select(i => { return i.Substring(30, 1); }).ToList();

            var result = new List<string>();

            ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.9f);

            //這里面有四張圖片,進(jìn)行四張圖的模板匹配
            for (int i = 0; i < list.Count; i++)
            {
                float max = 0;
                int index = 0;

                for (int j = 0; j < templateList.Count; j++)
                {
                    var compare = templateMatching.ProcessImage(list[i], templateList[j]);

                    if (compare.Length > 0 && compare[0].Similarity > max)
                    {
                        //記錄下最相似的
                        max = compare[0].Similarity;
                        index = j;
                    }
                }

                result.Add(templateListFileName[index]);
            }

最后的效果還是不錯(cuò)的,識別率基本100%吧。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
日韩成人在线电影网| 91肉色超薄丝袜脚交一区二区| tube国产麻豆| 亚洲电影免费观看高清完整版在线观看| 亚洲免费在线观看| 亚洲综合视频1区| 国产欧美成人| 久久男人av| 91福利国产成人精品播放| 夜鲁夜鲁夜鲁视频在线播放| 99久久精品国产一区二区小说| 麻豆91在线播放免费| 欧美女v视频| 亚洲偷熟乱区亚洲香蕉av| 午夜视频在线观看一区| 欧美精品久久| 欧美美女性生活视频| 中文字幕求饶的少妇| 亚洲第一区在线| 日本精品一区二区三区不卡无字幕| 国产午夜精品久久久久| 精品不卡一区二区三区| 国产精品一区二区男女羞羞无遮挡| 国产精品入口66mio| 精品在线免费观看| 一级女性全黄久久生活片免费| 一级黄色录像在线观看| 国产一区二区在线观看免费| 一区二区在线观看视频在线观看| 三级毛片在线看| 亚洲第一页在线播放| 成人羞羞在线观看网站| 国产一区二区色| 色屁屁一区二区| 久久久久久久久久久成人| 国产欧美日韩另类一区| 国产精品一线天粉嫩av| 欧美日韩一区二区三区69堂| 亚洲精华液一区二区三区| 欧洲国产伦久久久久久久| 国产成人久久久| 日韩精品一线二线三线| 麻豆精品密在线观看| 蜜桃视频一区| 午夜精品久久久久久久99老熟妇| 玖玖视频精品| 亚洲一级在线播放| 日韩欧美久久久| 影音先锋电影在线观看| 少妇高潮一区二区三区| 欧美另类69精品久久久久9999| 免费视频久久| 精品国产黄色片| 欧洲视频一区| 国产激情美女久久久久久吹潮| 亚洲欧美日韩国产成人综合一二三区| 亚洲精品123区| 男人天堂视频在线| av资源中文色综合| 先锋影音av中文资源| 男女无套免费网站| 亚洲美女黄色| 国产精品久久久久毛片| 天天操天天摸天天干| 美女的尿口免费视频| 成人不用播放器| 在线观看一二三区| 色妞久久福利网| 午夜在线成人av| 精品动漫一区二区| 女同性一区二区三区人了人一| 日韩女优一区二区| 天天色天天爽| 日本一级免费视频| 精品蜜桃一区二区三区| 日本女优在线视频一区二区| 亚洲淫成人影院| 波多野结衣视频免费观看| 国产探花在线免费观看| 日韩人妻精品一区二区三区| 一个人看的www片免费高清视频| 完全免费av在线播放| 国产95亚洲| 久久国产综合| 精品176二区| 欧美精选一区二区三区| 欧美精品二区三区四区免费看视频| 久久人妻少妇嫩草av蜜桃| 亚洲看片网站| 成人午夜激情片| 肉丝美足丝袜一区二区三区四| 911美女片黄在线观看游戏| 中文字幕在线观看免费高清| 久久91亚洲精品中文字幕| 草草影院在线| 成年人网站免费在线观看| 欧美日韩中文字幕在线视频| 欧美精品性视频| 国产v片免费观看| 久久精品欧洲| 精品无人区乱码1区2区3区免费| a级免费视频| 99精品国产一区二区三区不卡| 91亚洲国产成人久久精品| 久久不见久久见免费视频7| 欧美xxxx吸乳| 免费黄网大全| 国产午夜精品免费一区二区三区| 欧美天堂一区二区三区| 久久蜜臀精品av| www视频在线播放| 亚洲综合精品自拍| 天天操夜夜草| 羞羞视频在线观看一区二区| 国内外成人免费激情在线视频| 青青青免费在线视频| 一区二区三区福利| 日本一区二区三区视频在线| 日本中文字幕在线视频观看| 黄色片子在线观看| 国产h在线观看| 黄色片网站免费| 精品国偷自产国产一区| 国产成人精品亚洲线观看| 欧美午夜性春猛xxxx| 黄色一区二区在线观看| 国产成人自拍网| 欧美专区在线观看| 日本网址在线观看| 一个人看的www在线免费视频| 国产成人精品一区二区在线小狼| 国内精品视频在线观看| 国产欧美日韩综合精品一区二区三区| 免费污污视频在线观看| 国产资源在线播放| 欧美系列亚洲系列| 成人精品在线视频| 国产成人精品亚洲777人妖| 黄页网站在线看| 天堂在线视频免费观看| 99国产超薄肉色丝袜交足的后果| 国产又黄又大久久| 337p日本欧洲亚洲大胆精品| 中文字幕av不卡| 国产精品va无码一区二区三区| 欧美精品一区二区三区涩爱蜜| 欧美日韩性生活片| 看电视剧不卡顿的网站| 秋霞在线观看一区二区三区| 天天综合天天综合| 国产鲁鲁视频在线观看免费| av在线网址观看| 午夜精品福利在线观看| 国产一区二区女| 亚洲av熟女国产一区二区性色| 成人不卡视频| 国产三级精品三级| 网友自拍一区| 五月婷婷久久综合| 国产aⅴ激情无码久久久无码| 日韩123区| eeuss影院www在线播放| 成人国内精品久久久久一区| 蜜臀av一区二区三区| 久久综合色播| 蜜桃一区二区| 911精品产国品一二三产区| 性网爆门事件集合av| 日本在线中文字幕一区二区三区| 日韩欧美成人免费视频| 国产三级电影在线播放| 婷婷六月综合网| 国内一区二区三区精品视频| 亚洲成人一区二区在线观看| 未满十八勿进黄网站一区不卡| 成年人网站免费在线观看| 国产精品a久久久久| 成年人看的毛片| 麻豆视频一区| 亚洲高清视频网站| 久久国产精品无码网站| 日韩女同互慰一区二区| 国产一级在线观看www色| 亚洲一区在线视频| 中文字幕一区二区三区久久网站| 人人做人人草| 一区二区三区入口| 亚洲国产专区校园欧美| 谁有免费的黄色网址| 国产精品久久999| 精品久久久久久久久久| 天天做天天干天天操| 国产日韩欧美在线播放不卡| 蜜臀av一区二区三区| 国产精品久久久久野外| 亚洲最新av在线| 久久电影网电视剧免费观看| 忘忧草在线www成人影院| 久久久久久亚洲综合| 国内精品伊人久久| 波多野结衣一区二区三区免费视频| 中文字幕无码乱码人妻日韩精品| 51精品国产黑色丝袜高跟鞋| 妖精视频在线观看| 在线观看美女av| 精品无码一区二区三区蜜臀| 在线播放精品一区二区三区| 日韩加勒比系列| 日本免费在线视频不卡一不卡二| 中文字幕人成高清视频| 亚洲欧美日本一区二区三区| 在线天堂中文资源最新版| 97se在线视频| www.国产精品| av有码在线观看| 亚洲在线视频网站| 欧美色偷偷大香| 日韩久久久久久久久久久| 欧美视频在线观看| 久久久久久福利| 欧美日韩国产高清视频| 国产一区国产二区国产三区| 麻豆精品国产传媒mv男同| 成人在线网址| 最近中文字幕在线6| 在免费jizzjizz在线视频| 91精品国产91久久久久久最新毛片| 日日摸夜夜添夜夜添精品视频| av网站免费在线看| 国产精品美女久久久久av爽| 福利一区视频在线观看| 66av99| 一区二区三区视频网站| 欧美日韩伦理一区二区| 九九视频免费观看视频精品| 国产精品porn| 国产精品久久久久影院老司| 日韩精品久久久久久久的张开腿让| 777午夜精品电影免费看| 欧美另类在线视频| 黑人巨大精品欧美| 欧美国产中文高清| 亚洲永久免费| 久久国产精品-国产精品| 国产呦小j女精品视频| 天天色综合av| 欧美三级日本三级少妇99| 国产日韩欧美一区在线| 亚洲天堂中文在线| 国产视频亚洲| 97久久人人超碰caoprom| 亚洲av成人精品一区二区三区在线播放| 亚洲一区日韩| 午夜精品国产| 夜夜夜夜夜夜操| 午夜成人亚洲理伦片在线观看| 免费网站在线高清观看| 热re66久久精品国产99热| 在线精品亚洲一区二区| 日本少妇高潮喷水xxxxxxx| 激情视频在线播放| 精品国偷自产一区二区三区| 久久wwww| 亚洲精品无人区| 久久伦理中文字幕| 亚洲精品成a人在线观看| 国产麻花豆剧传媒精品mv在线| 亚洲午夜在线视频| 九色丨porny丨| 亚洲黄色激情视频| 久久久久久久蜜桃| www亚洲人| 亚洲午夜免费福利视频| 日日噜噜噜夜夜爽爽| 99久久久成人国产精品| 蜜桃网站成人| 99视频免费观看蜜桃视频| 男女激情网站| 男女啪啪免费视频网站| 日产精品一区二区| 激情成人开心网| 天堂av一区二区三区在线播放| 国产精品国产三级国产试看| 中文字幕日本不卡| www..com久久爱| 亚洲欧洲第一视频| 久久天天躁狠狠躁夜夜躁| 97一区二区国产好的精华液| 亚洲乱码国产乱码精品精可以看| 亚洲日本精品一区| 综合在线影院| 欧美成人ⅴideosxxxxx| 国产精品久久久久久久久晋中| 日本日本精品二区免费| 日本欧美韩国一区三区| 高清毛片aaaaaaaaa片| 亚洲美女久久| 黑人粗进入欧美aaaaa| 牛牛精品成人免费视频| 亚洲另类色综合网站| 亚洲欧美一区二区三区久本道91| 狂野欧美性猛交xxxx巴西| 国产91av视频在线观看| 日韩午夜av一区| 99热在线免费播放| 四虎精品成人a在线观看| 国产视频精品视频| 成人午夜电影在线播放| 香蕉久久久久久久av网站| 中文字幕在线1| 伊人久久综合视频| 欧美精品一二| 嫩草视频免费在线观看| 国产女同性恋一区二区| 国产精品三级在线观看| 国产v亚洲v天堂无码| 涩爱av在线播放一区二区| 久久久久久久久久久久久久久久av| 日韩在线你懂得| 成人无号精品一区二区三区| 少妇被躁爽到高潮无码文| 青娱乐国产在线视频| 欧美高清在线视频观看不卡| 亚洲日本aⅴ片在线观看香蕉| 欧美精品亚州精品| 亚洲国产精品字幕| 亚洲欧洲美洲综合色网| 欧美一级特黄aaaaaa大片在线观看|