Tesseract空白页面

我使用tesseract来检测图像上的字符。

try { using (var engine = new TesseractEngine(@"C:\Users\ea\Documents\Visual Studio 2015\Projects\ocrtTest", "eng", EngineMode.Default)) { using (var img = Pix.LoadFromFile(testImagePath)) { Bitmap src = (Bitmap)Image.FromFile(testImagePath); using (var page = engine.Process(img)) { var text = page.GetHOCRText(1); File.WriteAllText("test.html", text); //Console.WriteLine("Text: {0}", text); //Console.WriteLine("Mean confidence: {0}", page.GetMeanConfidence()); int p = 0; int l = 0; int w = 0; int s = 0; int counter = 0; using (var iter = page.GetIterator()) { iter.Begin(); do { do { do { do { do { //if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) //{ // logger.Log("New block"); //} if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) { p++;//counts paragraph //logger.Log("New paragraph"); } if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) { l++;//count lines //logger.Log("New line"); } if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) { w++;//count words //logger.Log("New word"); } s++;//count symbols //logger.Log(iter.GetText(PageIteratorLevel.Symbol)); // get bounding box for symbol Rect symbolBounds; if (iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) { Rectangle dueDateRectangle = new Rectangle(symbolBounds.X1, symbolBounds.Y1, symbolBounds.X2 - symbolBounds.X1, symbolBounds.Y2 - symbolBounds.Y1); rect = dueDateRectangle; PixelFormat format = src.PixelFormat; Bitmap cloneBitmap = src.Clone(dueDateRectangle, format); MemoryStream ms = new MemoryStream(); cloneBitmap.Save(ms, ImageFormat.Png); ms.Position = 0; Image i = Image.FromStream(ms); //i.Save(ms,System.Drawing.Imaging.ImageFormat.Png); i.Save("character" + counter + ".bmp", ImageFormat.Png); counter++; } } while (iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Symbol)); // DO any word post processing here (eg group symbols by word) } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word)); } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine)); } while (iter.Next(PageIteratorLevel.Block, PageIteratorLevel.Para)); } while (iter.Next(PageIteratorLevel.Block)); } Console.WriteLine("Pragraphs = " + p); Console.WriteLine("Lines = " + l); Console.WriteLine("Words = " + w); Console.WriteLine("Symbols = " + s); } 

当我有一个包含大量文本的图像时,它会起作用,但是当我有一个只有一个字母的图像时,它就没有了。 在此处输入图像描述

它找到了一个符号,我在输入中看到它。 符号= 1.但它无法获得BoundingBox。 为什么? 同样的我使用字母图像 在此处输入图像描述

您可能需要使用不同的page segmentation modeOCR Engine mode测试OCR以获得最佳结果。 以下是Tesseract 4.0提供的使用信息。

 Page segmentation modes: 0 Orientation and script detection (OSD) only. 1 Automatic page segmentation with OSD. 2 Automatic page segmentation, but no OSD, or OCR. 3 Fully automatic page segmentation, but no OSD. (Default) 4 Assume a single column of text of variable sizes. 5 Assume a single uniform block of vertically aligned text. 6 Assume a single uniform block of text. 7 Treat the image as a single text line. 8 Treat the image as a single word. 9 Treat the image as a single word in a circle. 10 Treat the image as a single character. 11 Sparse text. Find as much text as possible in no particular order. 12 Sparse text with OSD. 13 Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.
OCR Engine modes: 0 Original Tesseract only. 1 Neural nets LSTM only. 2 Tesseract + LSTM. 3 Default, based on what is available.

例如,

  • psm 8将为OCR提供单个单词的最佳结果
  • psm 6可以给出一块文本的最佳结果

在您的代码中,它显示您使用了默认 engine mode而未指定segmentation mode 。 您可以进行更多测试以找出哪些模式可以提供正确的结果。