Пример #1
0
        private IEnumerable <ImageMatrix> PrepareForRecognition(IEnumerable <List <SubMatrix> > linedLetters)
        {
            var avgW = (int)linedLetters.First().Where(m => m != null).Average(m => m.Width);
            var avgH = (int)linedLetters.First().Where(m => m != null).Average(m => m.Height);

            return(linedLetters.SelectMany(a =>
            {
                List <ImageMatrix> toRet = new List <ImageMatrix>();
                toRet.AddRange(a.Select(l =>
                {
                    if (l == null)
                    {
                        return null;
                    }
                    var preRecognition = PreRecognizeDotOrComma(l, avgW, avgH);
                    if (preRecognition != '_')
                    {
                        return new ImageMatrix(preRecognition);
                    }
                    return MatrixTools.Scale(l.ToFullMatrix());
                }));
                toRet.Add(new ImageMatrix('\n'));
                return toRet;
            }));
        }
Пример #2
0
        public void TestConnectedLettersDistnignuish()
        {
            var folder = Path.Combine(DATA.testFolder, "Test Defense");
            var qwe    = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "qwe.png"))));
            var q      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "q.png"))));
            var w      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "w.png"))));
            var e      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "e.png"))));

            qwe = qwe.CopyMatrix(new MatrixTools(qwe).TrimWhiteAreaAround());
            q   = q.CopyMatrix(new MatrixTools(q).TrimWhiteAreaAround());
            w   = w.CopyMatrix(new MatrixTools(w).TrimWhiteAreaAround());
            e   = e.CopyMatrix(new MatrixTools(e).TrimWhiteAreaAround());
            qwe = MatrixTools.Scale(qwe, 150, 50);
            q   = MatrixTools.Scale(q);
            w   = MatrixTools.Scale(w);
            e   = MatrixTools.Scale(e);
            var result = DefenseMechanism.SplitToSingleLetters(qwe, new List <ImageMatrix> {
                q, w, e
            });

            if (result.Count != 3)
            {
                LogFail("Connected letters distinguish", "Received: " + result.Count.ToString() + " Expected: 3");
            }
            else
            {
                LogPass("Connected letters distinguish");
            }
        }
Пример #3
0
        /// <summary>
        /// Take letters saved as grapic files and add them to the database. One image per letter.
        /// </summary>
        /// <param name="directory">Directory with images. Should be named as the font is meant to be.</param>
        public void ReadLettersFromDirectory(string directory, RecognitionModel model)
        {
            var files    = Directory.GetFiles(directory);
            var matrices = files.Select(f =>
            {
                var m        = new ImageMatrix(new Bitmap(Image.FromFile(f)));
                var fileName = f.Substring(f.LastIndexOf(Path.DirectorySeparatorChar));
                if (fileName.Contains("dot"))
                {
                    m.Character = '.';
                }
                else if (fileName.Contains("coma"))
                {
                    m.Character = ',';
                }
                else
                {
                    m.Character = fileName.First();
                }
                return(MatrixTools.Scale(m.CopyMatrix(new MatrixTools(m).TrimWhiteAreaAround())));
            });
            var placeInDB = DataCollector.GenerateFontFolder(directory, model);

            SaveMatricesToDirectory(placeInDB, matrices);
        }
Пример #4
0
        public void TestScaleDescaleComparison()
        {
            int width  = 100;
            int height = 100;

            bool[][] mat     = new bool[width][];
            var      rEngine = new Random();

            for (int x = 0; x < mat.Length; ++x)
            {
                mat[x] = new bool[height];
                for (int y = 0; y < mat[x].Length; ++y)
                {
                    mat[x][y] = rEngine.Next(2) == 1 ? true : false;
                }
            }
            ImageMatrix matrix   = new ImageMatrix(mat);
            var         creator  = new ImageCreator();
            var         scaled   = MatrixTools.Scale(matrix, 50, 50);
            var         descaled = MatrixTools.Scale(scaled, 100, 100);
            float       s        = MatrixTools.EqualPixelRatio(descaled, matrix);

            if (s > 0.5)
            {
                Console.WriteLine("TEST_Scaling: Passed, scale equality: " + s.ToString());
            }
            else
            {
                Console.WriteLine("TEST_Scaling: fail, scale equality: " + s.ToString());
            }
        }
Пример #5
0
 /// <summary>
 /// Will compare upcoming letters to those stored in given font folder + will scale letters in those folder by given ratio
 /// </summary>
 /// <param name="font"></param>
 /// <param name="scalingRatio"></param>
 public VaryingLetterRecognizer(string font, float scalingRatio)
 {
     capitals = DataRetriever.Size_Font_Type_All(DATA.varyingSizeFolderNode, font, DATA.capitalsFolderNode)
                .Select(m => MatrixTools.Scale(m, scalingRatio))
                .ToList();
     normals = DataRetriever.Size_Font_Type_All(DATA.varyingSizeFolderNode, font, DATA.normalsFolderNode)
               .Select(m => MatrixTools.Scale(m, scalingRatio))
               .ToList();
 }
Пример #6
0
        public void TestVaryingSizesComparison()
        {
            testName = "VaryingSizeComparison";
            Random r = new Random();
            int    smallW = 5, smallH = 7;

            bool[][] smallMatrix = new bool[smallW][];
            for (int x = 0; x < smallW; ++x)
            {
                smallMatrix[x] = new bool[smallH];
                for (int y = 0; y < smallH; ++y)
                {
                    smallMatrix[x][y] = r.Next(2) == 1 ? true : false;
                }
            }
            ImageMatrix main   = new ImageMatrix(smallMatrix);
            ImageMatrix second = MatrixTools.Scale(main, 10, 6);
            var         r2     = MatrixTools.EqualPixelRatioVaryingSize(main, second);

            TEST(r2 >= 0.99 && r2 <= 1.0, $"Comparison varying sizes is below 0.99, received ratio: {r2}");
        }
Пример #7
0
        public void TestScaling()
        {
            testName = "Scaling";
            var matrix = new ImageMatrix(new Bitmap(Image.FromFile(simplePageUrl)));

            {
                matrix = MatrixTools.Scale(matrix);
                TEST(matrix.Width == DATA.letterWidth, $"Actual {matrix.Width}");
                TEST(matrix.Height == DATA.letterHeight, $"Actual {matrix.Height}");
            }
            {
                matrix = MatrixTools.Scale(matrix, 1.5f);
                TEST(matrix.Width == 60, $"Actual {matrix.Width}");
                TEST(matrix.Height == 75, $"Actual {matrix.Height}");
            }
            {
                matrix = MatrixTools.Scale(matrix, 100, 100);
                TEST(matrix.Width == 100, $"Actual {matrix.Width}");
                TEST(matrix.Height == 100, $"Actual {matrix.Height}");
            }
            {
                matrix = MatrixTools.Scale(matrix, 60, 30);
                TEST(matrix.Width == 60, $"Actual {matrix.Width}");
                TEST(matrix.Height == 30, $"Actual {matrix.Height}");
            }
            matrix = new ImageMatrix(new bool[][] {
                new bool[] { true, true, true, true },
                new bool[] { true, true, true, true },
                new bool[] { true, true, true, true },
                new bool[] { true, true, true, true },
            });
            {
                matrix = MatrixTools.Scale(matrix);
                TEST(matrix.Matrix.SelectMany(a => a).All(b => b), "Not all pixels are black");
                matrix = MatrixTools.Scale(matrix, 200, 40);
                TEST(matrix.Matrix.SelectMany(a => a).All(b => b), "Not all pixels are black");
            }
        }
Пример #8
0
        private void TestDisplay()
        {
            var folder = Path.Combine(DATA.testFolder, "Test Defense");
            var qwe    = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "qwe.png"))));
            var q      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "q.png"))));
            var w      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "w.png"))));
            var e      = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "e.png"))));

            qwe = qwe.CopyMatrix(new MatrixTools(qwe).TrimWhiteAreaAround());
            q   = q.CopyMatrix(new MatrixTools(q).TrimWhiteAreaAround());
            w   = w.CopyMatrix(new MatrixTools(w).TrimWhiteAreaAround());
            e   = e.CopyMatrix(new MatrixTools(e).TrimWhiteAreaAround());
            qwe = MatrixTools.Scale(qwe, 150, 50);
            q   = MatrixTools.Scale(q);
            w   = MatrixTools.Scale(w);
            e   = MatrixTools.Scale(e);
            var crt    = new ImageCreator();
            var result = Splitters.DefenseMechanism.SplitToSingleLetters(qwe, new List <ImageMatrix> {
                q, w, e
            });

            pictures.AddRange(result.Select(a => crt.CreateImageOutOfMatrix(a)));
            pictureBoxLine.Image = pictures.First();
        }