【问题标题】:Android OpenCV - changing resolusion from within onCameraFrameAndroid OpenCV - 从 onCameraFrame 中更改分辨率
【发布时间】:2015-07-11 20:53:31
【问题描述】:

我有一个两阶段的应用程序,我需要两组分辨率:

第一阶段

在框架内搜索已知模板\ QR 标记。 为此,我需要至少 640X480 的帧大小。

第二阶段

找到模板 \ QR 标记后,我需要更改为较低的分辨率 (320X240),以便为时间敏感的任务获得最佳帧速率。

我的问题

在启动时 (onCameraViewStarted) 我可以将分辨率设置为 640X480,但之后我无法从 onCameraFrame 中更改它(我从 onCameraFrame 中找到模板 \ QR 标记)。 从我做的一些调试来看,setResolution 方法(如 OpenCV tutorial3 中所见)实现的 disconnectCamera() 似乎卡在等待主线程完成。尝试在使用新线程或通过实现事件侦听器时更改分辨率也没有成功。

关于如何更改两个阶段之间的分辨率的任何想法?

谢谢

代码:

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

    inFrame = inputFrame.gray();

    if (locateTemplate(inFrame)) {
        setResolution(WORK_RESOLUTION);
        resetGridData(WORK_RESOLUTION);
    }
    return inFrame;
}

/**
 * Sets a new resolution for camera frames
 * @param size - the new resolution size
 */
private void setResolution (Size size) {
    ListIterator<Camera.Size> iterator = cameraView.getResolutionList().listIterator();
    Camera.Size s;
    while (iterator.hasNext()) {
        s = iterator.next();
        if (s.width == size.width && s.height == size.height) {
            Log.i(TAG, "Setting resolution to: " + s.width + "X" + s.height);
            cameraView.setResolution(s);
        }
    }
}

【问题讨论】:

    标签: android opencv resolution


    【解决方案1】:

    在对教程进行了一些修改后,我注意到 onOptionsItemSelected() 从主线程运行 setResultion()。

    所以...为了让您能够从 onCameraFrame() 中设置结果,您需要将其设置为与运行 onCameraFrame() 的线程异步。

    我使用了 bolts-android.jar 来设置一个在主线程上运行的新任务:

    /**
     * Sets a new resolution for camera frames
     * @param size - the new resolution size
     */
    private void setResolution (Size size) {
    
        ListIterator<Camera.Size> iterator = cameraView.getResolutionList().listIterator();
        Camera.Size s;
        while (iterator.hasNext()) {
            s = iterator.next();
            if (s.width == size.width && s.height == size.height) {
                final Camera.Size resSize = s;
                Log.i(TAG, "Setting resolution to: " + resSize.width + "X" + resSize.height);
    
                Task.call(new Callable<Void>() {
                    @Override
                    public Void call() throws Exception {
                        cameraView.setResolution(resSize);
                        return null;
                    }
                }, Task.UI_THREAD_EXECUTOR);
            }
        }
    }
    

    您还可以使用从 onCreate() 开始的新线程...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2014-01-30
      • 2014-05-15
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多