使用MultiThreading进行Android相机帧处理

时间:2013-08-12 08:57:55

标签: android multithreading image-processing android-asynctask ocr

我正在为我的应用程序使用OpenCV,Vuforia和Tesseract(tess-two)。我的系统是这样的:

  1. Vuforia检测到目标并将完整帧发送到OpenCV(JNI)
  2. OpenCV获取框架并进行一些图像处理以使其对Tesseract(JNI)可读
  3. Tesseract(tess-two)从opencv获取字节数组并对图像进行OCR处理(字节数组)
  4. 我的问题从第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,但结果是一样的。

    我想问一下是否有办法解决这个问题,让这个过程更有效率。

    由于

1 个答案:

答案 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的方式。