@SmallTest public void testWordConfidences() { final String inputText = "one two three"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_BLOCK); baseApi.setImage(bmp); String text = baseApi.getUTF8Text(); assertNotNull("Recognized text is null.", text); // Ensure that a mean confidence value is returned. int conf = baseApi.meanConfidence(); boolean validConf = conf > 0 && conf <= 100; assertTrue("Mean confidence value is incorrect.", validConf); // Ensure that word confidence values are returned. int numWords = text.split("\\s+").length; int[] wordConf = baseApi.wordConfidences(); assertEquals("Found the wrong number of word confidence values.", numWords, wordConf.length); for (int i = 0; i < wordConf.length; i++) { boolean valid = 0 <= wordConf[i] && wordConf[i] <= 100; assertTrue("Found an invalid word confidence value.", valid); } // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testProgressValues() { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); final Rect imageBounds = new Rect(0, 0, bmp.getWidth(), bmp.getHeight()); class Notifier implements ProgressNotifier { public boolean receivedProgress = false; @Override public void onProgressValues(ProgressValues progressValues) { receivedProgress = true; testProgressValues(progressValues, imageBounds); } } final Notifier notifier = new Notifier(); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(notifier); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setImage(bmp); // Ensure that we receive a progress callback. baseApi.getHOCRText(0); assertTrue(notifier.receivedProgress); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testEnd() { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setImage(bmp); // Ensure that getUTF8Text() fails after end() is called. baseApi.end(); try { baseApi.getUTF8Text(); fail("IllegalStateException not thrown"); } catch (IllegalStateException e) { // Continue } finally { bmp.recycle(); } // Ensure that reinitializing the API is successful. boolean success = baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); assertTrue("API failed to initialize after end()", success); // Ensure setImage() does not throw an exception. final Bitmap bmp2 = getTextImage(inputText, 640, 480); baseApi.setImage(bmp2); // Attempt to shut down the API. baseApi.end(); bmp2.recycle(); }
@SmallTest public void testSetRectangle() { // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_CHAR); final int width = 640; final int height = 480; final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Paint paint = new Paint(); final Canvas canvas = new Canvas(bmp); canvas.drawColor(Color.WHITE); paint.setColor(Color.BLACK); paint.setStyle(Style.FILL); paint.setAntiAlias(true); paint.setTextAlign(Align.CENTER); paint.setTextSize(32.0f); // Draw separate text on the left and right halves of the image. final String leftInput = "A"; final String rightInput = "B"; canvas.drawText(leftInput, width / 4, height / 2, paint); canvas.drawText(rightInput, width * 3 / 4, height / 2, paint); baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, leftInput + rightInput); baseApi.setImage(bmp); // Ensure the result is correct for a rectangle on the left half of the image. Rect left = new Rect(0, 0, width / 2, height); baseApi.setRectangle(left); String leftResult = baseApi.getUTF8Text(); assertEquals("Found incorrect text.", leftInput, leftResult); // Ensure the result is correct for a rectangle on the right half of the image. Rect right = new Rect(width / 2, 0, width, height); baseApi.setRectangle(right); String rightResult = baseApi.getUTF8Text(); assertEquals("Found incorrect text.", rightInput, rightResult); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testSetVariable() { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); // Ensure that setting the blacklist variable works. final String blacklistedCharacter = inputText.substring(1, 2); baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, blacklistedCharacter); baseApi.setImage(bmp); final String outputText = baseApi.getUTF8Text(); assertFalse("Found a blacklisted character.", outputText.contains(blacklistedCharacter)); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testSetPageSegMode() { // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); // Check the default page segmentation mode. assertEquals( "Found unexpected default page segmentation mode.", baseApi.getPageSegMode(), DEFAULT_PAGE_SEG_MODE); // Ensure that the page segmentation mode can be changed. final int newPageSegMode = TessBaseAPI.PageSegMode.PSM_SINGLE_CHAR; baseApi.setPageSegMode(newPageSegMode); assertEquals( "Found unexpected page segmentation mode.", baseApi.getPageSegMode(), newPageSegMode); // Attempt to shut down the API. baseApi.end(); }
@SmallTest public void testClear() { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setImage(bmp); // Ensure that the getUTF8Text() operation fails after clear() is called. baseApi.clear(); String text = baseApi.getUTF8Text(); assertNull("Received non-null result after clear().", text); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testChoiceIterator() { final String inputText = "hello"; final Bitmap bmp = TessBaseAPITest.getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TessBaseAPITest.TESSBASE_PATH, TessBaseAPITest.DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setVariable(TessBaseAPI.VAR_SAVE_BLOB_CHOICES, TessBaseAPI.VAR_TRUE); // Ensure that text is recognized. baseApi.setImage(bmp); String recognizedText = baseApi.getUTF8Text(); assertTrue("No recognized text found.", recognizedText != null && !recognizedText.equals("")); // Iterate through the results. ResultIterator iterator = baseApi.getResultIterator(); List<Pair<String, Double>> choicesAndConfidences; iterator.begin(); do { choicesAndConfidences = iterator.getChoicesAndConfidence(PageIteratorLevel.RIL_SYMBOL); assertNotNull("Invalid result.", choicesAndConfidences); for (Pair<String, Double> choiceAndConfidence : choicesAndConfidences) { String choice = choiceAndConfidence.first; Double conf = choiceAndConfidence.second; assertTrue("No choice value found.", choice != null && !choice.equals("")); assertTrue("Found an incorrect confidence value.", conf >= 0 && conf <= 100); } } while (iterator.next(PageIteratorLevel.RIL_SYMBOL)); iterator.delete(); assertNotNull("No ChoiceIterator values found.", choicesAndConfidences); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
private void testGetHOCRText(String language, int ocrEngineMode) { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setImage(bmp); // Ensure that getHOCRText() produces a result. final String hOcr = baseApi.getHOCRText(0); assertNotNull("HOCR result not found.", hOcr); assertTrue(hOcr.length() > 0); final String outputText = Html.fromHtml(hOcr).toString().trim(); assertEquals(inputText, outputText); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
@SmallTest public void testProgressValues_setRectangle() { class Notifier implements ProgressNotifier { public boolean receivedProgress = false; private Rect bounds; public void reset(Rect bounds) { this.bounds = bounds; receivedProgress = false; } @Override public void onProgressValues(ProgressValues progressValues) { receivedProgress = true; testProgressValues(progressValues, bounds); } } final Notifier notifier = new Notifier(); final int width = 640; final int height = 480; final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setStyle(Style.FILL); paint.setAntiAlias(true); paint.setTextAlign(Align.CENTER); paint.setTextSize(32.0f); // Draw separate text on the left and right halves of the image. final Canvas canvas = new Canvas(bmp); canvas.drawColor(Color.WHITE); final String leftInput = "A"; final String rightInput = "B"; canvas.drawText(leftInput, width / 4, height / 2, paint); canvas.drawText(rightInput, width * 3 / 4, height / 2, paint); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(notifier); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, leftInput + rightInput); baseApi.setImage(bmp); // Attempt to restrict recognition to a sub-rectangle of the image. final Rect left = new Rect(0, 0, width / 2, height); baseApi.setRectangle(left); notifier.reset(left); // Ensure a progress callback is received. baseApi.getHOCRText(0); assertTrue(notifier.receivedProgress); // Attempt to restrict recognition to a sub-rectangle of the image. final Rect right = new Rect(width / 2 + 5, 7, width - 5, height - 7); baseApi.setRectangle(right); notifier.reset(right); // Ensure a progress callback is received. baseApi.getHOCRText(0); assertTrue(notifier.receivedProgress); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }
private void testGetUTF8Text(String language, int ocrEngineMode) { final String inputText = "hello"; final Bitmap bmp = getTextImage(inputText, 640, 480); // Attempt to initialize the API. final TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, language, ocrEngineMode); baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE); baseApi.setImage(bmp); // Ensure that the result is correct. final String outputText = baseApi.getUTF8Text(); assertEquals("\"" + outputText + "\" != \"" + inputText + "\"", inputText, outputText); // Ensure getRegions() works. final Pixa regions = baseApi.getRegions(); assertEquals("Found incorrect number of regions.", regions.size(), 1); regions.recycle(); // Ensure getTextlines() works. final Pixa textlines = baseApi.getTextlines(); assertEquals("Found incorrect number of textlines.", textlines.size(), 1); textlines.recycle(); // Ensure getStrips() works. final Pixa strips = baseApi.getStrips(); assertEquals("Found incorrect number of strips.", strips.size(), 1); strips.recycle(); // Ensure getWords() works. final Pixa words = baseApi.getWords(); assertEquals("Found incorrect number of words.", words.size(), 1); words.recycle(); // Ensure getConnectedComponents() works. final Pixa connectedComponents = baseApi.getConnectedComponents(); assertTrue("Connected components not found.", connectedComponents.size() > 0); connectedComponents.recycle(); // Iterate through the results. final ResultIterator iterator = baseApi.getResultIterator(); String lastUTF8Text; float lastConfidence; int[] lastBoundingBox; Rect lastBoundingRect; int count = 0; iterator.begin(); do { lastUTF8Text = iterator.getUTF8Text(PageIteratorLevel.RIL_WORD); lastConfidence = iterator.confidence(PageIteratorLevel.RIL_WORD); lastBoundingBox = iterator.getBoundingBox(PageIteratorLevel.RIL_WORD); lastBoundingRect = iterator.getBoundingRect(PageIteratorLevel.RIL_WORD); count++; } while (iterator.next(PageIteratorLevel.RIL_WORD)); iterator.delete(); assertEquals("Found incorrect number of results.", count, 1); assertEquals("Found an incorrect result.", lastUTF8Text, outputText); assertTrue("Result was not high-confidence.", lastConfidence > 80); assertTrue("Result bounding box not found.", lastBoundingBox[2] > 0 && lastBoundingBox[3] > 0); boolean validBoundingRect = lastBoundingRect.left < lastBoundingRect.right && lastBoundingRect.top < lastBoundingRect.bottom; assertTrue("Result bounding box Rect is incorrect.", validBoundingRect); // Attempt to shut down the API. baseApi.end(); bmp.recycle(); }