我编写了一个 Android 应用程序,可以从相机捕获实时预览。快门时间短很重要,至少应该是恒定的。
目前我使用以下代码来实现低快门时间:
Parameters params = camera.getParameters();
params.setSceneMode(Parameters.SCENE_MODE_SPORTS);
params.setWhiteBalance(Parameters.WHITE_BALANCE_DAYLIGHT);
params.setFlashMode(Parameters.FLASH_MODE_OFF);
params.setFocusMode(Parameters.FOCUS_MODE_INFINITY);
params.setPreviewFpsRange(9000, 29453);
params.setPreviewFrameRate(29453);
params.setJpegQuality(100);
params.setPreviewFormat(ImageFormat.NV21);
params.setPreviewSize(1280,720);
params.setAntibanding(Parameters.ANTIBANDING_OFF);
params.setExposureCompensation(params.getMinExposureCompensation());
params.set("iso", 1250);
camera.setParameters(params);
我的手机固件似乎不支持 setSceneMode() (getSupportedSceneModes 返回空列表)。 “ISO”设置可能没有效果(还没有查看图片,只是计算了帧速率)。刚刚在某处找到了这段代码并使用了它......也许它只是错误的字符串?
到目前为止发生的情况是:帧速率在 9 到 29,453 fps 之间变化,这是唯一支持的帧速率范围。所以params.setPreviewFpsRange(29453, 29453);
也不行。
在良好的光照条件下(正常白天、室内、直接对着窗户),帧速率较高(20-30 fps),而在中/低光照条件下(日光、室内、直接远离窗户),帧速率会变得非常低(8-10 fps)状况。
更详细地说:我不需要高帧速率,但需要低快门时间。收集的数据应用于室内导航(或:第一步的室内定位)。该应用程序需要在一个人正常行走时拍照,而不需要该人关心他/她如何携带手机。该人甚至可能正在跑步或“摆动”手机(就像您通常在走路时移动手臂一样)。因此,一旦快门时间太长,通常会出现很多“运动模糊”。这种情况与“我想拍一张照片”的情况有很大不同,在“我想要拍照”的情况下,照片试图保持相机稳定。我们实际上并不想获得“好照片”,而是想以某种方式时不时地检测到墙壁的一些边缘。我预计图片中会有很多“噪音”,但无论如何希望这能起作用......
我们的想法是,有可能使用 NDK 更好地控制相机参数。有没有人有 NDK 的经验并且可以回答我是否值得尝试?
附加信息:我使用 HTC Desire Z(也称为:“T-Mobile G2”或“HTC Vision”)作为测试设备。