2014-04-24 91 views
7

我的设备只有两种对焦模式,AUTO和FIXED(按照getSupportedFocusModes())。 我想将相机设置在'x'的固定焦距(x是我喜欢的任何物体,或者我可以从相机获得的任何物体)。 (我知道setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED),但是这似乎只能在最大可能的设置下修复。)在Android上设置控制固定距离的相机焦点

这可以完成吗? (Android版本4.2.2)

回答

8

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

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

Android文档说:

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

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

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

在光学和摄影,超焦距超出的所有对象可以被带入“可接受的”焦点的距离。有两种常用的超焦距的定义,导致只有轻微的差异:

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

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

由于超焦距是提供最大景深的焦距,因此它是设置定焦相机焦距的最理想距离。

因此,焦点不是设置在最远的可能设置上,而是设置为让所有可见物体都可以接受为锐利。

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

+0

要回答你的第二个问题:我向你保证,我需要那种功能.. :) 其次,我怕这个答案,但希望仍然存在某种欺骗来模拟这种行为。谢谢。 – Ysch

+0

我知道人们不会在这里发布他们的问题来得到没有答案,但在这种情况下,它不是肯定的。你的任务不是不可能的,但为了实现它,你需要在android,相机的驱动程序和内核中进行更改。我不知道任何相机是否允许任何第三方软件按照要求的方式移动镜头。有什么可以帮助的是通过USB连接的第三方传感器,@Jay Snayder的答案看起来很有希望。或者您可以尽量不要担心焦点,只需在您感兴趣的对象出现时以固定模式拍照。 – mykolaj

+0

您确实需要定制相机固件和HAL(它是Android系统的一部分),但很可能不需要重新编译Linux内核。 –

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

+0

看起来有趣,将尽快检查这是否适用于我的情况。谢谢。 – Ysch

0

我可能是错的,但是你说出你的问题的方式似乎来自经典的DSLR镜头视角。

在安卓手机摄像头上,除非移动摄像头允许,否则实际上并不需要担心镜头焦距的大部分问题(似乎并非如此,因为您提到它只允许自动或固定的,而不是无限的,宏观,连续视频等)。

您可以在相机上设置局部区域来进行对焦并让sdk完成其工作。如果相机图像上的物体远离或靠近,sdk工作就会相应计算并聚焦于您。

举一个例子,try this open-source camera project.

+0

谢谢,但这真的不是我要找的.. – Ysch