/// <summary> /// Get segmented regions at specified page iterator level. /// </summary> /// <param name="pageIteratorLevel">PageIteratorLevel enum</param> /// <returns></returns> public List <Rectangle> GetSegmentedRegions(PageIteratorLevel pageIteratorLevel) { var boxArray = Interop.TessApi.Native.BaseAPIGetComponentImages(Engine.Handle, pageIteratorLevel, Interop.Constants.TRUE, IntPtr.Zero, IntPtr.Zero); int boxCount = Interop.LeptonicaApi.Native.boxaGetCount(new HandleRef(this, boxArray)); List <Rectangle> boxList = new List <Rectangle>(); for (int i = 0; i < boxCount; i++) { var box = Interop.LeptonicaApi.Native.boxaGetBox(new HandleRef(this, boxArray), i, PixArrayAccessType.Clone); if (box == IntPtr.Zero) { continue; } int px, py, pw, ph; Interop.LeptonicaApi.Native.boxGetGeometry(new HandleRef(this, box), out px, out py, out pw, out ph); boxList.Add(new Rectangle(px, py, pw, ph)); Interop.LeptonicaApi.Native.boxDestroy(ref box); } Interop.LeptonicaApi.Native.boxaDestroy(ref boxArray); return(boxList); }
private static IEnumerable <RecognizedTextChunk> recognizeWords(PdfPage page, TesseractEngine engine, int resolution, string tempFileName) { // Save PDF page as high-resolution image PdfDrawOptions options = PdfDrawOptions.Create(); options.BackgroundColor = new PdfRgbColor(255, 255, 255); options.HorizontalResolution = resolution; options.VerticalResolution = resolution; page.Save(tempFileName, options); using (var img = Pix.LoadFromFile(tempFileName)) { using (var recognizedPage = engine.Process(img)) { using (ResultIterator iter = recognizedPage.GetIterator()) { const PageIteratorLevel Level = PageIteratorLevel.Word; iter.Begin(); do { if (iter.TryGetBoundingBox(Level, out Rect bounds)) { string text = iter.GetText(Level); float confidence = iter.GetConfidence(Level); yield return(new RecognizedTextChunk(text, bounds, confidence)); } } while (iter.Next(Level)); } } } }
public static extern int TessPageIteratorBoundingBox( PageIterator handle, PageIteratorLevel level, out int left, out int top, out int right, out int bottom);
public int PageIteratorIsAtFinalElement(IntPtr handle, PageIteratorLevel level, PageIteratorLevel element ) { return(UnsafeTesseractPrimitives.PageIteratorIsAtFinalElement(handle, (int)level, (int)element)); }
public IEnumerable <TextEntry> Extract(string imagePath) { List <TextEntry> texts = new List <TextEntry>(); PageIteratorLevel mode = PageIteratorLevel.Word; TesseractEngine engine = new TesseractEngine(System.IO.Directory.GetCurrentDirectory(), "eng", EngineMode.Default); var pixImage = Pix.LoadFromFile(imagePath); var page = engine.Process(pixImage); Point imageSize = new Point(pixImage.Width, pixImage.Height); var iterator = page.GetIterator(); iterator.Begin(); while (iterator.Next(mode)) { if (iterator.TryGetBoundingBox(mode, out Tesseract.Rect bounds)) { texts.Add(new TextEntry() { Position = new Point(bounds.X1 / (double)pixImage.Width, bounds.Y1 / (double)pixImage.Height), Text = iterator.GetText(mode) }); } } iterator.Dispose(); return(texts); }
/// <summary> /// Moves to the start of the next element at the given level. /// </summary> /// <remarks> /// /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool Next(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) return false; return Interop.TessApi.Native.PageIteratorNext(handle, level) != 0; }
public IEnumerable <Result> Results(PageIteratorLevel level) { var pageIterationLevel = GetPageIteratorLevel(level); return(_api.RecognizedBlocksByIteratorLevel(pageIterationLevel) .Select(ConvertToResult)); }
/// <summary> /// Gets segmented regions at specified page iterator level. /// </summary> /// <param name="image"></param> /// <param name="level"></param> /// <returns></returns> public override List <Rectangle> GetSegmentedRegions(Bitmap image, PageIteratorLevel level) { using (var engine = new TesseractEngine(Datapath, Language, EngineMode.Default)) { List <Rectangle> boxes = engine.GetSegmentedRegions(image, level); return(boxes); } }
public float GetConfidence(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) return 0f; return Interop.TessApi.Native.ResultIteratorGetConfidence(handle, level); }
public void GetTextReturnNullForEachLevel(PageIteratorLevel level) { using (var page = Engine.Process(EmptyPix)) { using (var iter = page.GetIterator()) { Assert.That(iter.GetText(level), Is.Null); } } }
/// <summary> /// Moves to the start of the next element at the given level. /// </summary> /// <remarks> /// /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool Next(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(false); } return(TessApi.Native.PageIteratorNext(handle, level) != 0); }
/// <summary> /// Moves the iterator to the next <paramref name="element"/> iff the iterator is not currently pointing to the last <paramref name="element"/> in the specified <paramref name="level"/> (i.e. the last word in the paragraph). /// </summary> /// <param name="level">The iterator level.</param> /// <param name="element">The page level.</param> /// <returns><c>True</c> iff there is another <paramref name="element"/> to advance too and the current element is not the last element at the given level; otherwise returns <c>False</c>.</returns> public bool Next(PageIteratorLevel level, PageIteratorLevel element) { var isAtFinalElement = IsAtFinalOf(level, element); if (!isAtFinalElement) { return Next(element); } else { return false; } }
public IntPtr PageIteratorGetImage(IntPtr handle, PageIteratorLevel level, int padding, out int left, out int top ) { return(UnsafeTesseractPrimitives.PageIteratorGetImage(handle, (int)level, padding, out left, out top)); }
public Pix GetBinaryImage(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return null; } return Pix.Create(Interop.TessApi.Native.PageIteratorGetBinaryImage(handle, level)); }
public string GetText(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return String.Empty; } return Interop.TessApi.ResultIteratorGetUTF8Text(handle, level); }
// Grab text from image private string GetText(TessBaseAPI tessBaseAPI, int partX, int partY) { // These can change depending on resolution, HUD scaling, or UI changes // For now, only supports 1440p with full HUD scaling // TODO: Dynamic scaling const int BOXWIDTH = 311; const int BOXHEIGHT = 33; // Set image location start tessBaseAPI.SetRectangle(partX, partY, BOXWIDTH, BOXHEIGHT); // Recognize image tessBaseAPI.Recognize(); ResultIterator resultIterator = tessBaseAPI.GetIterator(); // Extract text from result iterator StringBuilder stringBuilder = new StringBuilder(); PageIteratorLevel pageIteratorLevel = PageIteratorLevel.RIL_PARA; do { stringBuilder.Append(resultIterator.GetUTF8Text(pageIteratorLevel)); } while (resultIterator.Next(pageIteratorLevel)); // Fix up string for Warframe.market stringBuilder = stringBuilder.Replace("\n", String.Empty); string guess = stringBuilder.ToString(); // Changed to use Levenshtein here due to important of having a matching "Blueprint" word Levenshtein levBP = new Fastenshtein.Levenshtein("Blueprint"); int levBPDistance = levBP.DistanceFrom(guess); Debug.WriteLine("Distance from Blueprint: " + levBPDistance); // If there is a 4-character difference, accept the word is == "Blueprint" // Adjust the offset for 2-lined parts if (levBPDistance < 5) { guess = GetText(tessBaseAPI, partX, 550); } // Match whatever result we get to the closest selling item name from Warframe.market // We want to ignore "Blueprint" because this indicates that it's a 2-lined item if (guess != "Blueprint" && !guess.Contains("Forma")) { Debug.Write(""); Debug.Write("Old: " + guess); guess = FindClosestWord(guess); Debug.WriteLine(" | New: " + guess); } return(guess); }
/// <summary> /// Moves the iterator to the next <paramref name="element"/> iff the iterator is not currently pointing to the last <paramref name="element"/> in the specified <paramref name="level"/> (i.e. the last word in the paragraph). /// </summary> /// <param name="level">The iterator level.</param> /// <param name="element">The page level.</param> /// <returns><c>True</c> iff there is another <paramref name="element"/> to advance too and the current element is not the last element at the given level; otherwise returns <c>False</c>.</returns> public bool Next(PageIteratorLevel level, PageIteratorLevel element) { var isAtFinalElement = this.IsAtFinalOf(level, element); if (!isAtFinalElement) { return(this.Next(element)); } return(false); }
/// <summary> /// Returns <c>True</c> if the iterator is at the first element at the given level. /// </summary> /// <remarks> /// A possible use is to determin if a call to next(word) moved to the start of a new paragraph. /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool IsAtBeginningOf(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(false); } return(TessApiSignatures.PageIteratorIsAtBeginningOf(handle, level)); }
public int PageIteratorBoundingBox(IntPtr handle, PageIteratorLevel level, out int left, out int top, out int right, out int bottom ) { return(UnsafeTesseractPrimitives.PageIteratorBoundingBox(handle, (int)level, out left, out top, out right, out bottom)); }
public int PageIteratorBaseline(IntPtr handle, PageIteratorLevel level, out int x1, out int y1, out int x2, out int y2 ) { return(UnsafeTesseractPrimitives.PageIteratorBaseline(handle, (int)level, out x1, out y1, out x2, out y2)); }
public float GetConfidence(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(0f); } return(Interop.TessApi.Native.ResultIteratorGetConfidence(handle, level)); }
public string GetText(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(String.Empty); } return(Interop.TessApi.ResultIteratorGetUTF8Text(handle, level)); }
public Pix GetBinaryImage(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(null); } return(Pix.Create(TessApi.Native.PageIteratorGetBinaryImage(handle, level))); }
/// <summary> /// Returns <c>True</c> if the iterator is at the first element at the given level. /// </summary> /// <remarks> /// A possible use is to determin if a call to next(word) moved to the start of a new paragraph. /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool IsAtBeginningOf(PageIteratorLevel level) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(false); } return(Interop.TessApi.Native.PageIteratorIsAtBeginningOf(handle, level) != 0); }
/// <summary> /// Returns <c>True</c> if the iterator is positioned at the last element at the given level. /// </summary> /// <param name="level"></param> /// <param name="element"></param> /// <returns></returns> public bool IsAtFinalOf(PageIteratorLevel level, PageIteratorLevel element) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { return(false); } return(TessApi.Native.PageIteratorIsAtFinalElement(handle, level, element) != 0); }
public Pix GetImage(PageIteratorLevel level, int padding, Pix originalImage, out int left, out int top) { var pointer = Native.DllImports.TessPageIteratorGetImage(handleRef, level, padding, (HandleRef)originalImage, out left, out top); if (IntPtr.Zero != pointer) { return(new Pix(pointer)); } return(null); }
public Pix GetBinaryImage(PageIteratorLevel level) { var pointer = Native.DllImports.TessPageIteratorGetBinaryImage(handleRef, level); if (IntPtr.Zero != pointer) { return(new Pix(pointer)); } return(null); }
public static string ResultIteratorGetUTF8Text(HandleRef handle, PageIteratorLevel level) { var txtHandle = Native.ResultIteratorGetUTF8TextInternal(handle, level); if (txtHandle != IntPtr.Zero) { var result = MarshalHelper.PtrToString(txtHandle, Encoding.UTF8); Native.DeleteText(txtHandle); return(result); } return(null); }
/// <summary> /// Gets the bounding rectangle of the current element at the given level. /// </summary> /// <param name="level"></param> /// <param name="bounds"></param> /// <returns></returns> public bool TryGetBoundingBox(PageIteratorLevel level, out Rect bounds) { int x1, y1, x2, y2; if (TessApi.Native.PageIteratorBoundingBox(this.handle, level, out x1, out y1, out x2, out y2) != 0) { bounds = Rect.FromCoords(x1, y1, x2, y2); return(true); } bounds = Rect.Empty; return(false); }
public Pix GetImage(PageIteratorLevel level, int padding, out int x, out int y) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { x = 0; y = 0; return null; } return Pix.Create(Interop.TessApi.Native.PageIteratorGetImage(handle, level, padding, out x, out y)); }
/// <summary> /// Moves the iterator to the next <paramref name="element" /> iff the iterator is not currently pointing to the last /// <paramref name="element" /> in the specified <paramref name="level" /> (i.e. the last word in the paragraph). /// </summary> /// <param name="level">The iterator level.</param> /// <param name="element">The page level.</param> /// <returns> /// <c>True</c> iff there is another <paramref name="element" /> to advance too and the current element is not the /// last element at the given level; otherwise returns <c>False</c>. /// </returns> public bool Next(PageIteratorLevel level, PageIteratorLevel element) { VerifyNotDisposed(); var isAtFinalElement = IsAtFinalOf(level, element); if (!isAtFinalElement) { return(Next(element)); } return(false); }
public Pix GetImage(PageIteratorLevel level, int padding, out int x, out int y) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) { x = 0; y = 0; return(null); } return(Pix.Create(TessApi.Native.PageIteratorGetImage(handle, level, padding, page.Image.Handle, out x, out y))); }
/// <summary> /// Returns the baseline of the current object at the given level. The baseline is the line that passes through (x1, y1) and (x2, y2). WARNING: with vertical text, baselines may be vertical! Returns null if there is no baseline at the current position. /// </summary> /// <param name="level">Page iterator level</param> /// <returns>The baseline of the current object at the given level</returns> public LineSegment2D? GetBaseLine(PageIteratorLevel level) { int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 0; bool found = OcrInvoke.TessPageIteratorGetBaseLine(_ptr, level, ref x1, ref y1, ref x2, ref y2); if (!found) return null; else return new LineSegment2D(new Point(x1, y1), new Point(x2, y2) ); }
private List <string> run_tessract() { List <string> re = new List <string>(); string dataPath = "./tessdata/"; string language = 1 != 1 ? "eng" : "jpn"; string inputFile = "./_tmp.bmp"; OcrEngineMode oem = OcrEngineMode.DEFAULT; PageSegmentationMode psm = PageSegmentationMode.AUTO_OSD; TessBaseAPI tessBaseAPI = new TessBaseAPI(); // Initialize tesseract-ocr if (!tessBaseAPI.Init(dataPath, language, oem)) { throw new Exception("Could not initialize tesseract."); } // Set the Page Segmentation mode tessBaseAPI.SetPageSegMode(psm); // Set the input image Pix pix = tessBaseAPI.SetImage(inputFile); tessBaseAPI.SetVariable("number", "1234567890"); // Recognize image tessBaseAPI.Recognize(); ResultIterator resultIterator = tessBaseAPI.GetIterator(); // extract text from result iterator StringBuilder stringBuilder = new StringBuilder(); PageIteratorLevel pageIteratorLevel = PageIteratorLevel.RIL_PARA; do { string str = resultIterator.GetUTF8Text(pageIteratorLevel); if (str != null) { str = Regex.Replace(str, @"\n", "\r\n"); re.Add(str); } } while (resultIterator.Next(pageIteratorLevel)); tessBaseAPI.Dispose(); pix.Dispose(); return(re); }
public List <Rectangle> GetSubtitleBoundingBoxes(IMagickImage mImage, Rectangle subtitleRegion, PageIteratorLevel pageIteratorLevel, string cropRegionPath = "") { //Preprocess var imageBytes = PreprocessImage(mImage, subtitleRegion, _preprocessScale, cropRegionPath); List <Rectangle> boundingBoxes = new List <Rectangle>(); try { _tessEngine.SetVariable("user_defined_dpi", 300); _tessEngine.DefaultPageSegMode = PageSegMode.Auto; using var img = Pix.LoadFromMemory(imageBytes); using var page = _tessEngine.Process(img); //The Iterator way - Same results... using var iter = page.GetIterator(); iter.Begin(); do { if (!iter.TryGetBoundingBox(pageIteratorLevel, out var boundingBoxRect)) { continue; } var boundingBox = new Rectangle( (int)(boundingBoxRect.X1 / _preprocessScale) + subtitleRegion.X, (int)(boundingBoxRect.Y1 / _preprocessScale) + subtitleRegion.Y, (int)(boundingBoxRect.Width / _preprocessScale), (int)(boundingBoxRect.Height / _preprocessScale)); boundingBoxes.Add(boundingBox); Console.WriteLine($"Text:{iter.GetText(pageIteratorLevel).Trim()} - Bounding Box:{boundingBox}"); } while (iter.Next(pageIteratorLevel)); return(boundingBoxes); } catch (Exception error) { Console.WriteLine("Tesseract Error: " + error.Message); } Console.WriteLine(boundingBoxes.Count); return(boundingBoxes); }
public string GetUTF8Text(PageIteratorLevel level) { IntPtr pointer = Native.DllImports.TessResultIteratorGetUTF8Text(handleRef, level); if (IntPtr.Zero != pointer) { string returnObject = Marshaling.PtrToStringUTF8(pointer); Native.DllImports.TessDeleteText(pointer); return(returnObject); } else { return(null); } }
public static string ResultIteratorGetUTF8Text(IntPtr handle, PageIteratorLevel level) { IntPtr txtHandle = ResultIteratorGetUTF8TextInternal(handle, level); if (txtHandle != IntPtr.Zero) { var result = MarshalHelper.PtrToString(txtHandle, Encoding.UTF8); TessApi.DeleteText(txtHandle); return(result); } else { return(null); } }
public string GetText(PageIteratorLevel level) { return Interop.TessApi.ResultIteratorGetUTF8Text(handle, level); }
public float GetConfidence(PageIteratorLevel level) { return Interop.TessApi.Native.ResultIteratorGetConfidence(handle, level); }
public static extern int PageIteratorNext(HandleRef handle, PageIteratorLevel level);
public static extern int PageIteratorIsAtBeginningOf(IntPtr handle, PageIteratorLevel level);
/// <summary> /// Moves to the start of the next element at the given level. /// </summary> /// <remarks> /// /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool Next(PageIteratorLevel level) { return Interop.TessApi.PageIteratorNext(handle, level) != 0; }
internal static extern bool TessPageIteratorGetBaseLine( IntPtr iterator, PageIteratorLevel level, ref int x1, ref int y1, ref int x2, ref int y2);
public static extern int PageIteratorNext(IntPtr handle, PageIteratorLevel level);
/// <summary> /// Gets the bounding rectangle of the current element at the given level. /// </summary> /// <param name="level"></param> /// <param name="bounds"></param> /// <returns></returns> public bool TryGetBoundingBox(PageIteratorLevel level, out Rect bounds) { int x1, y1, x2, y2; if (Interop.TessApi.PageIteratorBoundingBox(handle, level, out x1, out y1, out x2, out y2) != 0) { bounds = Rect.FromCoords(x1, y1, x2, y2); return true; } else { bounds = Rect.Empty; return false; } }
public static extern IntPtr PageIteratorGetBinaryImage(IntPtr handle, PageIteratorLevel level);
public static extern int PageIteratorBaseline(IntPtr handle, PageIteratorLevel level, out int x1, out int y1, out int x2, out int y2);
public Pix GetImage(PageIteratorLevel level, int padding, out int x, out int y) { return Pix.Create(Interop.TessApi.PageIteratorGetImage(handle, level, padding, out x, out y)); }
/// <summary> /// Returns <c>True</c> if the iterator is at the first element at the given level. /// </summary> /// <remarks> /// A possible use is to determin if a call to next(word) moved to the start of a new paragraph. /// </remarks> /// <param name="level"></param> /// <returns></returns> public bool IsAtBeginningOf(PageIteratorLevel level) { return Interop.TessApi.PageIteratorIsAtBeginningOf(handle, level) != 0; }
/// <summary> /// Returns <c>True</c> if the iterator is possitioned at the last element at the given level. /// </summary> /// <param name="level"></param> /// <param name="element"></param> /// <returns></returns> public bool IsAtFinalOf(PageIteratorLevel level, PageIteratorLevel element) { return Interop.TessApi.PageIteratorIsAtFinalElement(handle, level, element) != 0; }
public static extern int PageIteratorBoundingBox(IntPtr handle, PageIteratorLevel level, out int left, out int top, out int right, out int bottom);
public Pix GetBinaryImage(PageIteratorLevel level) { return Pix.Create(Interop.TessApi.PageIteratorGetBinaryImage(handle, level)); }
public static extern IntPtr PageIteratorGetImage(IntPtr handle, PageIteratorLevel level, int padding, out int left, out int top);
public static string ResultIteratorGetUTF8Text(IntPtr handle, PageIteratorLevel level) { IntPtr txtHandle = ResultIteratorGetUTF8TextInternal(handle, level); if (txtHandle != IntPtr.Zero) { var result = MarshalHelper.PtrToString(txtHandle, Encoding.UTF8); TessApi.DeleteText(txtHandle); return result; } else { return null; } }
public static extern int PageIteratorIsAtFinalElement(IntPtr handle, PageIteratorLevel level, PageIteratorLevel element);
/// <summary> /// Returns <c>True</c> if the iterator is positioned at the last element at the given level. /// </summary> /// <param name="level"></param> /// <param name="element"></param> /// <returns></returns> public bool IsAtFinalOf(PageIteratorLevel level, PageIteratorLevel element) { VerifyNotDisposed(); if (handle.Handle == IntPtr.Zero) return false; return Interop.TessApi.Native.PageIteratorIsAtFinalElement(handle, level, element) != 0; }
public static extern float ResultIteratorGetConfidence(IntPtr handle, PageIteratorLevel level);
/// <summary> /// Gets the bounding rectangle of the current element at the given level. /// </summary> /// <param name="level"></param> /// <param name="bounds"></param> /// <returns></returns> public bool TryGetBoundingBox(PageIteratorLevel level, out Rect bounds) { VerifyNotDisposed(); int x1, y1, x2, y2; if (handle.Handle != IntPtr.Zero && Interop.TessApi.Native.PageIteratorBoundingBox(handle, level, out x1, out y1, out x2, out y2) != 0) { bounds = Rect.FromCoords(x1, y1, x2, y2); return true; } else { bounds = Rect.Empty; return false; } }
private static extern IntPtr ResultIteratorGetUTF8TextInternal(IntPtr handle, PageIteratorLevel level);
private G8PageIteratorLevel GetPageIteratorLevel (PageIteratorLevel level) { switch (level) { case PageIteratorLevel.Block: return G8PageIteratorLevel.Block; case PageIteratorLevel.Paragraph: return G8PageIteratorLevel.Paragraph; case PageIteratorLevel.Symbol: return G8PageIteratorLevel.Symbol; case PageIteratorLevel.Textline: return G8PageIteratorLevel.Textline; case PageIteratorLevel.Word: return G8PageIteratorLevel.Word; default: return G8PageIteratorLevel.Word; } }