Проблемы с приложением Simple OCR с использованием Firebase ML Kit - PullRequest
1 голос
/ 23 февраля 2020

Я новичок в Android разработке, но я учился на пути к тому, как я создаю свое первое приложение OCR с использованием Firebase в Java. Я по существу следовал видео на YouTube, чтобы создать приложение, но у меня были следующие проблемы, с которыми мне требовалась помощь:

1) Если я делаю снимок в альбомной ориентации, приложение может обнаружить текст. Однако, когда я делаю снимок в портретной ориентации, захваченное изображение поворачивается на 90 градусов, и приложение не может обнаружить текст на изображении. Какой самый простой способ решить эту проблему?

2) В настоящее время я делаю снимок с помощью камеры телефона, и это изображение отображается в приложении. Я нажимаю кнопку обнаружения текста, и появляется текст. Но я хотел бы видеть некоторые ограничивающие рамки на изображениях, которые показывают, что видит набор Firebase ML.

3) Также, когда я делаю простой скриншот экрана пин-кода смартфона, приложение может обнаружить большинство чисел , но это всегда, кажется, пропустить один. Я предполагаю, что это потому, что я использую локальную версию телефона Firebase ML kit для телефона, но возможно ли сделать ее более точной, не работая в облаке. В настоящее время я использую:

implementation 'com.google.firebase:firebase-core:15.0.2'

implementation 'com.google.firebase:firebase-ml-vision:16.0.0'

Спасибо

Ниже приведен код в моей основной деятельности (это почти то же самое в Firebase):

'''public class MainActivity extends AppCompatActivity {
Button captureImageBtn, detectTextBtn;
ImageView imageView;
TextView textView, outputText;
Bitmap imageBitmap;
static final int REQUEST_IMAGE_CAPTURE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActionBar actionBar = getSupportActionBar();
    actionBar.setTitle("Image Reader");
    actionBar.setDisplayUseLogoEnabled(true);
    actionBar.setDisplayShowHomeEnabled(true);

    captureImageBtn = findViewById(R.id.capture_image_btn);
    detectTextBtn = findViewById(R.id.detect_text_image_btn);
    imageView = findViewById(R.id.image_view);
    textView = findViewById(R.id.text_display);

    outputText = findViewById(R.id.outputText);
    outputText.setVisibility(View.INVISIBLE);

    imageView.setImageResource(R.mipmap.mi2_foreground);

    captureImageBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dispatchTakePictureIntent();
            textView.setText("");
        }
    });

    detectTextBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            detectTextFromImage();
        }
    });
}

public boolean onCreateOptionsMenu(Menu menu){

    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageBitmap(imageBitmap);
    }
}

private void detectTextFromImage()
{
    FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromBitmap(imageBitmap);
    FirebaseVisionTextDetector firebaseVisionTextDetector = FirebaseVision.getInstance().getVisionTextDetector();
    firebaseVisionTextDetector.detectInImage(firebaseVisionImage).addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
        @Override
        public void onSuccess(FirebaseVisionText firebaseVisionText) {
            displayTextFromImage(firebaseVisionText);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(MainActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void displayTextFromImage(FirebaseVisionText firebaseVisionText) {
    List<FirebaseVisionText.Block> blockList = firebaseVisionText.getBlocks();
    if (blockList.size() == 0) {
        Toast.makeText(MainActivity.this, "No Text Found in Image.", Toast.LENGTH_SHORT).show();
    } else {
        int i = 0;
        String complete ="";
        for (FirebaseVisionText.Block block : firebaseVisionText.getBlocks()) {
            String text = block.getText();
            complete = complete.concat(text+" ");
        outputText.setVisibility(View.VISIBLE);
        outputText.setText(complete);
    }
}

}

...