gpt4 book ai didi

android - 具有多线程功能的Android相机框架处理

转载 作者:行者123 更新时间:2023-12-03 13:13:02 29 4
gpt4 key购买 nike

我正在为我的应用程序使用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,但结果是相同的。

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

    谢谢

    最佳答案

    我建议您不要尝试识别相机peview提取的每一帧。我们使用了类似于以下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的方式。

    关于android - 具有多线程功能的Android相机框架处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18183016/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com