在Android上将相机焦点设置为受控固定距离

时间:2014-04-24 15:07:29

标签: android camera

我的设备只有两种对焦模式,AUTO和FIXED(根据getSupportedFocusModes())。 我想将相机设置在一个固定的焦距距离x' x' (x是我喜欢的任何东西,或者我从相机中得到的任何东西......)。 (我知道setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED),但这似乎只能在最远的设置上修复。)

可以这样做吗? (Android版本4.2.2)

3 个答案:

答案 0 :(得分:9)

这里没有试图完全回答这个问题,只是试图给它一些方向 所以,你需要的是这种操作的驱动程序支持。然后在某些时候,您要求应用程序中的驾驶员设置请求的焦距。

另一个问题是:"如果有人真的需要这种功能?"。

  

Android文档说:

     

public static final String FOCUS_MODE_FIXED
  焦点是固定的。如果焦距不可调,相机始终处于此模式。如果相机具有自动对焦功能,则此模式可以固定焦点,通常为超焦距。应用程序不应在此模式下调用autoFocus(AutoFocusCallback)。

让我们看看超焦距是多少。

  

超焦距
  来自维基百科,免费的百科全书

     

在光学和摄影中,超焦距是一个距离,超过该距离,所有物体都可以被带入“可接受的”状态。焦点。超焦距有两种常用的定义,导致值略有不同:

     

定义1:超焦距是镜头可以聚焦的最近距离,同时保持物体在无穷远处可接受的清晰度。当镜头聚焦在这个距离时,从超焦距的一半到无限远的所有物体将是可接受的锐利。

     

定义2:超焦距是指所有物体都是可以接受的锐利距离,对于无限远聚焦的镜头。

     

两种含义之间的区别很少,因为它们具有几乎相同的值。根据第一个定义计算的值超过第二个定义的值只有一个焦距。

     

由于超焦距是给出最大景深的焦距,因此最合适的距离是设定定焦相机的焦距。

因此焦点不是设置在尽可能最远的设置上,而是设置为使所有可见对象都可以接受。

回到问题。
如果您碰巧是这个特定相机固件的开发者,您可以向驱动程序添加任何所需的IOCTL。但是你仍然需要以某种方式打电话给他们。如果不在Android操作系统中添加其他功能,并进一步重新编译Android本身及其底层Linux内核,就无法实现这一目标。
所以看起来你无法实现这一目标,至少不是来自用户空间。

答案 1 :(得分:1)

实现固定焦距的一种可能方法是在相机生命周期开始时调用autoFocus。不断调用autoFocus,直到满足条件。一旦条件满足,那么不​​要调用autoFocus,而是设置一个标志并改为调用takePicture。

这是我为了获得您可能希望实现的预期效果而采用的一种解决方案。

所以在我连续拍照的线程中,代码看起来像这样:

if(needsFocus)
{
    myCamera.autoFocus(autoFocusCallback);
}
else //Focus is not needed anymore at this point
{
    if(myCamera != null)
    {
        myCamera.startPreview();    
        myCamera.takePicture(pictureCallback);
    }
}

满足条件后,needsFocus设置为true。此时,焦点固定在我想要的位置。然后它不会在其余的活动任务中发生变化。我的情况的条件是使用OpenCV库检测到的特定对象的外观。

答案 2 :(得分:0)

我可能错了,但你说出问题的方式似乎来自经典的数码单反相机镜头。

在Android手机相机上,你实际上不必担心镜头焦距的大部分距离,除非你的移动相机允许这种情况(事情似乎并非如此),因为你提到它只是允许自动或固定,而不是无限,宏观,连续视频等)。

您可以设置相机上的局部区域进行对焦,让sdk完成其工作。如果触摸到摄像机图像的物体远离或接近它,则sdk会相应地进行计算并专注于您。

例如,try this open-source camera project.