我有一个两阶段应用,我需要两套解决方案:
在帧中搜索已知模板\ QR标记。 为此,我需要一个至少640X480的帧大小。
找到模板\ QR标记后,我需要更改为较低的分辨率(320X240),以便获得最佳的帧速率,我可以用于时间敏感的任务。
启动时(onCameraViewStarted)我可以将分辨率设置为640X480,但之后我无法从onCameraFrame中更改它(我从onCameraFrame中找到模板\ QR标记)。 从一些调试中我看来,由setResolution方法实现的disconnectCamera()(如OpenCV tutorial3中所见)在主线程上等待完成。尝试在使用新线程时或通过实现事件监听器来更改分辨率并没有也很好。
关于如何更改两个阶段之间的分辨率的任何想法?
由于
代码:
@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);
}
}
}
答案 0 :(得分:0)
在修改了教程之后我注意到onOptionsItemSelected()从主线程运行setResultion()。
所以......为了让你能够在onCameraFrame()中设置结果,你需要从运行onCameraFrame()的线程中设置async。
我使用了bolt-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()...
开始的新线程