paddle ocr 安卓手机端
程序员文章站
2022-07-06 13:39:56
paddle ocr 安卓----功能: 输入一段视频,手机端识别相应帧的文字。主要修改代码是MiniActivitypackage com.baidu.paddle.lite.demo.ocr;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Build;import android.os.Bundle;import android.os.Handler;impor...
paddle ocr 安卓----功能: 输入一段视频,手机端识别相应帧的文字。
主要修改代码是MiniActivity
package com.baidu.paddle.lite.demo.ocr;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.media.MediaMetadataRetriever;
import android.os.Environment;
import android.graphics.Bitmap.CompressFormat;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
public class MiniActivity extends AppCompatActivity {
public static final int REQUEST_LOAD_MODEL = 0;
public static final int REQUEST_RUN_MODEL = 1;
public static final int REQUEST_UNLOAD_MODEL = 2;
public static final int RESPONSE_LOAD_MODEL_SUCCESSED = 0;
public static final int RESPONSE_LOAD_MODEL_FAILED = 1;
public static final int RESPONSE_RUN_MODEL_SUCCESSED = 2;
public static final int RESPONSE_RUN_MODEL_FAILED = 3;
private static final String TAG = "MiniActivity";
protected Handler receiver = null; // Receive messages from worker thread
protected Handler sender = null; // Send command to worker thread
protected HandlerThread worker = null; // Worker thread to load&run model
protected volatile Predictor predictor = null;
private String assetModelDirPath = "models/ocr_v1_for_cpu";
private String assetlabelFilePath = "labels/ppocr_keys_v1.txt";
private Button button;
private ImageView imageView; // image result
private TextView textView; // text result
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mini);
Log.i(TAG, "SHOW in Logcat");
// Prepare the worker thread for mode loading and inference
worker = new HandlerThread("Predictor Worker");
worker.start();
sender = new Handler(worker.getLooper()) {
public void handleMessage(Message msg) {
switch (msg.what) {
case REQUEST_LOAD_MODEL:
// Load model and reload test image
if (!onLoadModel()) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MiniActivity.this, "Load model failed!", Toast.LENGTH_SHORT).show();
}
});
}
break;
case REQUEST_RUN_MODEL:
// Run model if model is loaded
final boolean isSuccessed = onRunModel();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (isSuccessed){
onRunModelSuccessed();
}else{
Toast.makeText(MiniActivity.this, "Run model failed!", Toast.LENGTH_SHORT).show();
}
}
});
break;
}
}
};
sender.sendEmptyMessage(REQUEST_LOAD_MODEL); // corresponding to REQUEST_LOAD_MODEL, to call onLoadModel()
imageView = findViewById(R.id.imageView);
textView = findViewById(R.id.sample_text);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sender.sendEmptyMessage(REQUEST_RUN_MODEL);
}
});
}
@Override
protected void onDestroy() {
onUnloadModel();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
worker.quitSafely();
} else {
worker.quit();
}
super.onDestroy();
}
/**
* call in onCreate, model init
*
* @return
*/
private boolean onLoadModel() {
if (predictor == null) {
predictor = new Predictor();
}
return predictor.init(this, assetModelDirPath, assetlabelFilePath);
}
/**
* init engine
* call in onCreate
*
* @return
*/
private boolean onRunModel() {
// String dataPath = Environment.getExternalStorageDirectory()+ "/testVideo.mp4"; //手机上Sd卡上的路径
// System.out.println(dataPath);
String dataPath="images/test1.mp4";
try {
// InputStream videoStream = getAssets().open(dataPath); //视频流
// Log.d("videoStream", "videoStream "+videoStream);
File file=new File(dataPath); //文件不存在
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
AssetFileDescriptor afd = getAssets().openFd(dataPath); //要注意所选文件视频不为空,打开摄像头的录像功能
// if(file.exists()){
// retriever.setDataSource(file.getAbsolutePath());//设置数据源为该文件对象指定的绝对路径
// Bitmap bitmap=retriever.getFrameAtTime();//获得视频第一帧的Bitmap对象
// if(bitmap!=null){
// imageView.setImageBitmap(bitmap);//设置ImageView显示的图片
// Toast.makeText(MiniActivity.this, "获取视频缩略图成功", Toast.LENGTH_SHORT).show();//获取视频缩略图成功,弹出消息提示框
// }else{
// Toast.makeText(MiniActivity.this, "获取视频缩略图失败", Toast.LENGTH_SHORT).show();//获取视频缩略图失败,弹出消息提示框
// }
// }else{
// Toast.makeText(MiniActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();//文件不存在时,弹出消息提示框
// }
retriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
// Log.d("Build.VERSION.SDK_INT", "判断其是否大于14: "+Build.VERSION.SDK_INT); //注释
// retriever.setDataSource(dataPath,new HashMap<String, String>()); //文件不存在
// Log.d("video_info", "onBindViewHolder:视频路径检测 "+dataPath);
// 取得视频的长度(单位为毫秒)
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
// 取得视频的长度(单位为秒)
int seconds = Integer.valueOf(time) / 1000;
Log.d("seconds", "seconds: "+seconds);
// 得到每一秒时刻的bitmap比如第一秒,第二秒
for (int i = 1; i <= seconds; i++) {
Log.d("seconds_i", "seconds_i: "+i);
Bitmap bitmap = retriever.getFrameAtTime(i*1000*1000,MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
//可视化
try {
predictor.setInputImage(bitmap);
final boolean isSuccessed = predictor.isLoaded()&&predictor.runModel();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (isSuccessed){
onRunModelSuccessed();
}else{
Toast.makeText(MiniActivity.this, "Run model failed!", Toast.LENGTH_SHORT).show();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace(); //报错但会继续执行
return false;
}
return false;
}
// try {
// String assetImagePath = "images/1.jpg";
//
// InputStream imageStream = getAssets().open(assetImagePath);
// Bitmap image = BitmapFactory.decodeStream(imageStream);
// // Input is Bitmap
// predictor.setInputImage(image);
// return predictor.isLoaded() && predictor.runModel();
// } catch (IOException e) {
// e.printStackTrace();
// return false;
// }
private void onRunModelSuccessed() {
Log.i(TAG, "onRunModelSuccessed");
textView.setText(predictor.outputResult);
imageView.setImageBitmap(predictor.outputImage);
}
private void onUnloadModel() {
if (predictor != null) {
predictor.releaseModel();
}
}
}
本文地址:https://blog.csdn.net/qq_35482604/article/details/107955518
推荐阅读
-
诺基亚9 PureView五摄手机再曝光 将搭载安卓9 Pie系统
-
微信登录失败怎么办?安卓手机微信登录失败的解决方法
-
谷歌出手强推USB-PD快充:不支持的安卓手机或无缘GMS服务
-
谷歌要求安卓手机厂商最新机型支持USB PD快充标准
-
这就是微软折叠屏手机Surface Duo!采用谷歌深度定制安卓系统
-
安卓11加入全新手势:双击手机背部激活特定功能
-
小米9 Pro定制超大号横向线性马达:可能是安卓手机中最好的
-
安卓8.0及以上机型开放华为云电脑:手机秒变Windows电脑
-
安卓手机使用快播看片暑期全攻略详情介绍
-
微信如何查看已撤回消息显示 微信消息显示已撤回查看方法(含安卓/iPhone手机)