我的设备只有两种对焦模式,AUTO和FIXED(根据getSupportedFocusModes())。
我想将相机设置在一个固定的焦距距离x' x' (x是我喜欢的任何东西,或者我从相机中得到的任何东西......)。 (我知道setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED)
,但这似乎只能在最远的设置上修复。)
可以这样做吗? (Android版本4.2.2)
答案 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会相应地进行计算并专注于您。