OpenCV-Android平台应用实战 - 银行卡卡号识别(04、拍照和相册功能)

版权声明:本文由 Micheal 超 博客 创作,未经博主允许不得转载。 https://blog.csdn.net/qq_42887760/article/details/86704478

图像选择功能 + 拍照功能

  • 图像选择功能(调用系统函数实现)
    在这里插入图片描述
  • 拍照功能(调用API函数)
    在这里插入图片描述
  • 页面跳转
    通过Intent和startActivity方法实现

前提:

已经完成上一节的界面创建等工作:OpenCV-Android平台应用实战 - 银行卡卡号识别(03、算法流程与界面设计)
目录结构如下:
在这里插入图片描述

AndroidManifest.xml代码:

  • 添加如下代码即可:
	<!-- 设置访问 SD卡的 读写 权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!-- 设置摄像头的访问权限 -->
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
  • 图片:
    在这里插入图片描述

MainActivity.java 代码:

package com.example.opencvtest;

import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn_take_picture,btn_select_picture;
    private String TAG = "OPenCV-Android";
    private int REQUEST_CAPTURE_IMAGE = 1;
    private Uri fileUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_take_picture = (Button) this.findViewById(R.id.take_picture_btn);
        btn_select_picture = (Button) this.findViewById(R.id.select_picture_btn);
        btn_take_picture.setOnClickListener(this);
        btn_select_picture.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.take_picture_btn:
                start2Camera();
                break;
            case R.id.select_picture_btn:
                pickUpImage();
                break;
            default:
                break;
        }
    }

    private void start2Camera() {//调用摄像头拍照的功能
        //打开摄像头
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fileUri = Uri.fromFile(getSaveFilePath());
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);//指定图片输出地址
        startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);
    }

    private File getSaveFilePath() {
        String status = Environment.getExternalStorageState();
        if(!status.equals(Environment.MEDIA_MOUNTED)) {
            Log.i(TAG, "SD Card is not suitable...");
            return null;
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd_hhmmss");
        String name = df.format(new Date(System.currentTimeMillis()))+ ".jpg";
        File filedir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myOcrImages");
        filedir.mkdirs();
        String fileName = filedir.getAbsolutePath() + File.separator + name;
        File imageFile = new File(fileName);
        return imageFile;
    }

    private void pickUpImage() {//相册选择图片的功能
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "图像选择..."), REQUEST_CAPTURE_IMAGE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_CAPTURE_IMAGE && resultCode == RESULT_OK) {
            if(data == null) {
                Intent intent = new Intent(getApplicationContext(), CardOCRActivity.class);
                intent.putExtra("PICTURE-URL", fileUri);
                startActivity(intent);
            } else {
                Uri uri = data.getData();
                Intent intent = new Intent(getApplicationContext(), CardOCRActivity.class);
                File f = new File(getRealPath(uri));
                intent.putExtra("PICTURE-URL", Uri.fromFile(f));
                startActivity(intent);
            }
        }
    }

    private String getRealPath(Uri uri) {
        String filePath = null;
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT){//4.4及以上
            String wholeID = DocumentsContract.getDocumentId(uri);
            String id = wholeID.split(":")[1];
            String[] column = { MediaStore.Images.Media.DATA };
            String sel = MediaStore.Images.Media._ID + "=?";
            Cursor cursor = getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
                    sel, new String[] { id }, null);
            int columnIndex = cursor.getColumnIndex(column[0]);
            if (cursor.moveToFirst()) {
                filePath = cursor.getString(columnIndex);
            }
            cursor.close();
        }else{//4.4以下,即4.4以上获取路径的方法
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = getApplicationContext().getContentResolver().query(uri, projection, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            filePath = cursor.getString(column_index);
        }
        Log.i("CV_TAG", "selected image path : " + filePath);
        return filePath;
    }
}

  • 解说:
  1. startActivityForResult(intent, REQUEST_CAPTURE_IMAGE); ----56行代码
    用来启动另一个拍照活动的,这个与startactivity是不一样的,startactivity只有一个参数,intent,这个有两个参数,第二个参数是requestcode,请求码,我们让请求码为1.
    如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写 onActivityResult(int requestCode, int resultCode, Intent data)方法。

CardOCRActivity.java 代码:

package com.example.opencvtest;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class CardOCRActivity extends AppCompatActivity implements View.OnClickListener {
    private String TAG = "OCR-DEMO";
    Button recognitionBtn;
    private Uri fileUri;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_card_ocr);
        recognitionBtn= (Button) this.findViewById(R.id.recognition_btn);
        recognitionBtn.setOnClickListener(this);
        fileUri = (Uri)this.getIntent().getParcelableExtra("PICTURE-URL");
        if(fileUri != null) {
            displaySelectedImage();
        }
    }
    private void displaySelectedImage() {
        ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(fileUri.getPath(), options);
        int w = options.outWidth;
        int h = options.outHeight;
        int inSample = 1;
        if(w > 1000 || h > 1000) {
            while(Math.max(w/inSample, h/inSample) > 1000) {
                inSample *=2;
            }
        }
        options.inJustDecodeBounds = false;
        options.inSampleSize = inSample;
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap bm = BitmapFactory.decodeFile(fileUri.getPath(), options);
        imageView.setImageBitmap(bm);
    }

    @Override
    public void onClick(View v) {

    }
}

运行截图

  • 拍照功能
    在这里插入图片描述
  • 相册选图
    在这里插入图片描述

相册所用图片(下图)来自百度图片,若有侵权,请联系删除
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/86704478