Android4OpenCV:在启动时设置分辨率
我正在使用Android4OpenCV进行一些实时图像处理,并且我想使用相机可以提供的最小分辨率。默认分辨率是相机可以提供的最大分辨率。
我正在看第三个例子,它允许用户通过菜单更改分辨率。我想修改该示例以更改启动时的分辨率,而不是要求用户通过菜单。为此,我只需向原本为空的函数添加两行:onCameraViewStarted()
public void onCameraViewStarted(int width, int height) {
android.hardware.Camera.Size res = mOpenCvCameraView.getResolutionList().get(mOpenCvCameraView.getResolutionList().size()-1);
mOpenCvCameraView.setResolution(res);
}
问题是,这在我的Galaxy Nexus上运行Android 4.2.2上工作得很好。应用将启动,并且分辨率设置正确。
但是,当我在Nexus 7平板电脑上运行完全相同的应用程序,运行Android 5.1时,该应用程序在调用时挂起。实际上,它一次工作正常,但当您尝试运行它时,它会挂起 - 即使您完全退出应用程序,将其从正在运行的应用程序中删除或重新启动设备。其他用户也报告了相同的错误,因此不仅仅是Nexus 7设备-实际上,我的Galaxy Nexus似乎是唯一可以正常工作的设备。setResolution()
具体来说,应用程序进入函数,然后调用 ,如下所示:setResolution()
org.opencv.android.JavaCameraView.disconnectCamera()
(注意:此代码是OpenCV4Android库的内部代码,这不是我的代码)
protected void disconnectCamera() {
/* 1. We need to stop thread which updating the frames
* 2. Stop camera and release it
*/
Log.d(TAG, "Disconnecting from camera");
try {
mStopThread = true;
Log.d(TAG, "Notify thread");
synchronized (this) {
this.notify();
}
Log.d(TAG, "Wating for thread");
if (mThread != null)
mThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
mThread = null;
}
/* Now release camera */
releaseCamera();
}
查看日志,我可以看到线程卡在行上。在该对象上同步的唯一其他东西是内部类,它是上面代码中的变量,由JavaCameraView类启动:synchronized(this)
JavaCameraView.CameraWorker
mThread
(注意:此代码是OpenCV4Android库的内部代码,这不是我的代码)
private class CameraWorker implements Runnable {
public void run() {
do {
synchronized (JavaCameraView.this) {
try {
JavaCameraView.this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!mStopThread) {
if (!mFrameChain[mChainIdx].empty())
deliverAndDrawFrame(mCameraFrame[mChainIdx]);
mChainIdx = 1 - mChainIdx;
}
} while (!mStopThread);
Log.d(TAG, "Finish processing thread");
}
}
我尝试过使用该代码进行修改,将 notify() 更改为 notifyAll(),并维护一个 CameraWorker 线程列表并连接每个线程。但无论如何,该应用程序仍然在通话时挂起。disconnectCamera()
我的问题是:
如何修改第三个OpenCV4Android示例,以便在启动时设置其分辨率?
导致应用挂起的原因是什么?
为什么这在某些设备上有效,而在其他设备上却不起作用?
编辑:我没有收到任何评论或答案,所以我在这里交叉发布到OpenCV论坛。
编辑2:根据cyriel的建议,我尝试在经过几帧后设置分辨率:
int frames = 0;
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
frames++;
if(frames == 6){
android.hardware.Camera.Size res = mOpenCvCameraView.getResolutionList().get(mOpenCvCameraView.getResolutionList().size()-1);
mOpenCvCameraView.setResolution(res);
}
return inputFrame.rgba();
}
但是,现在它卡在同一个确切的位置,即使在我的Galaxy Nexus上也是如此,如果我在函数中设置分辨率,它就可以工作。我尝试过将帧数增加到7甚至100,但我总是卡在同一个地方。onCameraViewStarted()