Aditya
Aditya

Reputation: 23

Android Tesseract taking too long and returning absurd data

I'm building an android tesseract app. It was reading the data fine until I was taking photos from the default camera app. Now, I needed to implement my own custom camera, that caused it to start giving wrong result.

public class getButtonClicked implements View.OnClickListener{
    public void onClick(View arg0) {


        DATA_PATH = Environment.getExternalStorageDirectory().toString() + "/MyOCRApp/";



        File tessdata = new File(DATA_PATH);
        if (!tessdata.isDirectory()){
            throw new IllegalArgumentException("Data path must contain subfolder tessdata!");
        }

        TessBaseAPI baseApi = new TessBaseAPI();
        baseApi.setDebug(true);
        baseApi.init(DATA_PATH, lang);
        if (newImg == null){
            baseApi.setImage(imageBitmap);
        }
        else{
            baseApi.setImage(newImg);
        }

        String recognizedText = baseApi.getUTF8Text();


        // 1. Instantiate an AlertDialog.Builder with its constructor
        AlertDialog.Builder builder = new AlertDialog.Builder(context);

        // 2. Chain together various setter methods to set the dialog characteristics
        builder.setMessage("Recognized Text:\n\n" + recognizedText);


        // 3. Get the AlertDialog from create()
        AlertDialog dialog = builder.create();
        dialog.show();

        //baseApi.end();
    }
}

This is the code that calls the tesseract APIs.

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d("Error creating file" ,"!");
            return;
        }

        int screenWidth = getResources().getDisplayMetrics().widthPixels;
        int screenHeight = getResources().getDisplayMetrics().heightPixels;
        bm = BitmapFactory.decodeByteArray(data, 0, (data != null) ? data.length : 0);

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            // Notice that width and height are reversed
            Bitmap scaled = Bitmap.createScaledBitmap(bm, screenHeight, screenWidth, true);
            int w = scaled.getWidth();
            int h = scaled.getHeight();
            // Setting post rotate to 90
            Matrix mtx = new Matrix();
            mtx.postRotate(90);
            // Rotating Bitmap
            MainActivity.imageBitmap = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, true);
        }else{// LANDSCAPE MODE
            //No need to reverse width and height
            Bitmap scaled = Bitmap.createScaledBitmap(bm, screenWidth,screenHeight , true);
            MainActivity.imageBitmap = scaled;
        }

        Calendar c = Calendar.getInstance();
        String time = Integer.toString(c.get(Calendar.DATE));
        //MediaStore.Images.Media.insertImage(getContentResolver(), MainActivity.imageBitmap, time+"MyOCR", "Hello!!");

        String root = Environment.getExternalStorageDirectory().toString();
        File myDir = new File(root + "/MyOCRApp");
        if (! myDir.exists()){
            if (! myDir.mkdirs()){
                Log.d("MyCameraApp", "failed to create directory");
                return;
            }
        }


        String fname = "Image-" +time+ ".jpg";
        File file = new File(myDir, fname);
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            MainActivity.imageBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
            MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }

        surfaceDestroyed(mSurfaceHolder);
    }
};

This is the code in my camera class. I even debugged and checked that the picture was perfectly fine, when the tesseract APIs are called. I can't post photos, otherwise I have posted one. What should I do??

Upvotes: 0

Views: 563

Answers (1)

b00n12
b00n12

Reputation: 1428

I am experimenting with tesseract on android as well. Try to rescale your image. An image taken by the camera activity maybe to big. Additionaly you probably have to pre-process the image (contrast, horizontal alignment of text, ...)

Upvotes: 1

Related Questions