Распознавание текста MLKit в портретной ориентации

Я следил по этой ссылке, касающейся распознавания текста Firebase MLKit (OCR) для iOS, и, похоже, он работает нормально, за исключением случаев, когда выбранная фотография (с помощью камеры или библиотеки) была сделана в портретной ориентации. При обработке фотографии в портретной ориентации на изображении не обнаруживается никакого содержимого.

Я делал снимки с одинакового расстояния до объекта и следил за тем, чтобы изображение было резким и в фокусе.

Руководство по Firebase MLKit

Является ли это ограничением распознавания текста MLKit на устройстве или есть какие-то настройки, которые я просмотрел?

Нужно ли мне манипулировать изображением и вращать его? Это может показаться странным!

Любые указатели были бы очень признательны


person teh_raab    schedule 29.04.2019    source источник


Ответы (2)


Изображение нужно будет поместить в распознаватель «правильной стороной вверх». Дополнительные сведения см. В примере быстрого запуска iOS.

person Hoi    schedule 08.11.2019
comment
Спасибо - я действительно забыл, что у меня был открытый вопрос. В конце концов, я заставил его работать, убедившись, что ориентация правильная :) - person teh_raab; 08.11.2019

Так было из-за ориентации. Решение, которое было взято с другого сайта ..

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        if (imageUri == null) {
            Log.d(TAG, "imageUri is null!")
            return
        }
        Log.d(TAG, "$imageUri")
        val bmp = MediaStore.Images.Media.getBitmap(contentResolver, imageUri)

        //we need to rotate the image as cameras can be embedded in the hardware in different orientations.  Make the bitmap upright before we attempt to process it..
        val rotatedImg = rotateImageIfRequired(this, bmp, imageUri!!)

        processImage(rotatedImg) //parse this into the ML vision
    } else {
        Log.d(TAG, "onActivityResult -> resultCode: $resultCode")
    }
}

private fun rotateImageIfRequired(context: Context, img: Bitmap, selectedImage: Uri): Bitmap {
    Log.d(TAG, "rotateImageIfRequired")
    val input = context.getContentResolver().openInputStream(selectedImage);
    var ei: ExifInterface? = null
    if (Build.VERSION.SDK_INT > 23)
        ei = ExifInterface(input);
    else
        ei = ExifInterface(selectedImage.getPath());

    val orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

    when (orientation) {
        ExifInterface.ORIENTATION_ROTATE_90 -> return rotateImage(img, 90f);
        ExifInterface.ORIENTATION_ROTATE_180 -> return rotateImage(img, 180f);
        ExifInterface.ORIENTATION_ROTATE_270 -> return rotateImage(img, 270f);
        else -> return img;
    }
}

private fun rotateImage(img: Bitmap, degree: Float): Bitmap {
    Log.d(TAG, "rotateImage() degree: $degree")
    var matrix = Matrix();
    matrix.postRotate(degree);
    val rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
    img.recycle();
    return rotatedImg;
}
person teh_raab    schedule 08.11.2019