在Android上设置控制固定距离的相机焦点

我的设备只有两种焦点模式,AUTO和FIXED(按照getSupportedFocusModes())。 我想把我的相机设置在一个固定的焦点距离'x'(x是任何我喜欢的,或任何我可以从相机得到的)。 (我知道setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED) ,但是这似乎只能在最大可能的设置上解决..)

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

Solutions Collecting From Web of "在Android上设置控制固定距离的相机焦点"

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

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

Android文档说:

公共静态最终stringFOCUS_MODE_FIXED
重点是固定的。 如果焦距不可调整,照相机始终处于此模式。 如果相机具有自动对焦,此模式可以固定焦距,通常在超焦距 。 应用程序不应该在此模式下调用autoFocus(AutoFocusCallback)。

让我们看看超焦距是什么。

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

在光学和摄影中,超焦距是一个超过这个距离,所有物体都可以进入“可接受”的焦点。 超焦距有两种常用的定义,导致只有轻微的差别:

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

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

两者之间的区别很less做,因为它们具有几乎相同的价值。 根据第一个定义计算的值超过了第二个焦距的一个焦距。

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

所以焦点不是设置在最远的位置,而是设置为让所有可见物体都可以接受的清晰。

回到问题。
如果您碰巧是这款特定相机固件的开发人员,则可以将任何所需的IOCTL添加到您的驱动程序中。 但是,你仍然需要以某种方式给他们打电话。 如果不在Android OS中增加额外的function,以及进一步重新编译Android本身及其底层Linux内核,就无法实现这一点。
所以看起来你不能达到这个目标,至less不能从用户空间中获得。

实现该固定焦点距离的一个可能方法是在摄像机生命周期开始时调用autoFocus。 保持调用autoFocus sporatically直到满足条件。 一旦条件满足,则不是调用autoFocus,而是设置一个标志并调用takePicture。

这是我为了达到想要达到的效果所要达到的一个解决scheme。

因此,在我的线程不断拍照,代码看起来像这样:

 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库检测到的特定对象的外观。

我可能是错的,但是你的问题的方式似乎来自一个经典的DSLR镜头的观点。

在安卓移动相机上,除非您的移动相机允许,否则您实际上不必担心镜头的焦距大多数情况(这似乎并非如此,因为您提到它只允许自动或固定,而不是无限的,macros观的,连续的video等)。

您可以设置相机的本地区域来关注并让sdk完成工作。 如果相机图像上的物体远离或接近它的sdk工作,相应地计算和聚焦。

例如, 试试这个开源的摄像头项目。