我写了一个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”)作为测试设备。
答案 0 :(得分:5)
简短的回答是“不”。更长的答案从一个问题开始:你的应用不关心捕获,但只使用YUV预览帧,这是正确的吗?
作为没有root访问权限的标准下载应用,您无权直接访问相机(或其他)设备。您只有 setParameters() API来影响相机行为,因此您完全可以接受OEM对通过此API公开的相机功能的看法。
即使在有根设备上,您的功能也是有限的,但现在可以通过设备驱动程序和特定摄像头ISP的规格来实现。
在这两种情况下,您应该首先仔细选择目标设备。我相信有些Android手机比HTC Vision更能控制相机。例如,三星S2 http://pfittech.com/rom_pfittech_jb.html的修改版本在1080p时拥有稳定的25 FPS。