我曾经使用此功能将摄像机名称映射到opencv v3.4.1中的摄像机索引,但是我已将此版本升级到v4.1.0。但是此功能不再起作用。相机索引不再匹配。知道为什么会这样以及如何正确映射吗?

我实际上正在使用Emgu 4.1.0和C#。下面,我利用DirectShowLib nuget获取VideoInput设备的列表。在v3中,顺序与opencv摄像机索引完全匹配。不在v4中,似乎顺序是错误的。

using DirectShowLib;
private DsDevice[] directShowCameras =
DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

    private int getCameraIndexForName(string name)
    {
        for (int i = 0; i < directShowCameras.Count(); i++)
        {
            if(directShowCameras[i].Name.ToLower().Contains(name.ToLower()))
            {
                return i;
            }
        }
        return -1;
    }

最佳答案

事实证明,v4.1.0优先考虑MSMF而不是DirectShow。这些框架之间照相机的枚举也不同。因此,使用此功能可将相机友好名称转换为相机索引。这使用SharpDx.MediaFoundation nuget库在C#中调用MSMF API。

    using SharpDX.MediaFoundation;
    public static int GetCameraIndexForPartName(string partName)
    {
        var cameras = ListOfAttachedCameras();
        for(var i=0; i< cameras.Count(); i++)
        {
            if (cameras[i].ToLower().Contains(partName.ToLower()))
            {
                return i;
            }
        }
        return -1;
    }

    public static string[] ListOfAttachedCameras()
    {
        var cameras = new List<string>();
        var attributes = new MediaAttributes(1);
        attributes.Set(CaptureDeviceAttributeKeys.SourceType.Guid, CaptureDeviceAttributeKeys.SourceTypeVideoCapture.Guid);
        var devices = MediaFactory.EnumDeviceSources(attributes);
        for (var i = 0; i < devices.Count(); i++)
        {
            var friendlyName = devices[i].Get(CaptureDeviceAttributeKeys.FriendlyName);
            cameras.Add(friendlyName);
        }
        return cameras.ToArray();
    }

只是要100%使用较新的MSMF,我还要在创建camera对象时指定此后端。
capture = new VideoCapture(index, VideoCapture.API.Msmf);

这个后端似乎对包括Macbook air内置相机在内的相机效果更好。

关于c# - 将摄像机名称映射到opencv摄像机索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57086898/

10-12 20:08