实例介绍
【实例简介】通过摄像头识别汉字,字符和数字
【实例截图】
【实例截图】
【核心代码】
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) 盖楼(回复)