Android-Ocr с использованием Tesseract в портретной ориентации

Я использовал образец распознавания по этой ссылке https://github.com/rmtheis/android-ocr Все работает нормально, но я хочу, чтобы это было в портретном режиме, я выполнил шаги по этой ссылке, Zxing Camera в портретном режиме на Android, чтобы включить ocr tesstow в портретном режиме . Вид теперь портретный, но камера по-прежнему делает снимок в ландшафтном режиме.

Любая помощь ? введите здесь описание изображения

введите здесь описание изображения

  final class PreviewCallback implements Camera.PreviewCallback {

  private static final String TAG = PreviewCallback.class.getSimpleName();

  private final CameraConfigurationManager configManager;
  private Handler previewHandler;
  private int previewMessage;

  PreviewCallback(CameraConfigurationManager configManager) {
  this.configManager = configManager;
  }

  void setHandler(Handler previewHandler, int previewMessage) {
  this.previewHandler = previewHandler;
  this.previewMessage = previewMessage;
  }

 // (NV21) format.
 @Override
  public void onPreviewFrame(byte[] data, Camera camera) {
  Point cameraResolution = configManager.getCameraResolution();
  Handler thePreviewHandler = previewHandler;
  if (cameraResolution != null && thePreviewHandler != null) {
  Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x,
      cameraResolution.y, data);
   message.sendToTarget();
   previewHandler = null;
   } else {
    Log.d(TAG, "Got preview callback, but no handler or resolution available");
   }
   }

person Reham    schedule 02.03.2014    source источник


Ответы (2)


Используете ли вы данные предварительного просмотра с помощью этого метода:

public void onPreviewFrame(byte[] data, Camera camera) {}

Если да, то я могу вам помочь, так как я делаю очень похожий проект (который скоро будет с открытым исходным кодом)

вот код, который я использую для поворота изображения предварительного просмотра

public static Bitmap getBitmapImageFromYUV(byte[] data, int width,
        int height, int degree, Rect rect) {
    Bitmap bitmap = getBitmapImageFromYUV(data, width, height, rect);
    return rotateBitmap(bitmap, degree,rect);

}

public static Bitmap rotateBitmap(Bitmap source, float angle, Rect rect) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);

    source = Bitmap.createBitmap(source, 0, 0, source.getWidth(),
            source.getHeight(), matrix, true);
    source = Bitmap.createBitmap(source, rect.left, rect.top, rect.width(), rect.height());

    if(mShouldSavePreview)
        saveBitmap(source);
    return source;

}

public static Bitmap getBitmapImageFromYUV(byte[] data, int width,
        int height, Rect rect) {
    YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height,
            null);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    yuvimage.compressToJpeg(new Rect(0, 0, width, height), 90, baos);

    byte[] jdata = baos.toByteArray();
    BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
    bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
    Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length,
            bitmapFatoryOptions);

    Log.d(TAG,"getBitmapImageFromYUV w:"+bmp.getWidth()+" h:"+bmp.getHeight());


    return bmp;
}
person MP23    schedule 02.03.2014
comment
Да, но куда мне добавить этот код. я добавил класс PreviewCallback в приведенный выше код. Можете ли вы помочь мне с этим - person Reham; 02.03.2014
comment
Проверьте, что эта часть является моим источником здесь: gist.github.com/mplackowski/4be81b0d4c658db79544 из предварительного просмотра обратного вызова, вам нужно захватить массив byte[] и использовать этот метод 'getBitmapImageFromYUV(byte[] data, int width, int height, int degree, Rect rect)' извлеченное растровое изображение переходит к объекту Tesseract (я использую tess-two) - person MP23; 02.03.2014
comment
В соответствии с вашей реализацией вам нужно поместить этот код в то место, где массив данных [] преобразуется в растровое изображение, вы отправляете его с сообщением, но я понятия не имею, где он преобразуется в вашем коде - person MP23; 02.03.2014
comment
Спасибо, но код, который я пытаюсь использовать, сложен. До сих пор я не нашел способа использовать с ним ваш код. - person Reham; 02.03.2014
comment
Хорошо, я это понимаю, но вы наверняка сможете найти место, где массив данных конвертируется в Bitmap. Он находится в альбомной ориентации, поэтому вам нужно повернуть его, прежде чем вы получите окончательное растровое изображение для дальнейшей обработки. - person MP23; 02.03.2014
comment
Вы можете проверить мой код здесь: github.com/mplackowski/previewOCR, но прежде всего вы должны показать часть вашего кода, где вы получаете растровое изображение изображения из массива байтов - person MP23; 06.03.2014
comment
Я предполагаю, что решение начнется с этого класса, github.com/rmtheis/android-ocr/blob/master/android/src/edu/sfsu/ - person Reham; 09.03.2014
comment
@ Рехан, ты решишь проблему, потому что я столкнулся с той же проблемой. - person Bubunyo Nyavor; 09.08.2014

ребята я нашел решение!

Замените следующий код в функции: ocrDecode(byte[] data, int width, int height) в файле DecodeHandler.java

    beepManager.playBeepSoundAndVibrate();
    activity.displayProgressDialog();

    // *************SHARNOUBY CODE
    byte[] rotatedData = new byte[data.length];
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++)
            rotatedData[x * height + height - y - 1] = data[x + y * width];
    }
    int tmp = width;
    width = height;
    height = tmp;
    //******************************
    // Launch OCR asynchronously, so we get the dialog box displayed
    // immediately
    new OcrRecognizeAsyncTask(activity, baseApi, rotatedData, width, height)
        .execute();

...проблема была в случае переключения в функции handleMessage(Message message), второй случай никогда не запускался, что вызывает код ротации

person Mohammed El-Sharnouby    schedule 28.09.2014