C#识别出图片里的数字和字母
发布时间:2020-12-15 03:50:06 所属栏目:百科 来源:网络整理
导读:一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现的字母和数字基本就那几个,所以识别库的范围设定的比较少。 原理和算法在代码中做了详细说明,功能存在很
一个图片识别小工具,原先主要是识别以前公司的软件注册码截图里的数字和字母(每次要一个一个框复制出来粘贴到注册器里,很麻烦!),因为注册码出现的字母和数字基本就那几个,所以识别库的范围设定的比较少。 原理和算法在代码中做了详细说明,功能存在很大的局限性,但我的想法是把这个思路和实现的办法共享出来。 源码下载地址: /* * 开发思路:图片灰度处理,二进制,然后和图片中的字二进制库精确对比 * * 获取字库:通过下面代码中generateLicense(Bitmap singlepic)方法获得,具体操作: * 从图片中截图出(抠出)一个字符,然后处理得到二维的二进制矩阵,比如下面的字符1对应的二维矩阵 * 00000 * 00100 * 11100 * 00100 * 00100 * 00100 * 00100 * 00100 * 00100 * 22222 * 00000 * 00000 * * 注意:【相同字符,比如1,不同字体,字号,不同缩放大小的图片,获得到的二位矩阵中0、1排列和数量都是不同的! * 故按照此方法来写出匹配所有字的话,那字库就大了。。。】 * * */ /// <summary> /// 提取出该图片内的字符(将进过灰度处理的图片转化为0、1的二位数组) /// </summary> /// <param name="singlepic">图片来源</param> public void generateLicense(Bitmap singlepic) { try { char[,] charArray = new char[singlepic.Height,singlepic.Width]; //定义个chai型的二维数组记录每个像素上0/1的值,形成一个矩形 int imageWidth = 0; //记录图片的像素宽度 int imageHeight = 0; //记录图片的像素高度 int dgGrayValue = 128; //灰度值 Color piexl; //string code = ""; //存储每个像素的0/1 for (int posy = 0; posy < singlepic.Height; posy++) {//从上到下 string codeCache = ""; //存储每行的像素的0/1 for (int posx = 0; posx < singlepic.Width; posx++) {//从左到右 piexl = singlepic.GetPixel(posx,posy); if (piexl.R < dgGrayValue) {// 如果该像素的颜色为黑色,值就为“1” codeCache = codeCache + "1"; } else {// 否则该像素的颜色为白色,值就为“0” codeCache = codeCache + "0"; } } char[] array = codeCache.ToCharArray(); //每行的0/1的值用数字保存,以便于进行循环处理 //code += codeCache + "n"; for (imageWidth = 0; imageWidth < array.Length; imageWidth++) charArray[imageHeight,imageWidth] = array[imageWidth]; //通过循环将每行值转存到二维数组中 imageHeight++; } //*********************以上代码可用来获取一个字的图片二进制数组,即字库***************************** //开始和字库进行匹配(我的工具中只需要下面的几个字符) findWord(charArray,char0,imageHeight,imageWidth,BinaryWidth0,BinaryHeight0,'0'); findWord(charArray,char1,BinaryWidth1,BinaryHeight1,'1'); findWord(charArray,char2,BinaryWidth2,BinaryHeight2,'2'); findWord(charArray,char3,BinaryWidth3,BinaryHeight3,'3'); findWord(charArray,char4,BinaryWidth4,BinaryHeight4,'4'); findWord(charArray,char5,BinaryWidth5,BinaryHeight5,'5'); findWord(charArray,char6,BinaryWidth6,BinaryHeight6,'6'); findWord(charArray,char7,BinaryWidth7,BinaryHeight7,'7'); findWord(charArray,char8,BinaryWidth8,BinaryHeight8,'8'); findWord(charArray,char9,BinaryWidth9,BinaryHeight9,'9'); findWord(charArray,charA,BinaryWidthA,BinaryHeightA,'a'); findWord(charArray,charB,BinaryWidthB,BinaryHeightB,'b'); findWord(charArray,charC,BinaryWidthC,BinaryHeightC,'c'); findWord(charArray,charD,BinaryWidthD,BinaryHeightD,'d'); findWord(charArray,charE,BinaryWidthE,BinaryHeightE,'e'); findWord(charArray,charF,BinaryWidthF,BinaryHeightF,'f'); findWord(charArray,charP,BinaryWidthP,BinaryHeightP,'p'); findWord(charArray,charY,BinaryWidthY,BinaryHeightY,'y'); //------------------------------------END--------------------------------------------- richTextBoxLicense.Text += identifySort(); //执行identifySort方法,将我需要的格式在richTextBoxLicense文本框中显示 richTextBoxLicense.SelectionStart = richTextBoxLicense.TextLength; //将光标移到最后面 } catch { } } 以上所述就是本文的全部内容了,希望大家能够喜欢。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |