From 1b92e228058770f5cbc1cacecb3c705a2fd211d6 Mon Sep 17 00:00:00 2001 From: Charles Weld Date: Sat, 17 May 2014 11:23:36 +1000 Subject: [PATCH 1/2] Allow changing the current region of interest without having to reload the entire image. --- src/Tesseract.Tests/EngineTests.cs | 25 ++++++++++++++++++++++ src/Tesseract/Page.cs | 33 +++++++++++++++++++++++++++--- src/Tesseract/TesseractEngine.cs | 5 ++--- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/Tesseract.Tests/EngineTests.cs b/src/Tesseract.Tests/EngineTests.cs index 80d38f1f..a36a2338 100644 --- a/src/Tesseract.Tests/EngineTests.cs +++ b/src/Tesseract.Tests/EngineTests.cs @@ -52,6 +52,31 @@ public void CanParseText() } } } + + [Test] + public void CanParseDifferentRegionsInSameImage() + { + using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)) { + using(var img = Pix.LoadFromFile("./phototest.tif")) { + using(var page = engine.Process(img, Rect.FromCoords(0, 0, img.Width, 188))) { + var region1Text = page.GetText(); + + const string expectedTextRegion1 = + "This is a lot of 12 point text to test the\nocr code and see if it works on all types\nof file format.\n\n"; + + Assert.That(region1Text, Is.EqualTo(expectedTextRegion1)); + + page.RegionOfInterest = Rect.FromCoords(0, 188, img.Width, img.Height); + + var region2Text = page.GetText(); + const string expectedTextRegion2 = + "The quick brown dog jumped over the\nlazy fox. The quick brown dog jumped\nover the lazy fox. The quick brown dog\njumped over the lazy fox. The quick\nbrown dog jumped over the lazy fox.\n\n"; + + Assert.That(region2Text, Is.EqualTo(expectedTextRegion2)); + } + } + } + } [Test] public void CanParseUznFile() diff --git a/src/Tesseract/Page.cs b/src/Tesseract/Page.cs index d0cbb302..332eb34e 100644 --- a/src/Tesseract/Page.cs +++ b/src/Tesseract/Page.cs @@ -9,14 +9,41 @@ namespace Tesseract public sealed class Page : DisposableBase { private bool runRecognitionPhase; - + private Rect regionOfInterest; + + public TesseractEngine Engine { get; private set; } + public Pix Image { get; private set; } - internal Page(TesseractEngine engine) + internal Page(TesseractEngine engine, Pix image, Rect regionOfInterest) { Engine = engine; + Image = image; + RegionOfInterest = regionOfInterest; } - + + /// + /// The current region of interest being parsed. + /// + public Rect RegionOfInterest { + get { + return regionOfInterest; + } + set { + if (value.X1 < 0 || value.Y1 < 0 || value.X2 > Image.Width || value.Y2 > Image.Height) + throw new ArgumentException("The region of interest to be processed must be within the image bounds.", "value"); + + if(regionOfInterest != value) { + regionOfInterest = value; + + // update region of interest in image + Interop.TessApi.BaseApiSetRectangle(Engine.Handle, regionOfInterest.X1, regionOfInterest.Y1, regionOfInterest.Width, regionOfInterest.Height); + + // request rerun of recognition on the next call that requires recognition + runRecognitionPhase = true; + } + } + } public PageIterator AnalyseLayout() { diff --git a/src/Tesseract/TesseractEngine.cs b/src/Tesseract/TesseractEngine.cs index a6308e43..766adcd5 100644 --- a/src/Tesseract/TesseractEngine.cs +++ b/src/Tesseract/TesseractEngine.cs @@ -187,7 +187,7 @@ public Page Process(Pix image, PageSegMode? pageSegMode = null) /// A result iterator public Page Process(Pix image, Rect region, PageSegMode? pageSegMode = null) { - return Process(image, null, new Rect(0, 0, image.Width, image.Height), pageSegMode); + return Process(image, null, region, pageSegMode); } @@ -227,11 +227,10 @@ public Page Process(Pix image, string inputName, Rect region, PageSegMode? pageS 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); if(!String.IsNullOrEmpty(inputName)) { Interop.TessApi.BaseApiSetInputName(handle, inputName); } - var page = new Page(this); + var page = new Page(this, image, region); page.Disposed += OnIteratorDisposed; return page; } From 999b2cd6a94b88674fc398214d9512f34492b7a7 Mon Sep 17 00:00:00 2001 From: Charles Weld Date: Sun, 22 Jun 2014 13:01:38 +1000 Subject: [PATCH 2/2] Fixed asp.net loading (#97) --- .gitignore | 1 + Samples/Tesseract.ConsoleDemo/Program.cs | 2 +- Samples/Tesseract.WebDemo/Default.aspx.cs | 2 +- build.proj | 2 +- src/Tesseract/ChangeLog.md | 7 ++++++- src/Tesseract/Interop/WindowsLibraryLoader.cs | 2 +- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index a5c24d58..d0899be8 100644 --- a/.gitignore +++ b/.gitignore @@ -186,3 +186,4 @@ pip-log.txt /src/AssemblyVersionInfo.cs /*.Log +*.sdsettings diff --git a/Samples/Tesseract.ConsoleDemo/Program.cs b/Samples/Tesseract.ConsoleDemo/Program.cs index 66a0dfcc..90812226 100644 --- a/Samples/Tesseract.ConsoleDemo/Program.cs +++ b/Samples/Tesseract.ConsoleDemo/Program.cs @@ -71,7 +71,7 @@ public static void Main(string[] args) private class ResultPrinter { - private FormattedConsoleLogger logger; + readonly FormattedConsoleLogger logger; public ResultPrinter(FormattedConsoleLogger logger) { diff --git a/Samples/Tesseract.WebDemo/Default.aspx.cs b/Samples/Tesseract.WebDemo/Default.aspx.cs index 295f3845..0531d746 100644 --- a/Samples/Tesseract.WebDemo/Default.aspx.cs +++ b/Samples/Tesseract.WebDemo/Default.aspx.cs @@ -49,7 +49,7 @@ private void OnSubmitFileClicked(object sender, EventArgs args) { // for now just fail hard if there's any error however in a propper app I would expect a full demo. - using (var engine = new TesseractEngine(Server.MapPath(@"./tessdata"), "eng", EngineMode.Default)) + using (var engine = new TesseractEngine(Server.MapPath(@"~/tessdata"), "eng", EngineMode.Default)) { // have to load Pix via a bitmap since Pix doesn't support loading a stream. using (var image = new System.Drawing.Bitmap(imageFile.PostedFile.InputStream)) diff --git a/build.proj b/build.proj index 616931f4..24d385e4 100644 --- a/build.proj +++ b/build.proj @@ -1,7 +1,7 @@ - 1.0.10 + 1.0.11 $(MSBuildProjectDirectory)\src $(MSBuildProjectDirectory)\bin $(MSBuildProjectDirectory)\release diff --git a/src/Tesseract/ChangeLog.md b/src/Tesseract/ChangeLog.md index d86deca6..868c8e68 100644 --- a/src/Tesseract/ChangeLog.md +++ b/src/Tesseract/ChangeLog.md @@ -1,3 +1,8 @@ ### Version 1.10 -* Added support for uzn files - [Issue 66](https://github.com/charlesw/tesseract/issues/66) \ No newline at end of file +* Added support for uzn files - [Issue 66](https://github.com/charlesw/tesseract/issues/66) + +### Version 1.11 + +* Allow changing the current region of interest without having to reload the entire image (Page.RegionOfInterest) +* Fixed loader for ASP.NET [Issue 97](https://github.com/charlesw/tesseract/issues/97) \ No newline at end of file diff --git a/src/Tesseract/Interop/WindowsLibraryLoader.cs b/src/Tesseract/Interop/WindowsLibraryLoader.cs index 198b9b96..d66e763a 100644 --- a/src/Tesseract/Interop/WindowsLibraryLoader.cs +++ b/src/Tesseract/Interop/WindowsLibraryLoader.cs @@ -126,7 +126,7 @@ public void LoadLibrary(string dllName) #if !ClientProfile if(HttpContext.Current != null) { var server = HttpContext.Current.Server; - baseDirectory = Path.GetFullPath(server.MapPath("bin")); + baseDirectory = Path.GetFullPath(server.MapPath("~/bin")); dllHandle = LoadLibraryInternal(dllName, baseDirectory, processArch); if (dllHandle != IntPtr.Zero) return; }