将摄像机名称Map到opencv摄像机索引

eqfvzcg8  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(186)

我曾经在opencv的v3.4.1中使用此功能将相机名称Map到相机索引,但我将其升级到v4.1.0。但此功能不再起作用。相机索引不再匹配。您知道为什么会出现这种情况以及如何正确Map吗?
我实际上使用的是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;
    }
ymdaylpp

ymdaylpp1#

原来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,我也会在创建相机对象时指定此后端。

capture = new VideoCapture(index, VideoCapture.API.Msmf);

这个后端似乎对摄像头更好用,包括macbook air的内置摄像头。

相关问题