手动对焦EMGU CV相机

4

我在我的应用程序中使用EMGU CV库。如何手动将相机对焦到对象?现在我正在使用Capture类来抓取图像。

2个回答

10

我通过使用DirectShow找到了解决方案。通过IAMCameraControl接口,我可以控制相机的曝光和对焦。代码示例:

 DsDevice[] devs = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); // getting video devices
 IFilterGraph2 graphBuilder = new FilterGraph() as IFilterGraph2; 
 IBaseFilter capFilter = null;
 if (graphBuilder != null)
 graphBuilder.AddSourceFilterForMoniker(devs[0].Mon, null, devs[0].Name, 
    out capFilter); //getting capture filter for converting it into IAMCameraControl
 IAMCameraControl _camera = capFilter as IAMCameraControl;
 _camera.Set(CameraControlProperty.Focus, 250, CameraControlFlags.Manual); //Setting focus to macro (in my camera, range between 0 - 250)

鉴于这个程序使用了DirectShow.NET,这是否意味着它理论上同样适用于罗技和微软的网络摄像头(特别是微软LifeCam Studio)?我们已经有了一个罗技C920,但我们面临着完全相同的问题。希望您的解决方案即使在Windows 8.1 64位上使用.NET 4.5.2也能奏效。 - Kal
有人将这个放入了一个小的C#项目中,位于https://github.com/anotherlab/FocusUF。 - Legolas

1

EmguCV实质上是C#的OpenCV,它只是一个图像处理库。Camera类仅用于捕获图像,而不能控制相机参数(您可以在Emgu的文档中清楚地看到这一点)。实际上,有许多不同类型的相机,具有不同的控制方法。实际上,从您的问题中我无法推断出您使用的是哪种相机:网络摄像头、闭路电视或摄影DSLR?

您可以采用常见的方法:使用EmguCV检测相机是否处于聚焦状态,然后使用对比度检测相应地控制相机。对于网络摄像头,它们通常内置了自动对焦功能;对于其他类型的相机,请参阅其文档。


我正在使用Logitech C920 PRO网络摄像头。我可以通过Capture.SetCaptureProperty方法控制相机的一些参数,如曝光或饱和度。相机具有自动对焦功能,但我需要一个物体不在焦点范围内的画面。 - SulNR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接