android 4 分辨率设置,java – Android4OpenCV:启动时设置分辨率

我正在使用

Android4OpenCV进行一些实时图像处理,我想使用相机可以提供的最小分辨率.默认分辨率是相机可以提供的最大分辨率.

我看着3rd example,它允许用户通过菜单来改变分辨率.我想修改这个例子来改变启动时的分辨率,而不是要求用户通过菜单.要做到这一点,我只需要添加两行,否则是空的onCameraViewStarted()函数:

public void onCameraViewStarted(int width, int height) {

android.hardware.Camera.Size res = mOpenCvCameraView.getResolutionList().get(mOpenCvCameraView.getResolutionList().size()-1);

mOpenCvCameraView.setResolution(res);

}

事实是,这个运行在Android 4.2.2上的Galaxy Nexus上完美无缺.应用启动,分辨率设置正确.

不过,当我在运行Android 5.1的Nexus 7平板电脑上运行完全相同的应用程序时,该应用程序将挂在调用setResolution()上.实际上它可以运行一段时间,但是第二次挂起你尝试运行它 – 即使你完全退出应用程序,将其从正在运行的应用程序中删除,或重新启动设备.其他用户也报告相同的错误,所以不仅仅是Nexus 7设备,实际上,我的Galaxy Nexus似乎是唯一可以运行的设备.

具体来说,应用程序进入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.CameraWorker类,它是上述代码中的mThread变量,由JavaCameraView类启动:

(注意:这段代码是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论坛here.

编辑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上,如果我在onCameraViewStarted()函数中设置了分辨率,那么它将会工作.我尝试将帧数增加到7甚至100,但是我总是被困在同一个地方.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值