首页

android OCR图像识别

java

2020-7-29

通过摄像头识别汉字,字符和数字

package com.xianzhi.tesseract;


import java.io.File;
import java.io.FileOutputStream;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Toast;

import com.googlecode.tesseract.android.TessBaseAPI;
import com.mikewong.tool.tesseract.ImgPretreatment;
import com.xianzhi.stool.DensityUtil;
import com.xianzhi.stool.ImageFileCache;
import com.xianzhi.stool.L;
import com.xianzhi.stool.PictureUtil;
import com.xianzhi.view.CameraManager;
import com.xianzhi.view.CaptureLayout;

public class CamareActivity extends Activity implements SurfaceHolder.Callback{
	private CaptureLayout m_clCapture;
	private boolean m_bHasSurface;
	private boolean m_bPreviewReady = false;  
	private Bitmap m_bmOCRBitmap; 
	private boolean m_bScreenRequestPicture=false;
	
	private String textResult;
	private static String LANGUAGE = "eng";
	private final BroadcastReceiver m_brSDcardEvent = new BroadcastReceiver() 
	{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			
		}
		
	};
	private int rect_height;
	private int screenWidth;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		CameraManager.Initialize(getApplication());
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
		rect_height=DensityUtil.dip2px(getApplicationContext(), 25);
		
		WindowManager wm = this.getWindowManager();
		 
		DisplayMetrics  dm = new DisplayMetrics();     
		   
		getWindowManager().getDefaultDisplay().getMetrics(dm);     
		   
		screenWidth = dm.widthPixels;               
		
		setContentView(R.layout.activity_camera);
		m_clCapture = (CaptureLayout)findViewById(R.id.mezzofanti_capturelayout_view);
		//CameraManager.SetImgDivisor(2);
		m_clCapture.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				m_bScreenRequestPicture=true;
				//RequestCameraFocus();
			}
		});
		m_bHasSurface=false;
	}
	@Override
	protected void onPause() 
	{
		unregisterReceiver(m_brSDcardEvent);
		StopCamera();
		if(timer!=null){
			timer.cancel();
		}
		super.onPause();
	} 
	@Override  
	public void onDestroy() 
	{
		StopCamera();
		super.onDestroy();
	}    
	@Override
	protected void onResume() 
	{
		super.onResume();

		// remove ocr results
		m_bmOCRBitmap = null;
		System.gc();

		// install an intent filter to receive SD card related events.
		IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
		intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
		intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
		intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
		intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
		intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
		intentFilter.addDataScheme("file");
		registerReceiver(m_brSDcardEvent, intentFilter);

		m_MezzofantiMessageHandler.sendEmptyMessage(R.id.mezzofanti_startCamera);


		// returned in Capture-mode     	  
		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.mezzofanti_preview_view);
		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (m_bHasSurface) 
		{
			// The activity was paused but not stopped, so the surface still exists. Therefore
			// surfaceCreated() won't be called, so init the camera here.
			InitCamera(surfaceHolder);
		} else 
		{
			// Install the callback and wait for surfaceCreated() to init the camera.
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		if(timer!=null){
			timer.cancel();
		}
		timer = new Timer(true);
		TimerTask task = new TimerTask(){  
			public void run() {  
				Message message = new Message();      
				message.what = R.id.time_task;      
				m_MezzofantiMessageHandler.sendMessage(message);    
			}  
		};
		timer.schedule(task,3000, 3000); //延时1000ms后执行,1000ms执行一次
		
	}
	Timer timer;
	  
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		Log.i(TAG, "surfaceChanged");
		
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		if (!m_bHasSurface) 
		{
			// set the surface holder for the camera's use
			m_bHasSurface = true;
			SetCameraSurfaceHolder(holder);
			m_MezzofantiMessageHandler.sendEmptyMessage(R.id.mezzofanti_startCamera);
		} 	
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		m_bHasSurface = false;
	}
	
	
	private Handler m_MezzofantiMessageHandler = new Handler() 
	{
		@Override
		public void handleMessage(Message msg) 
		{
			switch(msg.what)
			{
			case R.id.mezzofanti_startCamera:
				InitCamera();
				break;
			case R.id.cameramanager_focus_succeded:
				Log.i(TAG, "cameramanager_focus_succeded");
				PlaySoundOnFocus();
				
				if (m_bScreenRequestPicture)
					RequestCameraTakePicture();
				m_bScreenRequestPicture = false;
				break;
				
			case R.id.cameramanager_requestpicture:
				Log.v(TAG, "handleMessage() R.id.decode");
				
				try
				{
					// save the file on disk
					FileOutputStream fs = new FileOutputStream(TrainingApp.appPath   "img.jpg");
					fs.write((byte[])msg.obj, 0, ((byte[]) msg.obj).length);
					fs.close();

					m_bmOCRBitmap = BitmapFactory.decodeByteArray((byte[]) msg.obj, 0, ((byte[]) msg.obj).length);
					m_bmOCRBitmap = PictureUtil.createRotateBitmap(m_bmOCRBitmap);
					msg.obj = null;
					System.gc();
					ImageFileCache file=new ImageFileCache();
					file.saveBitmap(m_bmOCRBitmap, "/1.jpg", "0");
					Log.v(TAG, "w=" m_bmOCRBitmap.getWidth()   " h=" m_bmOCRBitmap.getHeight());
					
					
					rect_height=rect_height*CameraManager.PreviewWidth/screenWidth;
					m_bmOCRBitmap = Bitmap.createBitmap(m_bmOCRBitmap, CameraManager.PreviewHeight/6, CameraManager.PreviewWidth/2-rect_height 15, CameraManager.PreviewHeight/6*4, rect_height*2, null, false);
					file.saveBitmap(m_bmOCRBitmap, "/2.jpg", "0");
					
					// 新线程来处理识别
					new Thread(new Runnable() {
						@Override
						public void run() {
							Bitmap bitmapTreated = ImgPretreatment
									.converyToGrayImg(m_bmOCRBitmap);
							//L.i("asdadasdas");
							m_bmOCRBitmap.recycle();
							textResult = doOcr(bitmapTreated, LANGUAGE);
							L.i("asdadasdas:" textResult);;
						}
					}).start();
					
				}
				catch (Throwable th) 
				{
					Log.v(TAG, "exception: handler-cmrequestpic: "  th.toString());
					m_clCapture.ShowWaiting("");
					break;
				}
				break;
			case R.id.time_task:
				m_bScreenRequestPicture=true;
				RequestCameraFocus();
				break;
			}
			super.handleMessage(msg);
		}

	};
	/**
	 * 获取sd卡的路径
	 * 
	 * @return 路径的字符串
	 */
	public static String getSDPath() {
		File sdDir = null;
		boolean sdCardExist = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
		if (sdCardExist) {
			sdDir = Environment.getExternalStorageDirectory();// 获取外存目录
		}
		return sdDir.toString();
	}
	/**
	 * 进行图片识别
	 * 
	 * @param bitmap
	 *            待识别图片
	 * @param language
	 *            识别语言
	 * @return 识别结果字符串
	 */
 	public String doOcr(Bitmap bitmap, String language) {
		TessBaseAPI baseApi = new TessBaseAPI();

		baseApi.init(getSDPath(), language);

		// 必须加此行,tess-two要求BMP必须为此配置
		bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

		baseApi.setImage(bitmap);

		String text = baseApi.getUTF8Text();

		baseApi.clear();
		baseApi.end();

		return text;
	}
	
	/**
	 * Play a predefined sound, when camera focused.
	 */
	private void PlaySoundOnFocus()
	{
		ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_SYSTEM, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP2);
	}
	/*
	 * ----------------------------------------------------------------------------------------
	 * Camera
	 * ----------------------------------------------------------------------------------------
	 */

	/**
	 * Set the camera surface holder.
	 */
	private void SetCameraSurfaceHolder(SurfaceHolder surfaceHolder)
	{
		if (surfaceHolder == null || CameraManager.get() == null)
			return;

		CameraManager.get().SetSurfaceHolder(surfaceHolder);
	}

	/**
	 * Initialize the camera, open the driver.
	 * @param surfaceHolder the local surface holder.
	 */
	private void InitCamera(SurfaceHolder surfaceHolder) 
	{
		if (CameraManager.get() == null)
			return;

		m_bPreviewReady = true;
		CameraManager.get().OpenDriver(surfaceHolder);
		CameraManager.get().StartPreview();		
		//RequestCameraFocus();
	}

	/**
	 *  Initialize the camera, open the driver (no params), we assume the surface holder was set apriori with SetCameraSurfaceHolder.
	 */
	private static final String TAG="CarmareActivity";
	private void InitCamera() 
	{
		Log.v(TAG, "InitCamera: start");		
		if (CameraManager.get() == null)
			return;

		Log.v(TAG, "InitCamera: OpenDriver");

		m_bPreviewReady = true;
		if (CameraManager.get().OpenDriver())
		{
			Log.v(TAG, "InitCamera: StartPreview");
			CameraManager.get().StartPreview();
			//RequestCameraFocus();
		}
		Log.v(TAG, "InitCamera: end");
	}

	/**
	 * Stop the camera preview and driver.
	 */
	private void StopCamera()
	{
		CameraManager.get().StopPreview();
		CameraManager.get().CloseDriver();
		m_bPreviewReady = false;	
	}

	
	
	
	/**
	 * Request the camera focus
	 * @return if function call succeeded
	 */
	private boolean RequestCameraFocus()
	{
		//m_clCapture.DrawFocusIcon(true, m_bHorizontalDisplay);  
		CameraManager.get().RequestCameraFocus(m_MezzofantiMessageHandler);
		CameraManager.get().RequestAutoFocus();
		return true;
	}

	/**
	 * Request camera to take the picture
	 * @return if function call succeeded
	 */
	private boolean RequestCameraTakePicture()
	{
		if (m_bPreviewReady)
		{
			m_clCapture.DrawFocused(false, false);
			//m_clCapture.DrawFocusIcon(false, m_bHorizontalDisplay);
			CameraManager.get().RequestPicture(m_MezzofantiMessageHandler);
			CameraManager.get().GetPicture();
			m_clCapture.ShowWaiting(getString(R.string.mezzofanti_capturelayout_takingpicture));
			
			return true;
		}
		return false;
	}
	
}
资源下载此资源下载价格为3D币(VIP免费),请先
资源文件列表
TesseractTest_SRC-master/.classpath , 466
TesseractTest_SRC-master/.project , 849
TesseractTest_SRC-master/.settings/org.eclipse.jdt.core.prefs , 177
TesseractTest_SRC-master/AndroidManifest.xml , 1826
TesseractTest_SRC-master/assets/eng.traineddata , 3112137
TesseractTest_SRC-master/ic_launcher-web.png , 51394
TesseractTest_SRC-master/libs/android-support-v4.jar , 385685
TesseractTest_SRC-master/libs/armeabi-v7a/libjpeg.so , 143916
TesseractTest_SRC-master/libs/armeabi-v7a/liblept.so , 1065212
TesseractTest_SRC-master/libs/armeabi-v7a/libtess.so , 1882276
TesseractTest_SRC-master/libs/armeabi/libjpeg.so , 151304
TesseractTest_SRC-master/libs/armeabi/liblept.so , 1109316
TesseractTest_SRC-master/libs/armeabi/libtess.so , 1947800
TesseractTest_SRC-master/libs/tess-two.tesseract3.01-leptonica1.68-LibJPEG6b.jar , 138629
TesseractTest_SRC-master/lint.xml , 53
TesseractTest_SRC-master/proguard-project.txt , 781
TesseractTest_SRC-master/project.properties , 563
TesseractTest_SRC-master/res/drawable-hdpi/ic_launcher.png , 6416
TesseractTest_SRC-master/res/drawable-hdpi/landscape.PNG , 385
TesseractTest_SRC-master/res/drawable-hdpi/portrait.PNG , 333
TesseractTest_SRC-master/res/drawable-mdpi/ic_launcher.png , 3981
TesseractTest_SRC-master/res/drawable-xhdpi/ic_launcher.png , 9477
TesseractTest_SRC-master/res/drawable-xxhdpi/ic_launcher.png , 22767
TesseractTest_SRC-master/res/layout/activity_camera.xml , 644
TesseractTest_SRC-master/res/layout/activity_main.xml , 3960
TesseractTest_SRC-master/res/values/colors.xml , 417
TesseractTest_SRC-master/res/values/dimens.xml , 218
TesseractTest_SRC-master/res/values/ids.xml , 2262
TesseractTest_SRC-master/res/values/strings.xml , 18885
TesseractTest_SRC-master/res/values/styles.xml , 706
TesseractTest_SRC-master/src/com/mikewong/tool/tesseract/ImgPretreatment.java , 8258
TesseractTest_SRC-master/src/com/mikewong/tool/tesseract/MainActivity.java , 7791
TesseractTest_SRC-master/src/com/xianzhi/stool/DensityUtil.java , 673
TesseractTest_SRC-master/src/com/xianzhi/stool/ImageFileCache.java , 8509
TesseractTest_SRC-master/src/com/xianzhi/stool/L.java , 1680
TesseractTest_SRC-master/src/com/xianzhi/stool/PictureUtil.java , 14479
TesseractTest_SRC-master/src/com/xianzhi/stool/T.java , 2589
TesseractTest_SRC-master/src/com/xianzhi/stool/TimeFormatTool.java , 2081
TesseractTest_SRC-master/src/com/xianzhi/tesseract/CamareActivity.java , 10986
TesseractTest_SRC-master/src/com/xianzhi/tesseract/InitActivity.java , 2743
TesseractTest_SRC-master/src/com/xianzhi/tesseract/TrainingApp.java , 350
TesseractTest_SRC-master/src/com/xianzhi/view/CameraManager.java , 9485
TesseractTest_SRC-master/src/com/xianzhi/view/CaptureLayout.java , 6499
没有账号? 忘记密码?

社交账号快速登录