我想确定距Nexus 5相机的物体的距离,最好不使用硬币之类的物体进行缩放。我想到了Camera.Parameters getFocusDistances函数将对此起作用。
我试图通过我的takePicture()jpeg回调中的以下内容来执行此操作:
Parameters params = camera.getParameters();
Float focusDistances[] = new float [3];
params.getFocusDistances( focusDistances );
我尝试使用距相机不同距离的对象运行几次,尽管每次,focusDistances [FOCUS_DISTANCE_NEAR_INDEX],focusDistances [FOCUS_DISTANCE_OPTIMAL_INDEX]和focusDistances [FOCUS_DISTANCE_FAR_INDEX]都包含正无穷大的值。
可能是我做错了,在这种情况下,请告诉我是否有可以在Nexus 5上使用的特定方法。但是android API专门指出您可以调用getParameters()(然后调用getFocusDistances ())随时获取最新的对焦距离,因此我认为这应该可行。我还没有尝试过的一件事是在自动对焦处理程序中执行上述操作,但是我不明白为什么这很重要。
我进行了一些研究以尝试观察发生了什么,并且我从getFocusDistances()找到了关于这种行为的几个问题,通常的答案(如果有)是android API不支持该功能和/或硬件制造商。现在,我在网上发现的许多讨论都是几年前的,尽管它给我带来了关于getFocusDistances的令人怀疑的感觉,但我仍然看到此功能建议用于获取焦距,因此我认为它必须在某些情况下有效某些android API版本的设备。
有人知道Nexus 5上的getFocusDistances()是否适用于任何特定版本的android吗?如果不是,是否有人知道它可以在任何设备上运行?
编辑:
自发布以来,我一直尝试在onAutoFocus处理程序中获取焦点距离,并尝试更广泛地尝试各种距离的对象。结果是一致的-对于所有3个焦距(NEAR,OPTIMAL和FAR)始终返回正无穷大。我什至使用Nexus 7进行了尝试,并且getFocusDistances始终返回常数值(0.95、1.9和无穷大),因此显然在该设备上也未实现getFocusDistances。
因此,我确实有两个问题:
最佳答案
首先,从单个镜头/ View 测量物距非常困难。您会发现许多尝试使用基于视觉的技术来判断物距的研究论文。我可以给你一个这样的paper。他们试图实现一个只能在移动相机和传感器上工作的定位系统。您可能会意识到,从一个摄像机 View 测量物距是多么不平凡的事情。他们最终使用了一种称为“运动结构”的视觉技术来计算距离(从多角度拍摄的多张照片中)。
甚至像SmartDistance和SmartMeasure这样的传统应用也需要使用几何技巧来测量距离。它们都不能仅依靠相机参数。抱歉,冗长的介绍。我以前做过这样的项目,根据我的经验,我会告诉您所有这些。
为了回答您的查询,我还没有找到任何可返回实际焦距值的Android设备。它们或者以一些常数值返回,有时以0且无穷大的形式返回。我发现有人报告说它适用于Galaxy Nexus,但仅在30厘米的物体距离内,它对距离的作用远不止于此。最重要的是,您不能依赖相机API中的此功能,而相机API在很大程度上取决于设备驱动程序。并且,手机镜头的镜头/传感器质量也不是众所周知的。您将很难为手机相机制定任何基于光学的公式。我建议您宁愿尝试一些基于传感器的几何技巧。