6

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

4

1 回答 1

5

最简洁的答案是不”。更长的答案从一个问题开始:您的应用程序不关心捕获,而只使用 YUV 预览帧,对吗?

作为没有根访问权限的标准下载应用程序,您无权直接访问相机(或其他)设备。您只有setParameters() API 来影响相机的行为,因此对于通过此 API 公开哪些相机功能,您完全受制于 OEM。

即使在有根设备上,您的功能也受到限制,但现在受设备驱动程序和特定相机 ISP 的规格限制。

在这两种情况下,您都应该从非常仔细地选择目标设备开始。我相信一些 Android 手机允许比 HTC Vision 更多的相机控制。例如,三星 S2 的修改版http://pfittech.com/rom_pfittech_jb.html在 1080p 时拥有稳定的 25 FPS。

于 2012-09-18T20:16:25.657 回答