Reputation: 872
I want to create a CamCard like app which will work as ocr and fill text into specific fields, I have used Firebase MLKit for text recognizer from image but the issue is it gives me text as list now how to get which text is related to which field my basic implementation is as under
FirebaseApp.initializeApp(this);
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bm);
FirebaseVisionTextRecognizer textRecognizer = FirebaseVision.getInstance()
.getOnDeviceTextRecognizer();
textRecognizer.processImage(image)
.addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
@Override
public void onSuccess(FirebaseVisionText result) {
// Task completed successfully
// ...
String resultText = result.getText();
for (FirebaseVisionText.TextBlock block : result.getTextBlocks()) {
String blockText = block.getText();
Float blockConfidence = block.getConfidence();
List<RecognizedLanguage> blockLanguages = block.getRecognizedLanguages();
Point[] blockCornerPoints = block.getCornerPoints();
Rect blockFrame = block.getBoundingBox();
for (FirebaseVisionText.Line line : block.getLines()) {
String lineText = line.getText();
Float lineConfidence = line.getConfidence();
List<RecognizedLanguage> lineLanguages = line.getRecognizedLanguages();
Point[] lineCornerPoints = line.getCornerPoints();
Rect lineFrame = line.getBoundingBox();
for (FirebaseVisionText.Element element : line.getElements()) {
String elementText = element.getText();
Float elementConfidence = element.getConfidence();
List<RecognizedLanguage> elementLanguages = element.getRecognizedLanguages();
Point[] elementCornerPoints = element.getCornerPoints();
Rect elementFrame = element.getBoundingBox();
}
}
}
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
From the above listener i will get list of all the texts, Kindly demonstrate how to set text to their appropriate fields
Upvotes: 2
Views: 1005
Reputation: 136
private void runTextRecognition()
{
// mSelectedImage <- Bitmap ( picture to find text )
// convert bitmap in FirebaseVisionImage
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
FirebaseVisionTextRecognizer textRecognizer = FirebaseVision.getInstance()
.getOnDeviceTextRecognizer();
// disable btn search text in activity.
button_search_text.setEnabled(false);
textRecognizer.processImage(image)
.addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
@Override
public void onSuccess(FirebaseVisionText result)
{
// send FirebaseVisionText ( txt )
processTextRecognitionResult(result);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e)
{
button_search_text.setEnabled(true);
e.printStackTrace();
}
});
}
// processTextRecognitionResult -> parse the results
private void processTextRecognitionResult(FirebaseVisionText texts)
{
List<FirebaseVisionText.TextBlock> blocks = texts.getTextBlocks();
// ERROR -> No text found
if (blocks.size() == 0) {
txt_descripcion.setText( getResources().getString( R.string.alert_no_text ) );
return;
}
mGraphicOverlay.clear();
for (int i = 0; i < blocks.size(); i++) {
List<FirebaseVisionText.Line> lines = blocks.get(i).getLines();
for (int j = 0; j < lines.size(); j++) {
List<FirebaseVisionText.Element> elements = lines.get(j).getElements();
for (int k = 0; k < elements.size(); k++)
{
//display result in picture
Graphic textGraphic = new TextGraphic(mGraphicOverlay, elements.get(k));
mGraphicOverlay.add(textGraphic);
// (string) To get text you can use -> elements.get(k).getText()
Log.d(TAG, elements.get(k).getText() );
}
}
}
}
Example [ Full explanation ] [ Step 6 ]
https://codelabs.developers.google.com/codelabs/mlkit-android/#5
Example [ Full Code ]
https://github.com/googlecodelabs/mlkit-android/blob/6da8e85b92ca85c60e1c15f74dd6a8fefb22836f/final/app/src/main/java/com/google/firebase/codelab/mlkit/MainActivity.java#L205
Upvotes: 1