Exemplo n.º 1
0
        public void CanDetectOrientationForMode(
            [Values(PageSegMode.Auto,
                    PageSegMode.AutoOnly,
                    PageSegMode.AutoOsd,
                    PageSegMode.CircleWord,
                    PageSegMode.OsdOnly,
                    PageSegMode.SingleBlock,
                    PageSegMode.SingleBlockVertText,
                    PageSegMode.SingleChar,
                    PageSegMode.SingleColumn,
                    PageSegMode.SingleLine,
                    PageSegMode.SingleWord)]
            PageSegMode pageSegMode)
        {
            using (var img = LoadTestImage(ExampleImagePath)) {
                using (var rotatedPix = img.Rotate((float)Math.PI)) {
                    using (var page = engine.Process(rotatedPix, pageSegMode)) {
                        int    orientation;
                        float  confidence;
                        string scriptName;
                        float  scriptConfidence;

                        page.DetectBestOrientationAndScript(out orientation, out confidence, out scriptName, out scriptConfidence);

                        Assert.That(orientation, Is.EqualTo(180));
                        Assert.That(scriptName, Is.EqualTo("Latin"));
                    }
                }
            }
        }
Exemplo n.º 2
0
 public List <CharBox> GetCharBoxs(Bitmap b, PageSegMode pageSegMode)
 {
     using (Tesseract.Page page = engine.Process(b, pageSegMode))
     {
         return(getCharBoxs(page));
     }
 }
Exemplo n.º 3
0
 public string GetHtml(Bitmap b, PageSegMode pageSegMode)
 {
     using (Tesseract.Page page = engine.Process(b, pageSegMode))
     {
         return(page.GetHOCRText(0, false));
     }
 }
Exemplo n.º 4
0
        /// <summary> Use Tesseract OCR to find words on picture to string </summary>
        public static string AnalyzeText(Bitmap bitmap, PageSegMode pageMode = PageSegMode.SingleLine, bool numbersOnly = false)
        {
            string          text = "";
            TesseractEngine e;

            while (!engines.TryTake(out e))
            {
                Thread.Sleep(10);
            }

            if (numbersOnly)
            {
                e.SetVariable("tessedit_char_whitelist", "0123456789");
            }
            using (var page = e.Process(bitmap, pageMode))
            {
                using (var iter = page.GetIterator())
                {
                    iter.Begin();
                    do
                    {
                        text += iter.GetText(PageIteratorLevel.TextLine);
                    }while (iter.Next(PageIteratorLevel.TextLine));
                }
            }
            engines.Add(e);

            return(text);
        }
Exemplo n.º 5
0
        public void CanDetectOrientationForMode(
            [Values(PageSegMode.Auto,
                    PageSegMode.AutoOnly,
                    PageSegMode.AutoOsd,
                    PageSegMode.CircleWord,
                    PageSegMode.OsdOnly,
                    PageSegMode.SingleBlock,
                    PageSegMode.SingleBlockVertText,
                    PageSegMode.SingleChar,
                    PageSegMode.SingleColumn,
                    PageSegMode.SingleLine,
                    PageSegMode.SingleWord)]
            PageSegMode pageSegMode)
        {
            using (var img = Pix.LoadFromFile(@".\phototest.tif")) {
                using (var rotatedPix = img.Rotate((float)Math.PI)) {
                    using (var page = engine.Process(rotatedPix, pageSegMode)) {
                        Orientation orientation;
                        float       confidence;
                        page.DetectBestOrientation(out orientation, out confidence);

                        Assert.That(orientation, Is.EqualTo(Orientation.PageDown));
                    }
                }
            }
        }
Exemplo n.º 6
0
 internal Page(TesseractEngine engine, Pix image, string imageName, Rect regionOfInterest, PageSegMode pageSegmentMode)
 {
     Engine = engine;
     Image = image;
     ImageName = imageName;
     RegionOfInterest = regionOfInterest;
     PageSegmentMode = pageSegmentMode;
 }
Exemplo n.º 7
0
 internal Page(TesseractEngine engine, Pix image, string imageName, Rect regionOfInterest, PageSegMode pageSegmentMode)
 {
     Engine           = engine;
     Image            = image;
     ImageName        = imageName;
     RegionOfInterest = regionOfInterest;
     PageSegmentMode  = pageSegmentMode;
 }
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
     if (value is PageSegMode)
     {
         PageSegMode mode = (PageSegMode)value;
         return($"{(int)mode}.{mode.ToString()}");
     }
     return(null);
 }
Exemplo n.º 9
0
        public void SetPageSegMode(PageSegMode mode)
        {
            if (this.tesseract == null)
            {
                this.tesseract = new Tesseract();
            }

            tesseract.set_value(mode);
        }
Exemplo n.º 10
0
        //получение номера серии через с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе)
        //sourceImage = входное изображение, stepScale = шаг масштабирования, amountOfSteps = кол-во проходов рескейлинга
        public string getSeriaNumberViaRescaling(Image sourceImage, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            string seriaNumber = "";

            float scaleValue = 1.0f;//исходный масштаб

            List <string> seriaList = new List <string>();

            for (int k = 1; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                seriaList.Add(getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng));
            }

            seriaNumber = highestMatch(seriaList);

            ocrRus.Dispose();
            ocrEng.Dispose();

            return(seriaNumber);
        }
Exemplo n.º 11
0
 public string GetTextSurroundedByRectangle(Bitmap b, RectangleF r, PageSegMode pageSegMode)
 {
     if (!getScaled(b, ref r))
     {
         return(null);
     }
     using (Tesseract.Page page = engine.Process(b, new Rect((int)r.X, (int)r.Y, (int)r.Width, (int)r.Height), pageSegMode))
     {
         return(page.GetText());
     }
 }
Exemplo n.º 12
0
        public void CanParseText_UsingMode(PageSegMode mode, String expectedText)
        {
            using (var engine = CreateEngine()) {
                var demoFilename = String.Format("./Ocr/PSM_{0}.png", mode);
                using (var pix = LoadTestPix(demoFilename)) {
                    using (var page = engine.Process(pix, mode)) {
                        var text = page.GetText().Trim();

                        Assert.That(text, Is.EqualTo(expectedText));
                    }
                }
            }
        }
Exemplo n.º 13
0
        public void CanParseText_UsingMode(PageSegMode mode, String expectedText)
        {
            using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)) {
                var demoFilename = String.Format("./Data/Ocr/PSM_{0}.png", mode);
                using (var pix = Pix.LoadFromFile(demoFilename)) {
                    using (var page = engine.Process(pix, mode)) {
                        var text = page.GetText().Trim();

                        Assert.That(text, Is.EqualTo(expectedText));
                    }
                }
            }
        }
Exemplo n.º 14
0
		public void CanParseText_UsingMode(PageSegMode mode, String expectedText)
		{

			using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)) {
				var demoFilename = String.Format("./Data/Ocr/PSM_{0}.png", mode);
				using (var pix = Pix.LoadFromFile(demoFilename)) {
					using (var page = engine.Process(pix, mode)) {
						var text = page.GetText().Trim();

						Assert.That(text, Is.EqualTo(expectedText));

					}
				}    
			}
		}
Exemplo n.º 15
0
        //[DataRow(PageSegMode.SingleBlockVertText, "A line of text", Ignore = "Vertical data missing")]
        public void CanParseText_UsingMode(PageSegMode mode, string expectedText)
        {
            using (var engine = CreateEngine(mode: EngineMode.TesseractAndLstm))
            {
                var demoFilename = string.Format("./Ocr/PSM_{0}.png", mode);
                using (var pix = LoadTestPix(demoFilename))
                {
                    using (var page = engine.Process(pix, mode))
                    {
                        var text = page.GetText().Trim();

                        Assert.AreEqual(text, expectedText);
                    }
                }
            }
        }
Exemplo n.º 16
0
        /// <summary>
        /// Processes the specific image.
        /// </summary>
        /// <remarks>
        /// You can only have one result iterator open at any one time.
        /// </remarks>
        /// <param name="image">The image to process.</param>
        /// <param name="region">The image region to process.</param>
        /// <returns>A result iterator</returns>
        public Page Process(Pix image, Rect region, PageSegMode? pageSegMode = null)
        {
            if (image == null) throw new ArgumentNullException("image");
            if (region.X1 < 0 || region.Y1 < 0 || region.X2 > image.Width || region.Y2 > image.Height)
                throw new ArgumentException("The image region to be processed must be within the image bounds.", "region");
            if (processCount > 0) throw new InvalidOperationException("Only one image can be processed at once. Please make sure you dispose of the page once your finished with it.");

            processCount++;

            Interop.TessApi.BaseAPISetPageSegMode(handle, pageSegMode.HasValue ? pageSegMode.Value : DefaultPageSegMode);
            Interop.TessApi.BaseApiSetImage(handle, image.Handle);
            Interop.TessApi.BaseApiSetRectangle(handle, region.X1, region.Y1, region.Width, region.Height);

            var page = new Page(this);
            page.Disposed += OnIteratorDisposed;
            return page;
        }
Exemplo n.º 17
0
 /// <summary>
 /// 识别白底黑字的二值化字符图片
 /// </summary>
 /// <param name="bmp">白底黑字的二值化字符图片</param>
 /// <param name="mode">页面分析模式</param>
 /// <returns>识别出的字符串</returns>
 protected virtual string CrackCodeCore(Bitmap bmp, PageSegMode mode)
 {
     if (_engine == null)
     {
         throw new InvalidOperationException("Tesseract识别引擎 未初始化");
     }
     Tesseract.PageSegMode tmode = mode.CastTo(Tesseract.PageSegMode.Auto);
     using (Page page = _engine.Process(bmp, tmode))
     {
         string text = page.GetText().Replace("\n", "").Replace(" ", "");
         if (mode == PageSegMode.SingleBlockVertText)
         {
             text = text.ReverseString();
         }
         return(text);
     }
 }
Exemplo n.º 18
0
        private string tesseractGetOCR(string fileName, string tessDir, PageSegMode pageMode = PageSegMode.SingleLine)
        {
            //Console.WriteLine($"tessdir {tessDir}");

            using (var engine = new TesseractEngine(tessDir, "eng", EngineMode.Default, "bank.citic"))
            {
                using (var img = Pix.LoadFromFile(fileName))
                {
                    using (var page = engine.Process(img, pageMode))
                    {
                        var text = page.GetText();
                        text = text.Replace(" ", "");
                        text = text.Replace("\t", "");
                        text = text.Replace("\n", "");
                        text = text.Replace("\r", "");
                        text = text.Replace("~", "");
                        return(text.Trim());
                    }
                }
            }
        }
Exemplo n.º 19
0
        /// <summary>
        /// ocr 识别验证码
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="pageMode"></param>
        /// <returns></returns>
        private string OCRGetStringByImage(string fileName, PageSegMode pageMode = PageSegMode.SingleLine)
        {
            string dir     = System.Windows.Forms.Application.StartupPath;
            string tessDir = $"{dir}\\tessdata";

            using (var engine = new TesseractEngine(tessDir, "eng", EngineMode.Default, "bank.abc"))
            {
                using (var img = Pix.LoadFromFile(fileName))
                {
                    using (var page = engine.Process(img, pageMode))
                    {
                        var text = page.GetText();
                        text = text.Replace(" ", "");
                        text = text.Replace("\t", "");
                        text = text.Replace("\n", "");
                        text = text.Replace("\r", "");
                        text = text.Replace("~", "");
                        return(text.Trim());
                    }
                }
            }
        }
Exemplo n.º 20
0
        /// <summary>
        /// Recognize the license plate number from a given image
        /// </summary>
        /// <remarks>
        /// Uses a Tesseract OCR library to recognize the set of characters.
        /// When you would like to distinguish single character PageSegMode.SingleChar should be used,
        /// otherwise PageSegMode.SingleBlock will be applied.
        /// Tesseract uses already prepared training data which consists of built-in data set and
        /// special training set for polish license plates.
        /// </remarks>
        /// <param name="imgWithNumber">Mat containing the image of possible license plate area</param>
        /// <param name="pageMode">PageSegMode which should be used when recognizing the character </param>
        /// <returns>Recognized plate number</returns>
        private string RecognizeNumber(Mat imgWithNumber, PageSegMode pageMode = PageSegMode.SingleChar)
        {
            Tesseract.Character[] characters;

            StringBuilder licensePlateNumber = new StringBuilder();

            using (var ocr = new Tesseract())
            {
                ocr.Init(
                    _ocrParams["TEST_DATA_PATH"],
                    _ocrParams["TEST_DATA_LANG"],
                    OcrEngineMode.LstmOnly);

                ocr.SetVariable(
                    "tessedit_char_whitelist",
                    _ocrParams["WHITE_LIST"]);

                ocr.SetVariable
                    ("user_defined_dpi", "70");

                ocr.PageSegMode = pageMode;

                using (Mat tmp = imgWithNumber.Clone())
                {
                    ocr.SetImage(tmp);
                    ocr.Recognize();
                    characters = ocr.GetCharacters();

                    for (int i = 0; i < characters.Length; i++)
                    {
                        licensePlateNumber.Append(characters[i].Text);
                    }
                }

                return(licensePlateNumber.ToString());
            }
        }
Exemplo n.º 21
0
        public string OCRProcess(Bitmap originImg)
        {
            try {
                Bitmap cleanImg = originImg;
                if (!IsBlackFontWhiteBack(originImg))
                {
                    cleanImg = GetCleanImg(originImg);
                }


                PageSegMode pageSegMode = PageSegMode.Auto;
                if (originImg.Width < 100)
                {
                    pageSegMode = PageSegMode.SingleWord;
                }
                using (var page = TessOCR.Process(cleanImg, pageSegMode))
                {
                    string res = page.GetText();
                    res = res.Trim();
                    if (res.Equals(String.Empty))
                    {
                        saveFailImg(originImg);
                        saveFailImg(cleanImg);
                    }
                    page.Dispose();
                    return(res);
                }
            }
            catch (Exception ex) {
                errorInfo = ex.Message;

                File.AppendAllText("log.txt", String.Format("{0} {1}", DateTime.Now.ToString(), ex.Message));
            }

            return(String.Empty);
        }
Exemplo n.º 22
0
 /// <summary>
 /// Process the specified bitmap image.
 /// </summary>
 /// <remarks>
 /// Please consider <see cref="Process(Pix, PageSegMode?)"/> instead. This is because
 /// this method must convert the bitmap to a pix for processing which will add additional overhead.
 /// Leptonica also supports a large number of image pre-processing functions as well.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="pageSegMode">The page segmentation mode.</param>
 /// <returns></returns>
 public Page Process(Bitmap image, PageSegMode? pageSegMode = null)
 {
     return Process(image, new Rect(0, 0, image.Width, image.Height), pageSegMode);
 }
Exemplo n.º 23
0
 public static extern void BaseAPISetPageSegMode(IntPtr handle, PageSegMode mode);
Exemplo n.º 24
0
        public void SetPageSegMode(PageSegMode mode)
        {
            if (this.tesseract == null)
            {
                this.tesseract = new Tesseract();
            }

            tesseract.set_value(mode);
        }
Exemplo n.º 25
0
        private void ocrImage(ref List <Image> imagePdfPages, ref List <Image> imageScaledPages, ref List <pdfPageInfo> infoPages, object indexOfPage)
        {
            ///////////////////////////////////////////////////////////////////////////
            //распознаем изображение

            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            Regex regexFullNumberRus = new Regex(@"ТС[^\\n]+", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            Regex regexFullNumberEng = new Regex(@"TC[^\\n]+", RegexOptions.IgnoreCase | RegexOptions.Singleline);

            //Regex regexOrgSertTypeSeriaShortNumberRus = new Regex(@"[А-Я]{2}[0-9]{2}\W[0-9]{5}", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            Regex regexOrgSertTypeSeriaShortNumberRus = new Regex(@"[А-Я]{2}[0-9]{2}[А-Я]{1}[0-9]{5}", RegexOptions.IgnoreCase | RegexOptions.Singleline);

            //Regex regexSeriaNumber = new Regex(@"[0-9]{7}", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.RightToLeft);
            Regex regexSeriaNumber = new Regex(@"[0-9]{7}", RegexOptions.IgnoreCase);

            //берем страницу
            Bitmap imgBitmapOcrRus = (Bitmap)imageScaledPages[(int)indexOfPage];
            Bitmap imgBitmapOcrEng = (Bitmap)imageScaledPages[(int)indexOfPage];

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            string pdfTextRus = "";
            string pdfTextEng = "";

            //waitHandler.WaitOne();

            //удаляем процесс, чтобы не было ошибки
            using (var pageRus = ocrRus.Process(imgBitmapOcrRus, pSegMode)) {
                pdfTextRus = pageRus.GetText();
            }

            //удаляем процесс, чтобы не было ошибки
            using (var pageEng = ocrEng.Process(imgBitmapOcrEng, pSegMode)) {
                pdfTextEng = pageEng.GetText();
            }

            //waitHandler.Set();

            if (isSertificate(pdfTextRus))//сертификат
            //if (abbyOCR.isSertificateViaRescaling(imagePdfPages[(int)indexOfPage], 0.1f, 3))//сертификат
            {
                //////////////
                //tesOCR.getDataViaRescaling(imagePdfPages[j], ref infoPage, ref words, 0.1f, 10);
                pdfPageInfo infoPageABBY = abbyOCR.getDataViaRescaling(ref ocrTasks[(int)indexOfPage], imagePdfPages[(int)indexOfPage], 0.1f, 4);
                infoPageABBY.numberOfPDFPage_ = (int)indexOfPage;

                //////////////////////////////////////////////////

                //infoPages[(int)indexOfPage]=infoPageABBY;

                if ((int)indexOfPage != 0)
                {
                    ocrTasks[(int)indexOfPage - 1].Wait();
                }

                infoPages.Insert((int)indexOfPage, infoPageABBY);
            }
            else    //приложение
            //ждем завершения предыдущего такска, чтобы взять оттуда инфу
            //ocrTasks[(int)indexOfPage - 1].Wait();

            {
                pdfPageInfo infoPageABBY = abbyOCR.getDataViaRescaling(ref ocrTasks[(int)indexOfPage], imagePdfPages[(int)indexOfPage], 0.1f, 4);
                infoPageABBY.numberOfPDFPage_ = (int)indexOfPage;
                infoPageABBY.typeOfPage_      = typeOfPage.PRILOZENIE;

                //////////////////////////////////////////////////

                //infoPages[(int)indexOfPage]=infoPageABBY;

                if ((int)indexOfPage != 0)
                {
                    ocrTasks[(int)indexOfPage - 1].Wait();
                }

                infoPages.Insert((int)indexOfPage, infoPageABBY);

                /*//ждем завершения предыдущего такска, чтобы взять оттуда инфу
                 * ocrTasks[(int)indexOfPage - 1].Wait();
                 *
                 * pdfPageInfo infoPage = infoPages[infoPages.Count - 1];
                 *
                 * //если серт не распознали, то и приложение не распознаем
                 * if (infoPage.isTesseracted_ == false) {
                 *  infoPage.numberOfPDFPage_ = (int)indexOfPage;
                 *  infoPage.isTesseracted_ = false;
                 *  infoPage.typeOfPage_ = typeOfPage.PRILOZENIE;
                 *  infoPage.textRus_ = pdfTextRus;
                 *  infoPage.textEng_ = pdfTextEng;
                 *  infoPage.seriaNumber_ = "";
                 *
                 *  //infoPage.ocrMethod_ = ocrMethod.TESSERACT;
                 *  infoPage.ocrMethod_ = ocrMethod.ABBY;
                 *
                 *  infoPage.fullNumber_ = infoPage.techReglament_ + infoPage.typeOfSert_ + "-" + infoPage.country_ + "." + infoPage.orgSert_ + "." + infoPage.typeSeria_ + "." + infoPage.shortNumber_ + "." + infoPage.seriaNumber_;
                 *  infoPage.fullNumber_ = infoPage.fullNumber_.ToUpper();//ставим верхний регистр
                 *
                 *  //infoPages[(int)indexOfPage] = infoPage;
                 *  infoPages.Insert((int)indexOfPage, infoPage);
                 *
                 *  //освобождаем ресурсы
                 *  imgBitmapOcrRus.Dispose();
                 *  imgBitmapOcrEng.Dispose();
                 * }
                 *
                 * //если до этого было приложение, то seriaNumber+1
                 * if (infoPage.typeOfPage_ == typeOfPage.PRILOZENIE) {
                 *  infoPage.numberOfPDFPage_ = (int)indexOfPage;
                 *  infoPage.textRus_ = pdfTextRus;
                 *  infoPage.textEng_ = pdfTextEng;
                 *
                 *  int sertSeriaNumber = Convert.ToInt32(infoPage.seriaNumber_);
                 *  string clearSeriaNumber = "0000000";
                 *  string prilSeriaNumber = Convert.ToString(sertSeriaNumber + 1);
                 *
                 *  int amountOfSymbolsSSN = prilSeriaNumber.Length;
                 *  int amountClearSN = clearSeriaNumber.Length;
                 *
                 *  //clearSeriaNumber=clearSeriaNumber.Remove(2, 5).Insert(2, prilSeriaNumber);
                 *  clearSeriaNumber = clearSeriaNumber.Remove(amountClearSN - amountOfSymbolsSSN, amountOfSymbolsSSN).Insert(amountClearSN - amountOfSymbolsSSN, prilSeriaNumber);
                 *
                 *  infoPage.seriaNumber_ = clearSeriaNumber;
                 *  infoPage.fullNumber_ = infoPage.techReglament_ + infoPage.typeOfSert_ + "-" + infoPage.country_ + "." + infoPage.orgSert_ + "." + infoPage.typeSeria_ + "." + infoPage.shortNumber_ + "." + infoPage.seriaNumber_;
                 *  //infoPage.ocrMethod_ = ocrMethod.TESSERACT;
                 *  infoPage.ocrMethod_ = ocrMethod.ABBY;
                 *  infoPage.isTesseracted_ = true;
                 *
                 *  infoPage.fullNumber_ = infoPage.fullNumber_.ToUpper();//ставим верхний регистр
                 *
                 *  //infoPages[(int)indexOfPage] = infoPage;
                 *  infoPages.Insert((int)indexOfPage, infoPage);
                 * }
                 *
                 * infoPage.numberOfPDFPage_ = (int)indexOfPage;
                 * infoPage.isTesseracted_ = false;
                 * infoPage.typeOfPage_ = typeOfPage.PRILOZENIE;
                 * //infoPage.ocrMethod_ = ocrMethod.TESSERACT;
                 * infoPage.ocrMethod_ = ocrMethod.ABBY;
                 * infoPage.textRus_ = pdfTextRus;
                 * infoPage.textEng_ = pdfTextEng;
                 *
                 * //infoPage.seriaNumber_ = tesOCR.getSeriaNumber(pdfTextRus, pdfTextEng);
                 * infoPage.seriaNumber_ = abbyOCR.getSeriaNumberViaRescaling(imagePdfPages[(int)indexOfPage], 0.1f, 3);
                 * infoPage.fullNumber_ = infoPage.techReglament_ + infoPage.typeOfSert_ + "-" + infoPage.country_ + "." + infoPage.orgSert_ + "." + infoPage.typeSeria_ + "." + infoPage.shortNumber_ + "." + infoPage.seriaNumber_;
                 *
                 * if (infoPage.seriaNumber_ == "") {
                 *  infoPage.isTesseracted_ = false;
                 * } else {
                 *  infoPage.isTesseracted_ = true;
                 * }
                 *
                 * infoPage.fullNumber_ = infoPage.fullNumber_.ToUpper();//ставим верхний регистр
                 *
                 * //infoPages[(int)indexOfPage] = infoPage;
                 * infoPages.Insert((int)indexOfPage, infoPage);*/
            }

            //освобождаем ресурсы
            imgBitmapOcrRus.Dispose();
            imgBitmapOcrEng.Dispose();
        }
Exemplo n.º 26
0
 /// <inheritdoc />
 public void BaseApiSetPageSegMode(IEngineHandle engine,
                                   PageSegMode mode
                                   )
 {
     UnsafeTesseractPrimitives.BaseAPISetPageSegMode(engine.Handle, (int)mode);
 }
Exemplo n.º 27
0
 public static extern void BaseAPISetPageSegMode(IntPtr handle, PageSegMode mode);
Exemplo n.º 28
0
 /// <summary>
 /// Processes the specific image.
 /// </summary>
 /// <remarks>
 /// You can only have one result iterator open at any one time.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="inputName">Sets the input file's name, only needed for training or loading a uzn file.</param>
 /// <param name="pageSegMode">The page layout analyasis method to use.</param>
 public Page Process(Pix image, string inputName, PageSegMode? pageSegMode = null)
 {
     return Process(image, inputName, new Rect(0, 0, image.Width, image.Height), pageSegMode);
 }
Exemplo n.º 29
0
        public void getDataViaRescaling(Image sourceImage, ref Tesseract_OCR_Window.pdfPageInfo infoPage, ref Dictionary <string, string> replaceWords, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            float scaleValue = 1.0f;//исходный масштаб

            List <string> seriaNumberList = new List <string>();
            List <string> countryList     = new List <string>();
            List <string> orgSertList     = new List <string>();
            List <string> shortNumberList = new List <string>();
            List <string> typeSeriaList   = new List <string>();

            for (int k = 0; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                //набираем статистику для последующего поиска наибольшего соответствия
                string seriaNumber = getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng);
                string country     = getCountry(rescaledPageTextEng);
                string orgSert     = getOrgSert(rescaledPageTextRus);
                string shortNumber = getShortNumber(rescaledPageTextRus);
                string typeSeria   = getTypeSeria(rescaledPageTextRus, rescaledPageTextEng, ref replaceWords);

                if (seriaNumber != "")
                {
                    seriaNumberList.Add(seriaNumber);//серия
                }

                if (country != "")
                {
                    countryList.Add(country);//страна
                }

                if (orgSert != "")
                {
                    orgSertList.Add(orgSert);//орган по сертификации
                }

                if (shortNumber != "")
                {
                    shortNumberList.Add(shortNumber);//shortNumber
                }

                if (typeSeria != "")
                {
                    typeSeriaList.Add(typeSeria);//тип серии
                }
            }

            ocrRus.Dispose();
            ocrEng.Dispose();

            //собираем данные для структуры infoPage
            infoPage.seriaNumber_ = highestMatch(seriaNumberList);
            infoPage.country_     = highestMatch(countryList);
            infoPage.orgSert_     = highestMatch(orgSertList);
            infoPage.shortNumber_ = highestMatch(shortNumberList);
            infoPage.typeSeria_   = highestMatch(typeSeriaList);
        }
Exemplo n.º 30
0
 public void set_value(PageSegMode mode)
 {
     this.mode = mode;
 }
Exemplo n.º 31
0
 internal static extern void BaseAPISetPageSegMode(HandleRef handle, PageSegMode mode);
Exemplo n.º 32
0
 public static extern void BaseAPISetPageSegMode(HandleRef handle, PageSegMode mode);
Exemplo n.º 33
0
        /// <summary>
        /// 识别验证码
        /// </summary>
        /// <param name="bmp">要识别的图像</param>
        /// <param name="mode">页面分析模式</param>
        /// <returns>识别出的字符串</returns>
        public string CrackCode(Bitmap bmp, PageSegMode mode)
        {
            Bitmap binBmp = Binary(bmp);

            return(CrackCodeCore(binBmp, mode));
        }
Exemplo n.º 34
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                printUsage("");
                return;
            }
            if ((args.Length == 1 && args[0] == "-v") || (args.Length == 1 && args[0] == "--version"))
            {
                Console.WriteLine(string.Format("tesseract-{0}", TessBaseAPI.Version()));
                Console.ReadKey();
                return;
            }

            string lang   = "eng";
            string image  = "";
            string output = "";

            PageSegMode pagesegmode = PageSegMode.PSM_AUTO;
            int         arg         = 0;
            int         argc        = args.Length;

            while (arg < argc && (output == string.Empty || args[arg].StartsWith("-")))
            {
                if (args[arg] == "-l" && arg + 1 < argc)
                {
                    lang = args[arg + 1];
                    ++arg;
                }
                else if (args[arg] == "-psm" && arg + 1 < argc)
                {
                    //assign pagesegmode

                    ++arg;
                }
                else if (image == string.Empty)
                {
                    image = args[arg];
                }
                else if (output == string.Empty)
                {
                    output = args[arg];
                }
                ++arg;
            }

            if (string.IsNullOrEmpty(output))
            {
                printUsage(args[0]);
                return;
            }

            TessBaseAPI api = new TessBaseAPI();

            api.SetOutputName(output);
            api.SetPageSegMode(pagesegmode);
            api.Init(args[0],
                     lang,
                     OcrEngineMode.OEM_DEFAULT,
                     args[arg - 1],
                     argc - arg,
                     null,
                     null,
                     false);
            Console.WriteLine(string.Format("Tesseract Open Source OCR Engine v{0} with Leptonica\n",
                                            TessBaseAPI.Version()));

            string text_out = string.Empty;

            if (!api.ProcessPages(image, null, 0, ref text_out))
            {
                Console.WriteLine("Error during processing.\n");
            }

            bool output_hocr = false;

            api.GetBoolVariable("tessedit_create_hocr", ref output_hocr);
            bool output_box = false;

            api.GetBoolVariable("tessedit_create_boxfile", ref output_box);
            string outfile = output;

            outfile += output_hocr ? ".html" : output_box ? ".box" : ".txt";

            File.WriteAllText(outfile, text_out);
        }
Exemplo n.º 35
0
 /// <summary>
 /// Process the specified bitmap image.
 /// </summary>
 /// <remarks>
 /// Please consider <see cref="TesseractEngine.Process(Pix, String, Rect, PageSegMode?)"/> instead. This is because
 /// this method must convert the bitmap to a pix for processing which will add additional overhead.
 /// Leptonica also supports a large number of image pre-processing functions as well.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="inputName">Sets the input file's name, only needed for training or loading a uzn file.</param>
 /// <param name="region">The region of the image to process.</param>
 /// <param name="pageSegMode">The page segmentation mode.</param>
 /// <returns></returns>
 public Page Process(Bitmap image, string inputName, Rect region, PageSegMode? pageSegMode = null)
 {
     using (var pix = PixConverter.ToPix(image)) {
         return Process(pix, inputName, region, pageSegMode);
     }
 }
Exemplo n.º 36
0
 /// <summary>
 /// Processes a specified region in the image using the specified page layout analysis mode.
 /// </summary>
 /// <remarks>
 /// You can only have one result iterator open at any one time.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="region">The image region to process.</param>
 /// <param name="pageSegMode">The page layout analyasis method to use.</param>
 /// <returns>A result iterator</returns>
 public Page Process(Pix image, Rect region, PageSegMode? pageSegMode = null)
 {
     return Process(image, null, region, pageSegMode);
 }
Exemplo n.º 37
0
 internal static extern void TessBaseAPISetPageSegMode(IntPtr ocr, PageSegMode mode);
        /// <summary>
        /// 图片文字识别
        /// </summary>
        /// <param name="imageUrl">图片路径</param>
        /// <param name="tessdataUrl">语言包路径</param>
        /// <param name="language">语言包名称</param>
        /// <param name="variableData">设置识别变量,默认识别数字</param>
        /// <param name="pageSegMode">PageSegMode</param>
        /// <returns></returns>
        public static string Identity(string imageUrl, string tessdataUrl, string language = "eng", string variableData = "0123456789", PageSegMode pageSegMode = PageSegMode.Auto)
        {
            Bitmap          bitmap          = null;
            TesseractEngine tesseractEngine = null;
            Page            page            = null;

            try
            {
                bitmap = new Bitmap(imageUrl);

                tesseractEngine = new TesseractEngine(tessdataUrl, language, EngineMode.Default);
                if (!string.IsNullOrEmpty(variableData))
                {
                    tesseractEngine.SetVariable("tessedit_char_whitelist", variableData);
                }
                page = tesseractEngine.Process(PixConverter.ToPix(bitmap), pageSegMode);
                return(page.GetText());
            }
            catch
            {
                throw;
            }
            finally
            {
                if (bitmap != null)
                {
                    bitmap.Dispose();
                }
                if (page != null)
                {
                    page.Dispose();
                }
                if (tesseractEngine != null)
                {
                    tesseractEngine.Dispose();
                }
            }
        }
        /// <summary>
        /// Processes a specified region in the image using the specified page layout analysis mode.
        /// </summary>
        /// <remarks>
        /// You can only have one result iterator open at any one time.
        /// </remarks>
        /// <param name="image">The image to process.</param>
        /// <param name="inputName">Sets the input file's name, only needed for training or loading a uzn file.</param>
        /// <param name="region">The image region to process.</param>
        /// <param name="pageSegMode">The page layout analyasis method to use.</param>
        /// <returns>A result iterator</returns>
        public Page Process(Pix image, string inputName, Rect region, PageSegMode? pageSegMode = null)
        {
            if (image == null) throw new ArgumentNullException("image");
            if (region.X1 < 0 || region.Y1 < 0 || region.X2 > image.Width || region.Y2 > image.Height)
                throw new ArgumentException("The image region to be processed must be within the image bounds.", "region");
            if (processCount > 0) throw new InvalidOperationException("Only one image can be processed at once. Please make sure you dispose of the page once your finished with it.");

            processCount++;

            var actualPageSegmentMode = pageSegMode.HasValue ? pageSegMode.Value : DefaultPageSegMode;
            Interop.TessApi.Native.BaseAPISetPageSegMode(handle, actualPageSegmentMode);
            Interop.TessApi.Native.BaseApiSetImage(handle, image.Handle);
            if(!String.IsNullOrEmpty(inputName)) {
                Interop.TessApi.Native.BaseApiSetInputName(handle, inputName);
            }
            var page = new Page(this, image, inputName, region, actualPageSegmentMode);
            page.Disposed += OnIteratorDisposed;
            return page;
        }
Exemplo n.º 40
0
        //!!!abandoned for GetCharBoxsSurroundedByRectangle() because:
        //- it does not give good end lines;
        //- it does not accept expilicitly TextAutoInsertSpace
        //public string GetTextSurroundedByRectangle(Bitmap b, RectangleF r, PageSegMode pageSegMode)
        //{
        //    if (!getScaled(b, ref r))
        //        return string.Empty;
        //    using (Tesseract.Page page = engine.Process(b, new Rect((int)r.X, (int)r.Y, (int)r.Width, (int)r.Height), pageSegMode))
        //    {
        //        return page.GetText();
        //    }
        //}

        public List <CharBox> GetCharBoxsSurroundedByRectangle(Bitmap b, RectangleF r, PageSegMode pageSegMode)
        {
            if (!getScaled(b, ref r))
            {
                return(null);
            }
            using (Tesseract.Page page = engine.Process(b, new Rect((int)r.X, (int)r.Y, (int)r.Width, (int)r.Height), pageSegMode))
            {
                return(getCharBoxs(page));
            }
        }
Exemplo n.º 41
0
        //получение всех данные по странице с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе)
        //sourceImage = входное изображение, stepScale = шаг масштабирования, amountOfSteps = кол-во проходов рескейлинга,
        //infoPage = ссылка на структуру для заполнения
        public void getData(Image sourceImage, ref Tesseract_OCR_Window.pdfPageInfo infoPage, ref Dictionary <string, string> replaceWords, float stepScale, int amountOfSteps)
        {
            //подключаем распознаватель
            TesseractEngine ocrRus = new TesseractEngine("./tessdata", "rus", EngineMode.Default);
            TesseractEngine ocrEng = new TesseractEngine("./tessdata", "eng", EngineMode.Default);

            //создаем графический фильтр
            TResizeTool resizeTool = new TResizeTool();

            //ставим методику распознавания страницы
            PageSegMode pSegMode = PageSegMode.SparseText;

            string seriaNumber = ""; //серия
            string country     = ""; //страна
            string orgSert     = ""; //организация
            string shortNumber = ""; //short number
            string typeSeria   = ""; //тип серии

            float scaleValue = 1.0f; //исходный масштаб

            for (int k = 0; k <= amountOfSteps; k++)
            {
                //по индексу отмасш-й страницы берем исходную(без масштаба)
                Image img = sourceImage;

                int newWidth  = Convert.ToInt32((img.Width) * ((k * stepScale) + scaleValue));
                int newHeight = Convert.ToInt32((img.Height) * ((k * stepScale) + scaleValue));

                Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight);

                Image rescaledPage = ((Image)imgBitmap);

                string rescaledPageTextRus = "";
                string rescaledPageTextEng = "";

                //удаляем процесс, чтобы не было ошибки
                using (var pageRus = ocrRus.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextRus = pageRus.GetText();
                }

                //удаляем процесс, чтобы не было ошибки
                using (var pageEng = ocrEng.Process(imgBitmap, pSegMode))
                {
                    rescaledPageTextEng = pageEng.GetText();
                }

                //собираем данные для структуры infoPage
                if (infoPage.seriaNumber_ == "")
                {
                    seriaNumber = getSeriaNumber(rescaledPageTextRus, rescaledPageTextEng);//серия

                    if (seriaNumber != "")
                    {
                        infoPage.seriaNumber_ = seriaNumber;
                    }
                }

                if (infoPage.country_ == "")
                {
                    country = getCountry(rescaledPageTextEng);

                    if (country != "")
                    {
                        infoPage.country_ = country;
                    }
                }

                if (infoPage.orgSert_ == "")
                {
                    orgSert = getOrgSert(rescaledPageTextRus);

                    if (orgSert != "")
                    {
                        infoPage.orgSert_ = orgSert;
                    }
                }

                if (infoPage.shortNumber_ == "")
                {
                    shortNumber = getShortNumber(rescaledPageTextRus);

                    if (shortNumber != "")
                    {
                        infoPage.shortNumber_ = shortNumber;
                    }
                }

                if (infoPage.typeSeria_ == "")
                {
                    typeSeria = getTypeSeria(rescaledPageTextRus, rescaledPageTextEng, ref replaceWords);

                    if (typeSeria != "")
                    {
                        infoPage.typeSeria_ = typeSeria;
                    }
                }
            }

            ocrRus.Dispose();
            ocrEng.Dispose();
        }
Exemplo n.º 42
0
 /// <summary>
 /// Processes a specified region in the image using the specified page layout analysis mode.
 /// </summary>
 /// <remarks>
 /// You can only have one result iterator open at any one time.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="region">The image region to process.</param>
 /// <param name="pageSegMode">The page layout analyasis method to use.</param>
 /// <returns>A result iterator</returns>
 public Page Process(Pix image, Rect region, PageSegMode? pageSegMode = null)
 {
     return Process(image, null, new Rect(0, 0, image.Width, image.Height), pageSegMode);
 }
Exemplo n.º 43
0
 internal static extern void TessBaseAPISetPageSegMode(IntPtr ocr, PageSegMode mode);
Exemplo n.º 44
0
 public void set_value(PageSegMode mode)
 {
     this.mode = mode;
 }
Exemplo n.º 45
0
  /// <summary>
 /// Process the specified bitmap image.
 /// </summary>
 /// <remarks>
 /// Please consider <see cref="TesseractEngine.Process(Pix, String, Rect, PageSegMode?)"/> instead. This is because
 /// this method must convert the bitmap to a pix for processing which will add additional overhead.
 /// Leptonica also supports a large number of image pre-processing functions as well.
 /// </remarks>
 /// <param name="image">The image to process.</param>
 /// <param name="inputName">Sets the input file's name, only needed for training or loading a uzn file.</param>
 /// <param name="region">The region of the image to process.</param>
 /// <param name="pageSegMode">The page segmentation mode.</param>
 /// <returns></returns>
 public Page Process(Bitmap image, string inputName, Rect region, PageSegMode? pageSegMode = null)
 {
 	var pix = PixConverter.ToPix(image);
     var page = Process(pix, inputName, region, pageSegMode);
     new PageDisposalHandle(page, pix);
     return page;
 }