@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(); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow() .setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); window.requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.capture); baseApi = new TessBaseAPI(); baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); Bitmap mp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); mp = mp.copy(Bitmap.Config.ARGB_8888, false); baseApi.setImage(mp); String value = baseApi.getUTF8Text(); // Log.d("tag", " the value is ===> " + value); baseApi.clear(); baseApi.end(); mainSurface = (SurfaceView) findViewById(R.id.mainSurface); textView = (TextView) findViewById(R.id.text); msurfaceHolder = mainSurface.getHolder(); }
@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(); }
// Scan the photo for text using the tess-two API public static String scanPhoto(Bitmap bitmap) { TessBaseAPI baseApi = new TessBaseAPI(); baseApi.setDebug(true); baseApi.init(DATA_PATH, lang); // set the black list baseApi.setVariable("tessedit_char_blacklist", "':;,.?/\\}][{!@#$%^&*()-_=+~"); baseApi.setVariable("save_blob_choices", "T"); baseApi.setImage(bitmap); String recognizedText = baseApi.getUTF8Text(); // Iterate over the results and print confidence values for debugging purposes final ResultIterator iterator = baseApi.getResultIterator(); String lastUTF8Text; float lastConfidence; iterator.begin(); do { lastUTF8Text = iterator.getUTF8Text(PageIteratorLevel.RIL_WORD); lastConfidence = iterator.confidence(PageIteratorLevel.RIL_WORD); if (lastConfidence > 50) { Log.d(TAG, String.format("%s => %.2f", lastUTF8Text, lastConfidence)); } } while (iterator.next(PageIteratorLevel.RIL_WORD)); baseApi.end(); Log.d(TAG, recognizedText); return recognizedText; }
public void ocr_main() { Log.v(TAG, "entering tess"); // Getting uri of image/cropped image try { myimage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), image_uri); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // Log.v(TAG, "bitmap " + myimage.getByteCount()); // Bitmap argb = myimage; // argb = argb.copy(Bitmap.Config.ARGB_8888, true); // Log.v(TAG, "bitmap after argb:" + argb.getByteCount()); // BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inSampleSize = 2; myimage = BitmapFactory.decodeFile(filepath, opt); // Log.v(TAG, "bitmap after comp:" + myimage.getByteCount()); // TessBase starts TessBaseAPI baseApi = new TessBaseAPI(); baseApi.setDebug(true); baseApi.init(DATA_PATH, lang); Log.v(TAG, "Before baseApi"); baseApi.setImage(myimage); Log.v(TAG, "Before baseApi2"); String recognizedText = baseApi.getUTF8Text(); Log.v(TAG, "Before baseApi3"); baseApi.end(); Log.v(TAG, "OCRED TEXT: " + recognizedText); if (lang.equalsIgnoreCase("eng")) { recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " "); } // recognizedText is the final OCRed text recognizedText = recognizedText.trim(); // String ocrtext = "And...BAM! OCRed: " + recognizedText; // Toast toast = Toast.makeText(this.getApplicationContext(), ocrtext, // Toast.LENGTH_LONG); // toast.show(); // deleting temporary crop file created File file = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "temp.bmp"); boolean deleted = file.delete(); Log.i(TAG, "File deleted: " + deleted); Intent intent = new Intent(this, ResultActivity.class); intent.putExtra("ocrText", recognizedText); startActivity(intent); }
@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(); }
@SuppressWarnings("unused") private OcrResult getOcrResult() { OcrResult ocrResult; String textResult; long start = System.currentTimeMillis(); try { baseApi.setImage(ReadFile.readBitmap(bitmap)); textResult = baseApi.getUTF8Text(); timeRequired = System.currentTimeMillis() - start; // Check for failure to recognize text if (textResult == null || textResult.equals("")) { return null; } ocrResult = new OcrResult(); ocrResult.setWordConfidences(baseApi.wordConfidences()); ocrResult.setMeanConfidence(baseApi.meanConfidence()); if (ViewfinderView.DRAW_REGION_BOXES) { ocrResult.setRegionBoundingBoxes(baseApi.getRegions().getBoxRects()); } if (ViewfinderView.DRAW_TEXTLINE_BOXES) { ocrResult.setTextlineBoundingBoxes(baseApi.getTextlines().getBoxRects()); } if (ViewfinderView.DRAW_STRIP_BOXES) { ocrResult.setStripBoundingBoxes(baseApi.getStrips().getBoxRects()); } // Always get the word bounding boxes--we want it for annotating the bitmap after the user // presses the shutter button, in addition to maybe wanting to draw boxes/words during the // continuous mode recognition. ocrResult.setWordBoundingBoxes(baseApi.getWords().getBoxRects()); // if (ViewfinderView.DRAW_CHARACTER_BOXES || ViewfinderView.DRAW_CHARACTER_TEXT) { // ocrResult.setCharacterBoundingBoxes(baseApi.getCharacters().getBoxRects()); // } } catch (RuntimeException e) { Log.e( "OcrRecognizeAsyncTask", "Caught RuntimeException in request to Tesseract. Setting state to CONTINUOUS_STOPPED."); e.printStackTrace(); try { baseApi.clear(); activity.stopHandler(); } catch (NullPointerException e1) { // Continue } return null; } timeRequired = System.currentTimeMillis() - start; ocrResult.setBitmap(bitmap); ocrResult.setText(textResult); ocrResult.setRecognitionTimeRequired(timeRequired); return ocrResult; }
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 10) { if (resultCode == RESULT_OK) { byte[] datas = data.getExtras().getByteArray("data"); baseApi.setImage(BitmapFactory.decodeByteArray(datas, 0, datas.length)); tv_capture.setText(baseApi.getUTF8Text()); } } }
public void doOCR(Bitmap bitmap) { Bitmap BiBitmap = Binary.preProcess(bitmap); mImage2.setImageBitmap(BiBitmap); TessBaseAPI baseApi = new TessBaseAPI(); baseApi.init(datapath, language); // 必须加此行,tess-two要求BMP必须为此配置 bitmap = BiBitmap.copy(Bitmap.Config.ARGB_8888, true); baseApi.setImage(bitmap); String result = baseApi.getUTF8Text(); baseApi.clear(); baseApi.end(); mResult.setText(result); }
/** * 识别图片并取值 * * @param bitmap * @return */ public String decodeBitmapValue(Bitmap bitmap) { if (bitmap == null) { return null; } baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE); bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); baseApi.setImage(bitmap); // 识别图片 String value = baseApi.getUTF8Text(); // Log.d("tag", " the value is ===> " + value); baseApi.clear(); baseApi.end(); return value; }
protected String tessProcess(Bitmap bMap) { TessBaseAPI tessapi = new TessBaseAPI(); // tessapi.init("/storage/sdcard0/", "eng"); tessapi.init(Environment.getExternalStorageDirectory().toString(), "eng"); // ImageView image = (ImageView)findViewById(R.id.test_image); // Bitmap bMap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().toString() + // "/tessdata/sample_input.bmp"); // image.setImageBitmap(bMap); tessapi.setImage(bMap); String txt = tessapi.getUTF8Text(); tessapi.end(); // Log.i(TAG, "OCR output:\n" + txt); // TextView my_out_1 = (TextView)findViewById(R.id.my_out); // my_out_1.setText("Hello:" + txt); return txt; }
public String getTextContent() { Log.d("whathaeljf", "The second image path is " + imagePath); Bitmap bitmap = BitmapFactory.decodeFile(imagePath); /* Matrix matrix = new Matrix(); matrix.postRotate(180); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); */ TessBaseAPI baseApi = new TessBaseAPI(); baseApi.setDebug(true); baseApi.init(DATA_PATH, lang); baseApi.setImage(bitmap); String recognizedText = baseApi.getUTF8Text(); return recognizedText; }
/*Begin citation: http://gaut.am/making-an-ocr-android-app-using-tesseract/ gets the image from the external storage directory and uses the tess-two library to process the image and return the recognized text */ public String getOCRText() { Bitmap bitmap = BitmapFactory.decodeFile(DIR + "ocrImage.jpg"); TessBaseAPI baseApi = new TessBaseAPI(); baseApi.setDebug(true); baseApi.init(DIR, "eng"); baseApi.setImage(bitmap); String recognizedText = baseApi.getUTF8Text(); baseApi.end(); if ("eng".equalsIgnoreCase("eng")) { recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9 ]+", " "); } Log.d(DolchListActivity.TAG, recognizedText); return recognizedText.trim(); }
@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 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(); }
private void textExtraction(Bitmap croppedPic) { int width, height; height = croppedPic.getHeight(); width = croppedPic.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmpGrayscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(croppedPic, 0, 0, paint); baseApi.setImage(bmpGrayscale); baseApi.setImage(baseApi.getThresholdedImage()); String recognizedText = baseApi.getUTF8Text(); recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9\\s]+", ""); extractedText.setText(recognizedText); croppedImage.setImageBitmap(bmpGrayscale); }
@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 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(); }
protected void onPhotoTaken() { _taken = true; /*BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; Bitmap oldbitmap = BitmapFactory.decodeFile(_path, options); Pix pix = ReadFile.readBitmap(oldbitmap);*/ BitmapFactory.Options otherOptions = new BitmapFactory.Options(); otherOptions.inScaled = false; Bitmap oldbitmap2 = BitmapFactory.decodeFile(_path, otherOptions); Pix pix = ReadFile.readBitmap(oldbitmap2); pix = AdaptiveMap.backgroundNormMorph(pix); pix = Enhance.unsharpMasking(pix); pix = GrayQuant.pixThresholdToBinary(pix, 125); // pix = Scale.scale(pix, 10, 10); Bitmap bitmap = WriteFile.writeBitmap(pix); try { ExifInterface exif = new ExifInterface(_path); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); Log.v(TAG, "Orient: " + exifOrientation); int rotate = 0; switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; } Log.v(TAG, "Rotation: " + rotate); if (rotate != 0) { // Getting width & height of the given image. int w = bitmap.getWidth(); int h = bitmap.getHeight(); // Setting pre rotate Matrix mtx = new Matrix(); mtx.preRotate(rotate); // Rotating Bitmap bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); } // Convert to ARGB_8888, required by tess bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); } catch (IOException e) { Log.e(TAG, "Couldn't correct orientation: " + e.toString()); } // _image.setImageBitmap( bitmap ); Log.v(TAG, "Before baseApi"); TessBaseAPI baseApi = new TessBaseAPI(); // baseApi.setDebug(true); baseApi.init(DATA_PATH, lang); baseApi.setImage(bitmap); String recognizedText = baseApi.getUTF8Text(); baseApi.end(); // You now have the text in recognizedText var, you can do anything with it. // We will display a stripped out trimmed alpha-numeric version of it (if lang is eng) // so that garbage doesn't make it to the display. Log.v(TAG, "OCRED TEXT: " + recognizedText); /*if ( lang.equalsIgnoreCase("eng") ) { recognizedText = recognizedText.replaceAll("[^a-zA-Z0-9]+", " "); }*/ recognizedText = recognizedText.trim(); Intent myIntent = new Intent(OCR.this, getInfo.class); myIntent.putExtra("text", recognizedText); // Optional parameters OCR.this.startActivity(myIntent); // Cycle done. }