我编写了一个从相机捕获实时预览的 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”)作为测试设备。