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")); } } } }
public List <CharBox> GetCharBoxs(Bitmap b, PageSegMode pageSegMode) { using (Tesseract.Page page = engine.Process(b, pageSegMode)) { return(getCharBoxs(page)); } }
public string GetHtml(Bitmap b, PageSegMode pageSegMode) { using (Tesseract.Page page = engine.Process(b, pageSegMode)) { return(page.GetHOCRText(0, false)); } }
/// <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); }
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)); } } } }
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); }
public void SetPageSegMode(PageSegMode mode) { if (this.tesseract == null) { this.tesseract = new Tesseract(); } tesseract.set_value(mode); }
//получение номера серии через с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе) //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); }
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()); } }
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)); } } } }
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)); } } } }
//[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); } } } }
/// <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; }
/// <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); } }
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()); } } } }
/// <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()); } } } }
/// <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()); } }
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); }
/// <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); }
public static extern void BaseAPISetPageSegMode(IntPtr handle, PageSegMode mode);
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(); }
/// <inheritdoc /> public void BaseApiSetPageSegMode(IEngineHandle engine, PageSegMode mode ) { UnsafeTesseractPrimitives.BaseAPISetPageSegMode(engine.Handle, (int)mode); }
/// <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); }
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); }
public void set_value(PageSegMode mode) { this.mode = mode; }
internal static extern void BaseAPISetPageSegMode(HandleRef handle, PageSegMode mode);
public static extern void BaseAPISetPageSegMode(HandleRef handle, PageSegMode mode);
/// <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)); }
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); }
/// <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); } }
/// <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); }
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; }
//!!!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)); } }
//получение всех данные по странице с помощью масштабирования страницы с разным шагом(исп-ть, если не находит на исходном масштабе) //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(); }
/// <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); }
/// <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; }