【问题标题】:Capturing every frame to recognize text ARcore - Do i need to use semaphores?捕获每一帧以识别文本 ARcore - 我需要使用信号量吗?
【发布时间】:2021-10-09 11:22:04
【问题描述】:

我正在开发一个应用程序,我想在其中实时识别文本。

一开始我使用的是 onTapListener,所以每当用户在屏幕上点击时,都会捕获当前帧,然后调用文本识别。

现在我想完全实时地执行此操作,这样用户就不会点击屏幕来捕获当前帧。但是每一帧都将被捕获,直到一个捕获的当前帧的文本被识别为止。

出于这个原因,我创建了一个全局布尔字段名locked,它初始化为false,我将它用作“储物柜”,稍后您会看到。

private boolean locked = false;

在方法onUpdateFrame(FrameTime frameTime)中,我使用了上面的全局变量locked。当第一个特征点被跟踪时,我“锁定”了更新。所以只有当前线程会捕获当前帧。如果识别出的数据为空,我会设置locked = true,这样下一帧就会被捕获。

这是我的代码

 public void onUpdateFrame(FrameTime frameTime) {
        Frame frame = arFragment.getArSceneView().getArFrame();
        // If there is no frame, just return.
        if (frame == null) {
            return;
        }

        //Making sure ARCore is tracking some feature points, makes the augmentation little stable.
        if(frame.getCamera().getTrackingState()==TrackingState.TRACKING && !locked) {
            locked = true;
            if (mProgressDialog == null) {
            mProgressDialog = ProgressDialog.show(this, "Processing",
                    "OCR...", true);
        } else {
            mProgressDialog.show();
        }
        executor.execute(() -> {
            Bitmap b = captureImage();
            final String[] text = {getOCRResult(b)};   
        handler.post(() -> {
            if(text[0] != null && !text[0].equals("")){
                   doSomething();
            }
            else{
                   locked = false;
            }

    }

但这不起作用。当检测到表面时,我的应用程序会立即崩溃。

我收到以下错误,该错误所涉及的 Toast 指的是我在 captureImage()

方法中拥有的 Toast

E/AndroidRuntime: 致命异常: pool-1-thread-1 进程:opencv.org,PID:27860 java.lang.RuntimeException: 不能在没有调用 Looper.prepare() 的线程上吐司

我不明白我做错了什么。 我听说过信号量,这就是我问这个问题的原因。我应该使用信号量,我是否需要这样的东西才能让我的应用程序正常工作。据我了解,我随时需要一个线程来捕获当前帧。 有人可以帮我我有点迷路吗? 谢谢

【问题讨论】:

    标签: multithreading android-studio ocr arcore android-multithreading


    【解决方案1】:

    您收到此错误的原因是您无法在非 UI 线程上显示 toast 或任何 UI。

    处理这个问题的常用方法是在 UI 线程上创建一个“处理程序”并向其消息队列发送一条消息,要求它发布线程。

    您可以在此答案中看到 Java 和 Kotlin 中的示例:Can't create handler inside thread that has not called Looper.prepare()

    这里有更多关于 Handler 的信息:https://developer.android.com/reference/android/os/Handler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多