是否可以使用OpenCV,EmGU,DirectShow等任何“标准”库来阻止自动聚焦?
我希望自动对焦找到最佳对焦,然后在视频捕获期间防止自动对焦自动对焦。
我知道我可以手动设置该值,但这违背了使用自动对焦的目的,而且我还没有找到一种方法来获取由自动对焦确定的最佳对焦值。
答案 0 :(得分:5)
您可以检测校准阶段(寻找最佳焦点时)何时聚焦图像,并保存该配置(聚焦距离)。然后将焦点设置为已保存的值,并在捕获阶段之前禁用自动聚焦。要找到最佳聚焦距离,您可以从最接近的(宏观)聚焦距离开始,然后逐渐将其提高到最大,以测量图像的聚焦程度。
此SO question的答案描述了如何测量图像是否聚焦。您可以使用OpenCV Laplacian()(Emgu.CV)来实现。
关键是对焦图像具有更强的渐变和鲜明的特征。因此,我建议应用高斯拉普拉斯滤波器,然后查看结果像素值的分布。焦点对准的一个具有更高的值(因为图像具有更清晰的渐变)。
this article中介绍了另一种确定最佳焦点的有趣方法。该技术在NASA好奇号火星探测器中使用。这个想法是对帧进行JPEG压缩,并使用jpeg的大小作为焦点的度量。
自动聚焦命令指示相机移动到指定的启动马达计数位置并收集图像,移动指定的步数并收集另一张图像,并一直这样做,直到达到命令的总图像数,每张图像之间用指定的电机计数增量。这些图像中的每一个都是JPEG压缩的(Joint Photographic Experts Group;请参阅CCITT(1993)),并应用了相同的压缩质量因子。每个压缩图像的文件大小是场景细节的量度,而细节又是焦点的功能(在同一场景的焦点视图之外,焦点对准的图像显示的细节多于模糊而不是模糊)。
OpenCV imencode()(Emgu.CV)可用于以JPEG压缩图像。
如果要聚焦于某些特定的稳定对象或区域,并且能够计算/识别其固定位置,则应仅处理该区域以确定最佳聚焦。在第一种方法中,如果知道对象的形状,则可以将Laplacian
应用于裁剪的矩形区域,甚至不使用矩形遮罩进行结果“焦点值”计算。第二种方法也一样-仅压缩要关注的感兴趣区域。如果要使其不处理矩形区域并知道该区域的形状,请首先将未覆盖要聚焦的区域的所有像素设置为相同的颜色。它将使该算法不考虑您不需要关注的区域。
答案 1 :(得分:3)
对于UVC兼容的USB网络摄像头(大多数情况下),可以合理地使用相机的自动对焦然后将其锁定。为了弄清楚相机是否通过UVC允许这样做,在Linux上可以使用v4l2-ctl
软件包中的v4l-utils
。 v4l2-ctl -l
列出所有可用的控件,v4l2-ctl -c
设置控件的值,v4l2-ctl -C
获取值。
例如,以下命令为Ubuntu 16.04机器上的Microsoft LifeCam Cinema提供了诀窍,该机器运行了一个简单的Python OpenCV程序来显示当前帧:
> v4l2-ctl -d 0 -c focus_auto=1
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 12
将对象移近相机之后,焦点发生了变化,focus_absolute
得到了一个不同的值:(因此UVC可以访问自动聚焦所选择的值。)
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17
然后我更改为手动对焦,这锁定了自动对焦选择的值:
> v4l2-ctl -d 0 -c focus_auto=0
> v4l2-ctl -d 0 -C focus_absolute
focus_absolute: 17
因此对于LifeCam Cinema,代码唯一需要做的就是将focus_auto
控件最初更改为自动(1
),然后在锁定焦点后更改为手动。 / p>
在Python中,我通常仅使用subprocess.check_output()
即可运行v4l2-ctl
。我记得看到过UVC的Windows库,但是从没有玩过。
答案 2 :(得分:0)
用于控制焦点的本地Windows API是具有IAMCameraControl
属性的CameraControl_Focus
接口。它可以通过DirectShow获得,而且很可能也可以通过Media Foundation获得(我没有检查,但我希望它会一直存在)。问题第一段中提到的库在这些API的基础上工作。
例如,罗技高清网络摄像头C615摄像机(刚好抓住了第一个随机对焦的摄像机)就具有这样的对焦功能:
CameraControl_Focus
:51,标志CameraControl_Flags_Auto
| CameraControl_Flags_Manual
,0..255,步骤17,默认值51,大写标志CameraControl_Flags_Auto
| CameraControl_Flags_Manual
这表明范围是0..255,增量为17,即相机在16种设置的范围内具有自动聚焦和手动聚焦。该API的设计方式是可以潜在地自动聚焦,然后读取自动确定的设置,然后切换为手动以锁定焦点(通过IAMCameraControl
界面进行的所有操作)。
但是,恐怕很多相机基本上仅依靠内置的自动对焦功能无法实现足够准确的效果。首先,您无法读取正在进行自动还是手动重新对焦的状态,然后在自动模式下读取当前设置可能返回错误的值(例如,在手动对焦期间最后一次使用)。即使有一种标准的定义方式来处理焦点问题,它仍然没有得到积极使用,可能效果不佳。也许您对特定型号感兴趣,并且相机可以很好地实现这一目标。
通过图像分析进行焦点识别时,您已经在相邻答案中找到了指针。