Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上,将相机焦距设置为受控的固定距离_Android_Camera - Fatal编程技术网

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

在Android上,将相机焦距设置为受控的固定距离,android,camera,Android,Camera,我的设备只有两种聚焦模式,自动和固定(根据getSupportedFocusModes())。 我想将我的相机设置为“x”的固定焦距(x是我喜欢的,或者我可以从相机获得的任何东西…)。(我知道setFocusMode(Camera.Parameters.FOCUS\u MODE\u FIXED),但这似乎只在尽可能远的设置上固定了..) 这能做到吗?(Android版本4.2.2)这里不想完全回答这个问题,只是想给它一些指导。 因此,您需要的是对这种操作的驱动程序支持。然后,在某个时刻,您会要求

我的设备只有两种聚焦模式,自动和固定(根据getSupportedFocusModes())。 我想将我的相机设置为“x”的固定焦距(x是我喜欢的,或者我可以从相机获得的任何东西…)。(我知道
setFocusMode(Camera.Parameters.FOCUS\u MODE\u FIXED)
,但这似乎只在尽可能远的设置上固定了..)


这能做到吗?(Android版本4.2.2)

这里不想完全回答这个问题,只是想给它一些指导。
因此,您需要的是对这种操作的驱动程序支持。然后,在某个时刻,您会要求应用程序中的驱动程序设置所需的焦距。

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

Android文档上写着:

公共静态最终字符串焦点\u模式\u固定
焦点是固定的。如果焦距不可调,相机始终处于此模式。如果相机具有自动对焦功能,此模式可以固定焦距,通常为超焦距。在此模式下,应用程序不应调用自动对焦(AutoFocusCallback)

让我们看看什么是超焦距

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

在光学和摄影技术中,超焦距是指所有物体都能进入“可接受”焦距的距离。超焦距有两种常用的定义,其值仅略有不同:

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

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

很少区分这两种含义,因为它们的值几乎相同。根据第一个定义计算的值仅比第二个定义的值大一个焦距

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

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

回到问题上来。
如果您碰巧是这个特定相机固件的开发人员,您可以将任何需要的IOCTL添加到您的驱动程序中。但是你还是需要打电话给他们。如果不在Android操作系统中添加额外的功能,并进一步重新编译Android本身及其底层Linux内核,这是无法实现的

因此,您似乎无法实现这一目标,至少从用户空间是无法实现的。

实现固定焦距的一种潜在方法是在相机生命周期开始时调用自动对焦。不定期地调用自动对焦,直到满足条件为止。一旦满足条件,则不调用自动对焦,而是设置标志并调用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库检测到的特定对象的外观。

我可能错了,但你表达问题的方式似乎来自经典的DSLR镜头角度

在安卓手机摄像头上,你实际上不必担心镜头焦距太大,除非你的手机摄像头允许(事实似乎并非如此,正如你所说,它只允许自动或固定,而不是无限、宏、连续视频等)

您只需将相机上的局部区域设置为焦点,然后让sdk完成其工作。如果在相机图像上接触的对象是远的或近的,那么sdk将为您进行相应的计算和聚焦


例如,

看起来很有趣,我会尽快检查这是否适用于我的情况。谢谢。回答你的第二个问题:我向你保证,我需要那种功能:)其次,我害怕这个答案,但希望仍然存在某种模拟这种行为的技巧。谢谢。我知道人们在这里发布问题并不是为了得到“否”作为答案,但在这种情况下,答案是“否”而不是“是”。您的任务并非不可能,但要实现它,您需要在android、摄像头驱动程序以及可能的内核中进行更改。我不知道是否有任何相机允许任何第三方软件按要求的方式移动镜头。可以帮助的是通过USB连接的第三方传感器,@Jay Snayder的答案看起来很有希望。或者你可以试着不用担心焦距,只要在你感兴趣的对象出现时以固定模式拍照。你确实需要定制相机固件和HAL(这是Android系统的一部分),但很可能不需要重新编译Linux内核。