/// <summary> /// author:liusimawen /// date:2018-04-19 /// 训练样本--旋转训练集 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 旋转训练集ToolStripMenuItem_Click(object sender, EventArgs e) { try { DateTime dtStart = DateTime.Now; //总样本数 Matrix <float> trainData = new Matrix <float>(6200, 50); //生成--输出矩阵 Matrix <float> trainClasses = new Matrix <float>(6200, 31); Matrix <float> sample = new Matrix <float>(1, 50); Matrix <float> prediction = new Matrix <float>(1, 31); DirectoryInfo theFolder = new DirectoryInfo(@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\sample"); DirectoryInfo[] dirInfo = theFolder.GetDirectories(); //遍历文件夹 for (int dc = 0; dc < dirInfo.Length; dc++)//max--36 { DirectoryInfo NextFolder = dirInfo[dc]; string[] files = Directory.GetFiles(NextFolder.FullName, "*.bmp", SearchOption.AllDirectories); for (int fc = 0; fc < files.Length; fc++)//max--50 { try { Bitmap bmp50 = (Bitmap)Image.FromFile(files[fc]); //旋转纠正 bmp50 = DegreeCorrect(bmp50); Matrix <float> rowPP = PicUtils.calPixlPercent(bmp50, 5, 10); //将特征向量赋值给输入矩阵 for (int rppc = 0; rppc < rowPP.Cols; rppc++) { trainData.Data[dc * files.Length + fc, rppc] = rowPP[0, rppc]; } //初始化trainClasses,对应位置的值设置为1 trainClasses.Data[dc * files.Length + fc, dc] = 1; } catch (Exception sex) { continue; } } } PicUtils.trainANN(trainData, trainClasses); DateTime dtEnd = DateTime.Now; TimeSpan ts = dtEnd - dtStart; MessageBox.Show("样本训练完成,已保存xml文件!用时" + ts.TotalMinutes); } catch (Exception ex) { } }
/// <summary> /// 将一幅图片以数组的形式存入数据库 /// </summary> /// <param name="cutbmp"></param> public void SaveCutBmpToAccess(Bitmap cutbmp) //mark是图片的标记 { try { double pp = PicUtils.PixlPercent(cutbmp); MemoryStream ms = new MemoryStream(); cutbmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); ms.Flush(); //将二进制数据存到byte数字中 byte[] bmpBytes = ms.ToArray(); pictureBox1.Image = Image.FromStream(new MemoryStream(bmpBytes)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < bmpBytes.Length; i++) { if (i != bmpBytes.Length - 1) { sb.Append(bmpBytes[i] + ","); } else { sb.Append(bmpBytes[i]); } } if (sb.Length > 65536) { sb.Clear(); sb.Append("该图片太大了,字节数超过65536"); } mycnn.ConnectionString = Myconnstr; cmd.Connection = mycnn;//出错,因为cmd为空 mycnn.Open(); cmd.CommandText = "delete from AfterCut"; cmd.ExecuteNonQuery(); cmd.CommandText = "insert into AfterCut(content_,pixel_percent) values('" + sb.ToString() + "','" + pp.ToString() + "')";//access数据库中的备注类型最大长度为65536,所以图片不能太大 cmd.ExecuteNonQuery(); } catch (Exception w) { MessageBox.Show(w.ToString()); } finally { mycnn.Close(); } }
/// <summary> /// author:liusimawen /// date:2018-04-19 /// 单个字符识别按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click_1(object sender, EventArgs e) { Bitmap bmpTest = (Bitmap)pictureBox1.Image; //灰度化 bmpTest = MyUtils.ToGray(bmpTest); //二值化 bmpTest = PicUtils.Sauvola(bmpTest); //图像去躁 bmpTest = bmpTest.Clone(new Rectangle(0, 0, bmpTest.Width, bmpTest.Height), PixelFormat.Format24bppRgb); bmpTest = MyUtils.MyGussianBlur(bmpTest); MyUtils.ClearNoise(bmpTest, MyUtils.GetDgGrayValue(bmpTest), 4);//按照需要进行设置 //图像分割,应该返回4个子图像 List <Bitmap> littleBmpArray = PicUtils.SimpleCutTo4(bmpTest);//CutImg(cutbmp); //如果子图像不为4个,则跳过本图,继续下一张图片 if (littleBmpArray.Count != 4) { return; } //再对子图像去除多余的空白部分 //一张图像里的所有字符 StringBuilder resultSb = new StringBuilder(); for (int lba = 0; lba < littleBmpArray.Count; lba++) { if (littleBmpArray[lba] == null) { continue; } //旋转纠正 littleBmpArray[lba] = DegreeCorrect(littleBmpArray[lba]); //System.Threading.Thread.Sleep(2000); char resultChar = PicUtils.regANN(littleBmpArray[lba]); resultSb.Append(resultChar); } resullt_box.Text = resultSb.ToString(); }
private void button7_Click(object sender, EventArgs e) { //PicUtils.FindColor(246, 130, 444, 289, "3cc4c4",0.9); //PicUtils.FindColor(246, 130, 444, 289, "3cc4c4", 0.93); //PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", "62b040", 0.80, "80.bmp"); //PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", "62b040", 0.70, "70.bmp"); //349E57 String rgb = ""; rgb = "62b040"; rgb = "3CC43C"; //rgb = "228545"; List <String> rgbs = new List <String>(); List <double> sims = new List <double>(); //PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", rgb, 0.90, "90.bmp"); //PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", rgb, 0.85, "85.bmp"); //PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", rgb, 0.80, "80.bmp"); rgbs.Add("00FF00"); sims.Add(0.9); sims.Add(0.88); sims.Add(0.85); sims.Add(0.82); sims.Add(0.80); for (int i = 0; i < rgbs.Count; i++) { for (int j = 0; j < sims.Count; j++) { PicUtils.FindColorByHueFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", rgbs[i], sims[j], "Hue_" + rgbs[i] + sims[j].ToString() + ".bmp"); PicUtils.FindColorFromFile(@"C:\Users\gypc\Pictures\dn\小图\小地图.bmp", rgbs[i], sims[j], "RGB_" + rgbs[i] + sims[j].ToString() + ".bmp"); } } }
public void getMousePoint() { while (isRunning) { int offsetx = 0, offsety = 0; try { String[] s = textBox_offset.Text.Split(' '); offsetx = int.Parse(s[0]); offsety = int.Parse(s[1]); } catch (System.Exception ex) { } Point screenPoint = Control.MousePosition; String str = screenPoint.X + " " + screenPoint.Y; int x1 = screenPoint.X; int y1 = screenPoint.Y; textBox_point.Text = str; textBox_expect_point.Text = (x1 - offsetx) + " " + (y1 - offsety); x1 -= 8; y1 -= 8; x1 = x1 <= 0 ? 0 : x1; y1 = y1 <= 0 ? 0 : y1; Bitmap bmp = PicUtils.captureScreen(x1, y1, 17, 17); int scale = 8; Bitmap bmp2 = new Bitmap(bmp.Width * scale, bmp.Height * scale); for (int i = 0; i < bmp.Width; i++) { for (int j = 0; j < bmp.Height; j++) { for (int k = 0; k < scale; k++) { for (int l = 0; l < scale; l++) { bmp2.SetPixel(i * scale + k, j * scale + l, bmp.GetPixel(i, j)); } } if (i == bmp.Width / 2 && j == bmp.Height / 2) { for (int k = 0; k < scale; k++) { for (int l = 0; l < scale; l++) { if (k == 0 || k == scale - 1 || l == 0 || l == scale - 1) { bmp2.SetPixel(i * scale + k, j * scale + l, Color.Red); } else { bmp2.SetPixel(i * scale + k, j * scale + l, bmp.GetPixel(i, j)); } } } } } } Color c = bmp.GetPixel(bmp.Width / 2, bmp.Height / 2); textBox_color.Text = c.Name.Substring(2, 6).ToUpper(); pictureBox1.Image = bmp2; Thread.Sleep(100); } }
private void 生成训练样本ToolStripMenuItem_Click(object sender, EventArgs e) { //1.首先要实现批量读取图片F:\毕业设计2018届刘锋\myCharSamples\train //获取文件夹下的所有图片路径名:"F:\\毕业设计2018届刘锋\\OOP.PictureAnalyse\\testImages\\0000.jpg" string[] files = Directory.GetFiles(@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\train", "*.jpg", SearchOption.AllDirectories); //所有的待测图像 for (int i = 0; i < files.Length; i++) { try { Bitmap bmpTogether = (Bitmap)Image.FromFile(files[i]); //灰度化 bmpTogether = MyUtils.ToGray(bmpTogether); //二值化 bmpTogether = PicUtils.Sauvola(bmpTogether); //图像去躁 bmpTogether = bmpTogether.Clone(new Rectangle(0, 0, bmpTogether.Width, bmpTogether.Height), PixelFormat.Format24bppRgb); bmpTogether = MyUtils.MyGussianBlur(bmpTogether); MyUtils.ClearNoise(bmpTogether, MyUtils.GetDgGrayValue(bmpTogether), 4);//按照需要进行设置 Byte[,] BinaryArray = PicUtils.ToBinaryArray(bmpTogether); ImgBoundary Boundary = SegmentFunction.getImgBoundary(BinaryArray); //jpg格式转换为bmp,方式SetPixel方法报错 bmpTogether = bmpTogether.Clone(new Rectangle(Boundary.widthMin, Boundary.heightMin, Boundary.widthMax - Boundary.widthMin, Boundary.heightMax - Boundary.heightMin), PixelFormat.Format24bppRgb); //图像分割,应该返回4个子图像 List <Bitmap> littleBmpArray = PicUtils.SimpleCutTo4(bmpTogether);//CutImg(cutbmp); //保存路径 DirectoryInfo TheFolder = new DirectoryInfo(@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\sample"); int nameIndex = files[i].LastIndexOf(@"\"); //取出最后一个"\"的索引 string fileName = files[i].Substring(nameIndex + 1, 4); //取出图像的名称 char[] arrayName = fileName.ToArray(); //转换为字符数组 //再对子图像去除多余的空白部分 //一张图像里的所有字符 for (int lba = 0; lba < littleBmpArray.Count; lba++) { //1.去除多余部分,不过好像childbmp本来就没有多余的空白部分 //littleBmpArray[lba]=SingleWordCutImg(littleBmpArray[lba]); //2.保存图像 if (littleBmpArray[lba] == null) { continue; } bool isExist = false;//标记是否已存在该名称的文件夹 //先遍历图像名称,因为文件夹名称刚开始是没有的 //-如果已存在DirectoryInfo[] GetDirectories() if (TheFolder.GetDirectories() != null) { string pathName = "";//最终保存图像的完整路径名 foreach (DirectoryInfo nextdirectory in TheFolder.GetDirectories()) { if (nextdirectory.Name == arrayName[lba].ToString()) { isExist = true; string pre = nextdirectory.FullName + @"\"; //前缀 string mid = arrayName[lba].ToString(); //中间动态名称 mid += "_"; mid += DateTime.Now.ToString("mm-ss-fffffff", DateTimeFormatInfo.InvariantInfo); string suf = ".bmp"; //后缀 pathName = pre + mid + suf; //"F:\\毕业设计2018届刘锋\\OOP.PictureAnalyse\\myCharSamples\\train\\00-01773.bmp" //存到已存在的文件夹中 第一个参数:"F:\\毕业设计2018届刘锋\\asdad.bmp" littleBmpArray[lba].Save(pathName, System.Drawing.Imaging.ImageFormat.Bmp); break;//跳出foreach } } //如果不存在对应的文件夹 if (!isExist) { string newDir = TheFolder.FullName + @"\" + arrayName[lba].ToString(); if (!Directory.Exists(newDir)) { Directory.CreateDirectory(newDir); string pre = newDir + @"\"; //前缀 string mid = arrayName[lba].ToString(); //中间动态名称 mid += "_"; mid += DateTime.Now.ToString("mm-ss-fffffff", DateTimeFormatInfo.InvariantInfo); string suf = ".bmp";//后缀 pathName = pre + mid + suf; littleBmpArray[lba].Save(pathName, System.Drawing.Imaging.ImageFormat.Bmp); continue; } } } } } catch (Exception ex) { //遇到异常就跳过,处理下一张图片 continue; } } }
private void 二值化ToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap twobmp = (Bitmap)pictureBox1.Image; pictureBox1.Image = PicUtils.Sauvola(twobmp); }
/// <summary> /// author:liusimawen /// date:2018-04-19 /// 识别--批量识别 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 批量识别ToolStripMenuItem_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("是否继续识别", "确认框", MessageBoxButtons.OKCancel); if (dr == DialogResult.OK) { DateTime dtStart = DateTime.Now; //先清空记事本中的记录 using (System.IO.StreamWriter file = new System.IO.StreamWriter (@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\testresult1.txt", false))//true表示追加在末尾,false为覆盖 { //file.Write(line);//直接追加文件末尾,不换行 file.Write("");// 直接追加文件末尾,换行 } //1.首先要实现批量读取图片F:\毕业设计2018届刘锋\myCharSamples\train //获取文件夹下的所有图片路径名:"F:\\毕业设计2018届刘锋\\OOP.PictureAnalyse\\testImages\\0000.jpg" string[] files = Directory.GetFiles(@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\test500", "*.jpg", SearchOption.AllDirectories); //所有的待测图像 for (int i = 0; i < files.Length; i++) { try { Bitmap bmpTest = (Bitmap)Image.FromFile(files[i]); //灰度化 bmpTest = MyUtils.ToGray(bmpTest); //二值化 bmpTest = PicUtils.Sauvola(bmpTest); //图像去躁 bmpTest = bmpTest.Clone(new Rectangle(0, 0, bmpTest.Width, bmpTest.Height), PixelFormat.Format24bppRgb); bmpTest = MyUtils.MyGussianBlur(bmpTest); MyUtils.ClearNoise(bmpTest, MyUtils.GetDgGrayValue(bmpTest), 4);//按照需要进行设置 Byte[,] BinaryArray = PicUtils.ToBinaryArray(bmpTest); ImgBoundary Boundary = SegmentFunction.getImgBoundary(BinaryArray); //jpg格式转换为bmp,方式SetPixel方法报错 bmpTest = bmpTest.Clone(new Rectangle(Boundary.widthMin, Boundary.heightMin, Boundary.widthMax - Boundary.widthMin, Boundary.heightMax - Boundary.heightMin), PixelFormat.Format24bppRgb); //图像分割,应该返回4个子图像 List <Bitmap> littleBmpArray = PicUtils.SimpleCutTo4(bmpTest);//CutImg(cutbmp); //如果子图像不为4个,则跳过本图,继续下一张图片 if (littleBmpArray.Count != 4) { continue; } int nameIndex = files[i].LastIndexOf(@"\"); //取出最后一个"\"的索引 string fileName = files[i].Substring(nameIndex + 1, 4); //取出图像的名称 char[] arrayName = fileName.ToArray(); //转换为字符数组 //再对子图像去除多余的空白部分 //一张图像里的所有字符 StringBuilder resultSb = new StringBuilder(); for (int lba = 0; lba < littleBmpArray.Count; lba++) { if (littleBmpArray[lba] == null) { continue; } //旋转纠正 littleBmpArray[lba] = DegreeCorrect(littleBmpArray[lba]); char resultChar = PicUtils.regANN(littleBmpArray[lba]); resultSb.Append(resultChar); } //testresult.txt存储识别结果:正确字符 识别结果 using (System.IO.StreamWriter file = new System.IO.StreamWriter (@"F:\毕业设计2018届刘锋\OOP.PictureAnalyse\myCharSamples\A16-浪潮-验证码样本数据\验证码样本数据\data-3\testresult1.txt", true))//true表示追加在末尾,false为覆盖 { //file.Write(line);//直接追加文件末尾,不换行 file.WriteLine(fileName + " " + resultSb);// 直接追加文件末尾,换行 } } catch (Exception ex) { //遇到异常就跳过,处理下一张图片 continue;//对应最外面的for循环 } } DateTime dtEnd = DateTime.Now; TimeSpan ts = dtEnd - dtStart; MessageBox.Show("识别完成,已保存入testresult1.txt!用时" + ts.Minutes); } }