我正在为我的应用程序使用OpenCV,Vuforia和Tesseract(tess-two)。我的系统是这样的:
我的问题从第3部分开始。由于我的目标是在实时相机帧上进行ocr,我试图使用多线程来使UI平滑,而不是导致实时相机视觉变慢。
我决定像这样使用AsyncTask:
public void getFromNative(final byte[] imagedata, final int width,final int height,final byte [] typeData, final int typeWidth,final int typeHeight) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
ocr(imagedata, width, height,typeData,typeWidth,typeHeight);
return null;
}
}.execute();
}
它使实时摄像机流比正常的单线程方式更流畅。但问题是因为它启动了如此多的AsyncTask,因为实时相机帧,即使我将相机从目标上移开,它仍继续对先前创建的AsycnTask进行OCR并一个接一个地返回它们的结果。除了AsyncTask之外,我还尝试了IntenService,但结果是一样的。
我想问一下是否有办法解决这个问题,让这个过程更有效率。
由于
答案 0 :(得分:0)
我建议您不要尝试识别相机视图中的每一帧。我们使用了与以下onPreviewFrame-method:
public final void onPreviewFrame(final byte[] data, final Camera camera) {
this.data = data;
now = Calendar.getInstance().getTimeInMillis();
if (now - lastRecognitionTime > TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS) {
lastRecognitionTime = now;
startRecognition(); // here you can start your async task
}
}
这意味着识别过程仅从每隔几个预览帧开始,具体取决于您配置TIME_BETWEEN_RECOGNITION_STARTS_IN_MILLIS的方式。