欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

paddle ocr 安卓手机端

程序员文章站 2022-05-02 23:46:47
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();
        }
    }
}

android-demo代码

本文地址:https://blog.csdn.net/qq_35482604/article/details/107955518

相关标签: 安卓