public void DeskewTest() { TPage target = new TPage(); TOCRRect oRect = new TOCRRect(0, 0, 100, 100); TiS_Recognition_Common_TPageAccessor pageAccess = new TiS_Recognition_Common_TPageAccessor(target); pageAccess.m_iDeskewY = 100; TOCRRect actual; actual = target.Deskew(oRect); Assert.AreNotEqual(target, actual, "TiS.Recognition.Common.TPage.Deskew did not return the expected value."); }
/// <summary> /// Receives 2 prd pages and return if they are equal or not. /// </summary> private bool ComparePrdPages(TPage prdPage1, TPage prdPage2) { long charCounter = 0; if (prdPage1.Confidance != prdPage2.Confidance) { return(false); } if (prdPage1.NoOfLines != prdPage2.NoOfLines) { return(false); } Rectangle page1Rectangle = prdPage1.Rectangle; Rectangle page2Rectangle = prdPage2.Rectangle; if (page1Rectangle.Top != page2Rectangle.Top) { return(false); } if (page1Rectangle.Bottom != page2Rectangle.Bottom) { return(false); } if (page1Rectangle.Left != page2Rectangle.Left) { return(false); } if (page1Rectangle.Right != page2Rectangle.Right) { return(false); } TOCRRect page1OcrRectangle = new TOCRRect(page1Rectangle.Left, page1Rectangle.Top, page1Rectangle.Width, page1Rectangle.Height); TOCRRect page2OcrRectangle = new TOCRRect(page2Rectangle.Left, page2Rectangle.Top, page2Rectangle.Width, page2Rectangle.Height); if (prdPage1.Deskew(page1OcrRectangle).Top != prdPage1.Deskew(page2OcrRectangle).Top) { return(false); } if (prdPage1.Deskew(page1OcrRectangle).Bottom != prdPage1.Deskew(page2OcrRectangle).Bottom) { return(false); } if (prdPage1.Deskew(page1OcrRectangle).Left != prdPage1.Deskew(page2OcrRectangle).Left) { return(false); } if (prdPage1.Deskew(page1OcrRectangle).Right != prdPage1.Deskew(page2OcrRectangle).Right) { return(false); } if (prdPage1.MMtoPixel(100) != prdPage2.MMtoPixel(100)) { return(false); } IList <TLine> prdLines = prdPage1.Lines; // Lines check. for (int i = 0; i < prdLines.Count; i++) { TLine prdLine1 = prdPage1.Lines[i]; TLine prdLine2 = prdPage2.Lines[i]; if (prdLine1.Rectangle.Top != prdLine2.Rectangle.Top) { return(false); } if (prdLine1.Rectangle.Bottom != prdLine2.Rectangle.Bottom) { return(false); } if (prdLine1.Rectangle.Left != prdLine2.Rectangle.Left) { return(false); } if (prdLine1.Rectangle.Right != prdLine2.Rectangle.Right) { return(false); } // Check words in line. for (int j = 0; j < prdLine1.Words.Count; j++) { TWord prdWord1 = prdLine1.Words[j]; TWord prdWord2 = prdLine2.Words[j]; if (prdWord1.Confidance != prdWord2.Confidance) { return(false); } if (prdWord1.Style != prdWord2.Style) { return(false); } // Check characters in word. for (int z = 0; z < prdWord1.Chars.Count; z++) { TChar prdChar1 = prdWord1.Chars[z]; TChar prdChar2 = prdWord2.Chars[z]; if (prdChar1.Rect.Top != prdChar2.Rect.Top) { return(false); } if (prdChar1.Rect.Bottom != prdChar2.Rect.Bottom) { return(false); } if (prdChar1.Rect.Left != prdChar2.Rect.Left) { return(false); } if (prdChar1.Rect.Right != prdChar2.Rect.Right) { return(false); } if (prdChar1.Confidance != prdChar2.Confidance) { return(false); } if (prdChar1.CharData != prdChar2.CharData) { return(false); } } } } return(true); }
private static void LoadOcrData(DocumentData doc, string ocrFile, bool deskew) { var page = TPage.LoadFromPRD(ocrFile); //*.prd // var pageNavigation = new TPageNavigation(page); var data = doc.Words; var lines = doc.Lines; /* if (deskew) * { * foreach(FieldData field in doc.Fields) * { * field.OriginRectangle = field.Rectangle; * TOCRRect origin = new TOCRRect((int)field.Rectangle.Left,(int)field.Rectangle.Top,(int)field.Rectangle.Width,(int)field.Rectangle.Height); * var originSkew = page.Deskew( origin); * field.Rectangle = new Rect(originSkew.Left, originSkew.Top, originSkew.Width, originSkew.Height); * } * }*/ List <TOCRRect> wordsRects = new List <TOCRRect>(); foreach (TLine line in page.Lines) { OcrLine ocrLine = new OcrLine(); ocrLine.Rectangle = new Rect(line.Rect.Left, line.Rect.Top, line.Rect.Width, line.Rect.Height); foreach (TWord word in line.Words) { if (wordsRects.Any(x => x.Left == word.Rect.Left && x.Top == word.Rect.Top && x.Right == word.Rect.Right && x.Bottom == word.Rect.Bottom) == true) { continue; } else { wordsRects.Add(word.Rect); } // Split word IList <MappedWord> spltWords = SplitWord(word) .Select(x => { var mapWord = new MappedWord() { Confidence = x.Confidance, Contents = string.Concat(x.Chars.Select(a => a.CharData).ToArray()) }; TOCRRect deskewedRect = x.Rect; if (deskew) { deskewedRect = page.Deskew(x.Rect); } mapWord.Rectangle = new Rect(deskewedRect.Left, deskewedRect.Top, deskewedRect.Width, deskewedRect.Height); mapWord.OriginRectangle = new Rect(x.Rect.Left, x.Rect.Top, x.Rect.Width, x.Rect.Height); return(mapWord); }) .ToList(); // Add splited each words to the doc for (int i = 0; i < spltWords.Count; i++) { MappedWord mapWord = spltWords[i]; if (i > 0) { spltWords[i - 1].SplitRight = mapWord; } if (i + 1 < spltWords.Count) { spltWords[i + 1].SplitLeft = mapWord; } doc.Words.Add(mapWord); mapWord.Line = ocrLine; ocrLine.Words.Add(mapWord); } } if (ocrLine.Words.Any()) { lines.Add(ocrLine); } } int indexWord = 0; int indexLine = 0; foreach (var ocrLine in lines.OrderBy(a => a.Rectangle.Top).ToList()) { ocrLine.ID = indexLine++; } data = data.OrderBy(a => a.Line.ID).ThenBy(a => a.Rectangle.X).ToList(); foreach (OcrWord ocrWord in data) { ocrWord.ID = indexWord++; } }