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

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

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

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

另一个问题是:“如果有人真的需要这种function吗?”。

Android文档说:

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

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

超焦距
维基百科,自由的百科全书

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

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

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

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

由于超焦距是给出最大景深的焦距,因此设置定焦相机的焦点是最理想的距离。

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

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

实现固定焦距的一种可能方法是在相机生命周期开始时调用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库检测到的特定对象的外观。

我可能错了,但是你的问题expression方式似乎来自经典的DSLR镜头。

在Android移动相机上,你实际上不必担心镜头焦距的大部分,除非你的移动相机允许(看起来似乎不是这样,因为你提到它只允许自动或固定,而不是无限,宏观,连续video等)。

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

例如, 尝试这个开源相机项目。