Android 类似CamCard的应用程序,可从图像中识别文本并填写表单

Android 类似CamCard的应用程序,可从图像中识别文本并填写表单,android,ocr,firebase-mlkit,Android,Ocr,Firebase Mlkit,我想创建一个类似CamCard的应用程序,它将作为ocr工作,并将文本填充到特定字段中, 我已经使用Firebase MLKit作为图像文本识别器,但问题是它现在给我文本作为列表,如何获取与哪个字段相关的文本 我的基本实现如下 FirebaseApp.initializeApp(this); FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bm); FirebaseVisionTextRecognize

我想创建一个类似CamCard的应用程序,它将作为ocr工作,并将文本填充到特定字段中, 我已经使用Firebase MLKit作为图像文本识别器,但问题是它现在给我文本作为列表,如何获取与哪个字段相关的文本 我的基本实现如下

 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
                                // ...
                            }
                        });
FirebaseApp.initializeApp(此);
FirebaseVisionImage=FirebaseVisionImage.fromBitmap(bm);
FireBaseVisionExtRecognizer textRecognizer=FirebaseVision.getInstance()
.GetOnDevicetExtRecognitor();
TextRecognitor.processImage(图像)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseVisionText结果){
//任务已成功完成
// ...
字符串resultText=result.getText();
对于(FirebaseVisionText.TextBlock:result.getTextBlocks()){
String blockText=block.getText();
Float blockConfidence=block.getConfidence();
List blockLanguages=block.getRecognizedLanguages();
Point[]blockCornerPoints=block.getCornerPoints();
Rect blockFrame=block.getBoundingBox();
对于(FirebaseVisionText.Line:block.getLines()){
字符串lineText=line.getText();
Float lineConfidence=line.getConfidence();
List lineLanguages=line.getRecognizedLanguages();
Point[]lineCornerPoints=line.getCornerPoints();
Rect lineFrame=line.getBoundingBox();
对于(FirebaseVisionText.Element:line.getElements()){
字符串elementText=element.getText();
Float elementConfidence=element.getConfidence();
List elementLanguages=element.getRecognizedLanguages();
Point[]elementCornerPoints=元素。getCornerPoints();
Rect elementFrame=element.getBoundingBox();
}
}
}
}
})
.addOnFailureListener(
新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//任务失败,出现异常
// ...
}
});
从上面的监听器中,我将获得所有文本的列表,请演示如何将文本设置到相应的字段
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() );

            }
        }
    }

}
{ //mSelectedImage解析结果 私有无效处理文本识别结果(FirebaseVisionText文本) { 列表块=text.getTextBlocks(); //错误->找不到文本 if(blocks.size()==0){ txt_description.setText(getResources().getString(R.string.alert_no_text)); 返回; } mGraphicOverlay.clear(); 对于(int i=0;ielements.get(k).getText() Log.d(标记,elements.get(k.getText()); } } } } 示例[完整解释][步骤6]

示例[完整代码]

文件

Hi!虽然这可以回答问题,但最好在代码中包含更多信息(注释、解释等),否则其他人可能很难理解。