我正在为我的应用程序使用 OpenCV、Vuforia 和 Tesseract(tess-two)。我的系统是这样工作的:
- Vuforia 检测到目标并将完整帧发送到 OpenCV (JNI)
- OpenCV 获取帧并进行一些图像处理以使其对 Tesseract (JNI) 可读
- Tesseract(tess-two) 从 opencv 获取字节数组并对图像进行 OCR 处理(字节数组)
我的问题从第三部分开始。由于我的目标是在实时相机帧上进行 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,但结果是一样的。
我想问是否有办法解决这个问题并让这个过程更有效率。
谢谢