/// <summary> /// Learn new style based on a clear page with separated letters from whole alphabet. Letters as on keyboard. /// Last 2 letters are dot and comma /// </summary> /// <param name="file">Path to file with letters.</param> public void AcknowledgeNewStyle(string file, RecognitionModel model) { List <ImageMatrix> letters = null; if (model == RecognitionModel.FixedSize) { letters = new MatrixSplitter(file).Letters; } else if (model == RecognitionModel.Resizing) { ImageMatrix main = new ImageMatrix(new Bitmap(Image.FromFile(file))); SubMatrix sub = new SubMatrix(main.Matrix, new Rectangle { X = 0, Y = 0, Height = main.Height, Width = main.Width }); var letterSplitter = new LetterSplitter(sub); letters = GetLines(sub).SelectMany(line => GetLetters(line, letterSplitter)).Select(s => s.ToFullMatrix()).ToList(); } var fileName = file.Substring(file.LastIndexOf(Path.DirectorySeparatorChar) + 1); var woExtension = fileName.Substring(0, fileName.IndexOf('.')); var placeInDB = DataCollector.GenerateFontFolder(woExtension, model); int i = 0; foreach (var l in letters.Take(letters.Count - 2)) { l.Character = NextChar(i++); } SaveMatricesToDirectory(placeInDB, letters); }
private List <SubMatrix> GetLetters(SubMatrix line, LetterSplitter letterSplitter) { letterSplitter.SetNewMatrix(line); var letters = letterSplitter.GetLetters(); //letters.Insert(0, line); return(letters); }
/// <summary> /// Clear, split to lines, split to letters. /// </summary> /// <param name="mainMatrix">Main image</param> /// <returns>Lines with letters, first letter is always the line</returns> private List <List <SubMatrix> > FindLettersToLines(ImageMatrix mainMatrix) { var matrix = GetClearedTextMatrix(mainMatrix); var lines = GetLines(matrix); var letterSplitter = new LetterSplitter(matrix); var resultLinesAndLetters = lines.Select(l => GetLetters(l, letterSplitter)).ToList(); return(resultLinesAndLetters); }
public void TestSpaceRecognition() { PrepareImage(); testName = "SpaceRecognition"; var firstLine = GetLines().First(); var letterSplitter = new LetterSplitter(firstLine); var letters = letterSplitter.GetLetters(); TEST(letters.Where(m => m == null).Count() == 3, $"Didnt find 3 required spaces, found {letters.Where(m => m == null).Count()}"); }
private List <List <SubMatrix> > GetLetters(List <SubMatrix> lines) { LetterSplitter splitter = new LetterSplitter(lines.First()); var firstLine = splitter.GetLetters(); lines.RemoveAt(0); var letters = lines.Select(l => { splitter.SetNewMatrix(l); return(splitter.GetLetters()); }).ToList(); letters.Insert(0, firstLine); letters.ForEach(l => l.RemoveAll(r => r == null)); return(letters); }
/// <summary> /// Retrieves letters ignoring spaces, so outcome is a line of text. /// </summary> /// <param name="pathToImage"></param> /// <returns></returns> public IEnumerable <Bitmap> ParseToLettersImages(string pathToImage) { var mainMatrix = new ImageMatrix(new Bitmap(Image.FromFile(pathToImage))); var clr = GetClearedTextMatrix(mainMatrix); var lines = GetLines(clr); LetterSplitter splitter = new LetterSplitter(clr); var letters = lines.SelectMany(l => { splitter.SetNewMatrix(l); return(splitter.GetLetters()); }); List <SubMatrix> summarize = new List <SubMatrix> { clr }; summarize.AddRange(lines); summarize.AddRange(letters); var crt = new ImageCreator(); return(summarize.Select(a => crt.CreateImageOutOfMatrix(a))); }