Esempio n. 1
0
        /// <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) { }
        }
Esempio n. 2
0
 /// <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();
     }
 }
Esempio n. 3
0
        /// <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();
        }
Esempio n. 4
0
        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");
                }
            }
        }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
        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;
                }
            }
        }
Esempio n. 7
0
        private void 二值化ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Bitmap twobmp = (Bitmap)pictureBox1.Image;

            pictureBox1.Image = PicUtils.Sauvola(twobmp);
        }
Esempio n. 8
0
        /// <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);
            }
        }