实例介绍
【实例简介】通过摄像头识别汉字,字符和数字
【实例截图】
【实例截图】
【核心代码】
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; } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)