android 图像识别 ocr,android ocr 图像识别 实例源码

本文介绍了一个Android应用,利用Tesseract 3.01和Leptonica库进行图片文字识别。通过用户选择拍照或使用相机获取图片,然后对图片进行预处理并调用OCR技术,实现了文字的自动识别。关键代码展示了如何读取图片、缩放和调用Tesseract进行识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【实例简介】tess-two.tesseract3.01-leptonica1.68-LibJPEG6b

【实例截图】

【核心代码】

package com.example.ocr;

import java.io.File;

import android.app.Activity;

import android.content.Intent;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.util.DisplayMetrics;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.TextView;

import android.provider.MediaStore;

public class MainActivity extends Activity {

private static final String tag="MainActivity";

private int CHOOSE_IMAGE = 1;

private int CHOOSE_CAMERA = 2;

private String imageFilePath = "";

private boolean keyBack;

private Button btnGetpic = null;

private Button btnCamera = null;

private Button btnRecognition = null;

private ImageView imageView = null;

private TextView textView = null;

private Bitmap oriPicture = null;

//private Bitmap finPicture = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mainInitialize();

}

public void mainInitialize(){

btnCamera = (Button) findViewById(R.id.getCam);

btnGetpic = (Button) findViewById(R.id.getPic);

keyBack = false;

Log.i(tag, "initiate successfully");

btnGetpic.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

//select a particular kind of data and return it

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("image/*"); //sending image

startActivityForResult(intent,CHOOSE_IMAGE);

}

});

btnCamera.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

long dataTake = System.currentTimeMillis();

imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()

"/tesseract/" dataTake ".jpg"; //save directory

File imageFile = new File(imageFilePath);

Uri imageFileUri = Uri.fromFile(imageFile);

//have the camera application capture an image and return it

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);

//Launch the camera application for the result when it finished

startActivityForResult(intent,CHOOSE_CAMERA);

Log.i(tag, "ready to skip");

}

});

}

@Override

//Called when an activity you launched exits

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK){

setContentView(R.layout.show_image);

btnRecognition = (Button) findViewById(R.id.getResult);

textView = (TextView) findViewById(R.id.result);

imageView = (ImageView) findViewById(R.id.showImage);

textView.setVisibility(View.INVISIBLE);

keyBack = true;

Log.i(tag, "skip back successfully");

if (requestCode == CHOOSE_IMAGE) {

Uri uri = data.getData();

String[] proj = { MediaStore.Images.Media.DATA };

Cursor imagecursor = getContentResolver().query(uri,proj,null,null,null);

int actual_image_column_index = imagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

imagecursor.moveToFirst();

String img_path = imagecursor.getString(actual_image_column_index); //get the image path

oriPicture = imageReceive(img_path); //get the image and resize it if needed

oriPicture = oriPicture.copy(Bitmap.Config.ARGB_8888, true);

imageView.setImageBitmap(oriPicture);

Log.i(tag, "Ready to recognize image");

btnRecognition.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

textView.setText("text recognized(pic):\n" Tesseract.getText(oriPicture)); //get the String and show it

textView.setVisibility(View.VISIBLE);

imageView.setImageBitmap(oriPicture);

}

});

}

if(requestCode == CHOOSE_CAMERA)

{

oriPicture = imageReceive(imageFilePath); //get the image and resize it if needed

oriPicture = oriPicture.copy(Bitmap.Config.ARGB_8888, true);

imageView.setImageBitmap(oriPicture);

Log.i(tag, "Ready to recognize image");

btnRecognition.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

textView.setText("text recognized(cam):\n" Tesseract.getText(oriPicture)); //get the String and show it

textView.setVisibility(View.VISIBLE);

imageView.setImageBitmap(oriPicture);

}

});

}

}

}

//get the image and resize it if it is too large for screen

public Bitmap imageReceive(String image_path){

Bitmap bmp = null;

try{

//get the screen size

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

int dw = dm.widthPixels;

int dh = dm.heightPixels;

// Load up the image's dimensions not the image itself

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();

bmpFactoryOptions.inJustDecodeBounds = true;

bmp = BitmapFactory.decodeFile(image_path,bmpFactoryOptions);

int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);

int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);

// If both of the ratios are greater than 1,

// one of the sides of the image is greater than the screen

if (heightRatio > 1 && widthRatio > 1)

{

if (heightRatio > widthRatio) {

// Height ratio is larger, scale according to it

bmpFactoryOptions.inSampleSize = heightRatio;

}

else {

// Width ratio is larger, scale according to it

bmpFactoryOptions.inSampleSize = widthRatio;

}

}

bmpFactoryOptions.inJustDecodeBounds = false; // Decode it for real

bmp = BitmapFactory.decodeFile(image_path,bmpFactoryOptions);

}

catch(Exception e)

{

e.printStackTrace();

}

return bmp;

}

public boolean onKeyDown(int keyCode, KeyEvent event) {

//Monitoring the return key

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

if(keyBack){

setContentView(R.layout.activity_main);

mainInitialize();

}

else{

finish();

Log.i(tag, "app is over");

}

return true;

}

return super.onKeyDown(keyCode, event);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值