Android 类似CamCard的应用程序,可从图像中识别文本并填写表单
我想创建一个类似CamCard的应用程序,它将作为ocr工作,并将文本填充到特定字段中, 我已经使用Firebase MLKit作为图像文本识别器,但问题是它现在给我文本作为列表,如何获取与哪个字段相关的文本 我的基本实现如下Android 类似CamCard的应用程序,可从图像中识别文本并填写表单,android,ocr,firebase-mlkit,Android,Ocr,Firebase Mlkit,我想创建一个类似CamCard的应用程序,它将作为ocr工作,并将文本填充到特定字段中, 我已经使用Firebase MLKit作为图像文本识别器,但问题是它现在给我文本作为列表,如何获取与哪个字段相关的文本 我的基本实现如下 FirebaseApp.initializeApp(this); FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bm); FirebaseVisionTextRecognize
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;i示例[完整代码]
文件
Hi!虽然这可以回答问题,但最好在代码中包含更多信息(注释、解释等),否则其他人可能很难理解。