我使用tesseract Library开发了OCR应用程序,
/*...
... Other Code stuff
...*/
protected Boolean doInBackground(String... arg0) {
/*...
... Other Code stuff
...*/
Pix pix = getPixFromBitmap(bitmap);
pix = preprocess(pix);
Pixa pixa = slice(pix); // Code Updated
try {
baseApi.setPageSegMode(TessBaseAPI.PSM_SINGLE_LINE);
int num = pixa.size();
for (int i = 0; i < num; i++) {
Pix pixi = pixa.getPix(i);
/*...
... Other Code stuff
...*/
}
pixa.recycle();
baseApi.end();
} catch (RuntimeException e) {
Log.e("OcrRecognizeAsyncTask","Caught RuntimeException in request to Tesseract. Setting state to CONTINUOUS_STOPPED.");
e.printStackTrace();
try {
// baseApi.clear();
activity.stopHandler();
} catch (NullPointerException e1) {
// Continue
}
return false;
}
private Pixa slice(Pix pix) {
HydrogenTextDetector htd = new HydrogenTextDetector();
HydrogenTextDetector.Parameters hydrogenParams = htd.getParameters();
hydrogenParams.debug = false;
hydrogenParams.skew_enabled = true;
htd.setParameters(hydrogenParams);
htd.setSourceImage(pix);
pix.recycle();
htd.detectText();
Pixa unsorted = htd.getTextAreas();
Pixa pixa = unsorted.sort(Constants.L_SORT_BY_X,Constants.L_SORT_DECREASING);
unsorted.recycle();
htd.clear();
return pixa;
}
Logcat详细信息如下:
02-23 13:37:09.986: I/WindowManager(102): Setting rotation to 0,animFlags=1
02-23 13:37:10.006: I/ActivityManager(102): Config changed: { scale=1.0 imsi=405/30 loc=en_IN touch=3 keys=1/1/2 nav=3/1 orien=1 layout=17 uiMode=17 seq=33}
02-23 13:37:10.116: I/UsageStats(102): Unexpected resume of com.htc.launcher while already resumed in edu.sfsu.cs.orange.ocr
02-23 13:37:10.816: W/InputManagerService(102): Got RemoteException sending setActive(false) notification to pid 4880 uid 10062
我将Bitmap转换为Leptonica Pix对象而不是Pix转换为Leptonica Pixa对象,而不是进行OCR重组.
在处理过程中,有时OCR重组成功完成,有时Android主屏幕自动进入.
我不知道背后的问题是什么,为什么会发出RemoteException警告?
请帮我解决这个问题.
谢谢,
最佳答案
你不能在AsyncTask之间结束baseApi.这是你遇到崩溃问题的问题.
您使用了以下代码,
pixa.recycle();
baseApi.end();
pixa.recycle();
// baseApi.end();
================================================== ================================
public void onCreate(Bundle savedInstanceState) {
{
clearMemoryCountDownTimer mClearMemoryCountDownTimer = new clearMemoryCountDownTimer(5000,5000).start();
}
private class clearMemoryCountDownTimer extends CountDownTimer {
public clearMemoryCountDownTimer(long millisInFuture,long countDownInterval) {
super(millisInFuture,countDownInterval);
}
@Override
public void onFinish() {
start();
Log.i(TAG,"Timer Finished");
}
@Override
public void onTick(long millisUntilFinished) {
if (Debug.getNativeHeapFreeSize() < 100000) {
clearMemory();
Log.i(TAG,"requiredClearMemory");
}
Log.i(TAG,"getNativeHeapSize : " + Debug.getNativeHeapSize());
Log.i(TAG,"getNativeHeapFreeSize : " + Debug.getNativeHeapFreeSize());
Log.i(TAG,"getNativeHeapAllocatedSize : "
+ Debug.getNativeHeapAllocatedSize());
}
void clearMemory() {
Log.i(TAG,"System.gc()-Start");
System.gc();
Log.i(TAG,"System.gc()-End");
}
}