我曾经使用此功能将摄像机名称映射到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/