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);
        }
예제 #3
0
        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++;
            }
        }