如今,许多应用程序在其应用程序内使用机器学习来简化大多数任务。我们已经看到许多可以检测任何图像文本的应用程序。该图像可能包括车号牌,图像等。在本文中,我们将介绍使用Firebase ML Kit在Android中实现文本检测器的方法。
我们将在本文中构建什么?
我们将构建一个简单的应用程序,在该应用程序中,我们将捕获应用程序内任何文本的图像,然后从该特定图像中提取文本并将其显示在文本字段中。下面提供了一个示例视频,以使您对我们在本文中将要做的事情有个大概的了解。注意,我们将使用Java语言实现该项目。
分步实施
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。
第2步:将您的应用连接到Firebase
在Android Studio中创建新项目后,将您的应用连接到Firebase。用于将您的应用程序连接到Firebase。导航到顶部栏上的“工具”。之后,单击Firebase。右侧将打开一个新窗口。在该窗口中,单击Firebase ML,然后单击“使用Firebase ML识别图像中的文本”。您可以在屏幕截图下方看到该选项。
单击此选项后,您将看到以下屏幕。在此屏幕上,单击“连接到Firebase”选项以将您的应用程序连接到Firebase。您将看到以下屏幕。
单击“连接”选项,将您的应用程序连接到Firebase,并将以下依赖项添加到build.gradle文件中。
步骤3:将依赖项添加到build.gradle文件
导航至应用程序> Gradle脚本> build.gradle文件,然后将以下代码添加到其中。在代码中添加了注释,以便更详细地了解。
Note: Use the following version(15.0.0) for the firebase ML kit if you are getting some error in the MainActivity.java file.
// dependancy for firebase ml kit
implementation ‘com.google.firebase:firebase-ml-vision:15.0.0’
// dependancy for firebase core.
implementation’com.google.firebase:firebase-core:15.0.2′
步骤4:在Android应用中添加摄像头权限以访问摄像头
导航至应用程序> AndroidManifest.xml文件,然后将以下代码添加到其中。在代码中添加了注释,以便更详细地了解。
XML
XML
Java
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.ml.vision.FirebaseVision;
import com.google.firebase.ml.vision.common.FirebaseVisionImage;
import com.google.firebase.ml.vision.text.FirebaseVisionText;
import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// creating variables for our
// image view, text view and two buttons.
private ImageView img;
private TextView textview;
private Button snapBtn;
private Button detectBtn;
// variable for our image bitmap.
private Bitmap imageBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// on below line we are initializing our variables.
img = (ImageView) findViewById(R.id.image);
textview = (TextView) findViewById(R.id.text);
snapBtn = (Button) findViewById(R.id.snapbtn);
detectBtn = (Button) findViewById(R.id.detectbtn);
// adding on click listener for detect button.
detectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// calling a method to
// detect a text .
detectTxt();
}
});
snapBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// calling a method to capture our image.
dispatchTakePictureIntent();
}
});
}
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
// in the method we are displaying an intent to capture our image.
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// on below line we are calling a start activity
// for result method to get the image captured.
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);
// calling on activity result method.
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// on below line we are getting
// data from our bundles. .
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
// below line is to set the
// image bitmap to our image.
img.setImageBitmap(imageBitmap);
}
}
private void detectTxt() {
// this is a method to detect a text from image.
// below line is to create variable for firebase
// vision image and we are getting image bitmap.
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(imageBitmap);
// below line is to create a variable for detector and we
// are getting vision text detector from our firebase vision.
FirebaseVisionTextDetector detector = FirebaseVision.getInstance().getVisionTextDetector();
// adding on success listener method to detect the text from image.
detector.detectInImage(image).addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(FirebaseVisionText firebaseVisionText) {
// calling a method to process
// our text after extracting.
processTxt(firebaseVisionText);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// handling an error listener.
Toast.makeText(MainActivity.this, "Fail to detect the text from image..", Toast.LENGTH_SHORT).show();
}
});
}
private void processTxt(FirebaseVisionText text) {
// below line is to create a list of vision blocks which
// we will get from our firebase vision text.
List blocks = text.getBlocks();
// checking if the size of the
// block is not equal to zero.
if (blocks.size() == 0) {
// if the size of blocks is zero then we are displaying
// a toast message as no text detected.
Toast.makeText(MainActivity.this, "No Text ", Toast.LENGTH_LONG).show();
return;
}
// extracting data from each block using a for loop.
for (FirebaseVisionText.Block block : text.getBlocks()) {
// below line is to get text
// from each block.
String txt = block.getText();
// below line is to set our
// string to our text view.
textview.setText(txt);
}
}
}
步骤5:使用activity_main.xml文件
导航到应用程序> res>布局> activity_main.xml,然后将以下代码添加到该文件中。以下是activity_main.xml文件的代码。
XML格式
步骤6:使用MainActivity。 Java文件
转到MainActivity。 Java文件并参考以下代码。下面是MainActivity的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
Java
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.ml.vision.FirebaseVision;
import com.google.firebase.ml.vision.common.FirebaseVisionImage;
import com.google.firebase.ml.vision.text.FirebaseVisionText;
import com.google.firebase.ml.vision.text.FirebaseVisionTextDetector;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// creating variables for our
// image view, text view and two buttons.
private ImageView img;
private TextView textview;
private Button snapBtn;
private Button detectBtn;
// variable for our image bitmap.
private Bitmap imageBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// on below line we are initializing our variables.
img = (ImageView) findViewById(R.id.image);
textview = (TextView) findViewById(R.id.text);
snapBtn = (Button) findViewById(R.id.snapbtn);
detectBtn = (Button) findViewById(R.id.detectbtn);
// adding on click listener for detect button.
detectBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// calling a method to
// detect a text .
detectTxt();
}
});
snapBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// calling a method to capture our image.
dispatchTakePictureIntent();
}
});
}
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
// in the method we are displaying an intent to capture our image.
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// on below line we are calling a start activity
// for result method to get the image captured.
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);
// calling on activity result method.
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// on below line we are getting
// data from our bundles. .
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
// below line is to set the
// image bitmap to our image.
img.setImageBitmap(imageBitmap);
}
}
private void detectTxt() {
// this is a method to detect a text from image.
// below line is to create variable for firebase
// vision image and we are getting image bitmap.
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(imageBitmap);
// below line is to create a variable for detector and we
// are getting vision text detector from our firebase vision.
FirebaseVisionTextDetector detector = FirebaseVision.getInstance().getVisionTextDetector();
// adding on success listener method to detect the text from image.
detector.detectInImage(image).addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(FirebaseVisionText firebaseVisionText) {
// calling a method to process
// our text after extracting.
processTxt(firebaseVisionText);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// handling an error listener.
Toast.makeText(MainActivity.this, "Fail to detect the text from image..", Toast.LENGTH_SHORT).show();
}
});
}
private void processTxt(FirebaseVisionText text) {
// below line is to create a list of vision blocks which
// we will get from our firebase vision text.
List blocks = text.getBlocks();
// checking if the size of the
// block is not equal to zero.
if (blocks.size() == 0) {
// if the size of blocks is zero then we are displaying
// a toast message as no text detected.
Toast.makeText(MainActivity.this, "No Text ", Toast.LENGTH_LONG).show();
return;
}
// extracting data from each block using a for loop.
for (FirebaseVisionText.Block block : text.getBlocks()) {
// below line is to get text
// from each block.
String txt = block.getText();
// below line is to set our
// string to our text view.
textview.setText(txt);
}
}
}
现在运行您的应用程序,并查看该应用程序的输出。