Emgu CV中VideoCapture获取相机名称的方法及相机切换问题解决
解决Emgu.CV获取相机名称的问题
方法1:通过DirectShow枚举相机设备
Emgu.CV本身没有直接提供获取相机名称的API,你可以借助DirectShow的设备枚举能力,先拿到所有可用相机的名称与对应索引,再匹配你初始化时的cameraIndex,以此验证当前选中的设备是否正确。
示例代码:
using System; using System.Collections.Generic; using DirectShowLib; public static List<string> GetCameraNames() { List<string> cameraNames = new List<string>(); DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); foreach (DsDevice device in devices) { cameraNames.Add(device.Name); } return cameraNames; }
使用时,先枚举所有相机名称,根据cameraIndex取出对应名称,再和你预期的外接相机名称对比,就能判断是否出现了设备切换。
方法2:调用OpenCV底层属性(通过Emgu.CV封装)
Emgu.CV是OpenCV的C#封装,你可以尝试调用OpenCV的CAP_PROP_DEVICE_NAME属性获取设备标识。注意:不同平台、相机驱动的返回结果可能不同,部分设备会返回设备路径而非友好名称,但足以用来区分内置与外接相机。
示例代码:
using Emgu.CV; using Emgu.CV.CvEnum; // 初始化VideoCapture实例后 VideoCapture capture = new VideoCapture(cameraIndex); string cameraIdentifier = capture.Get(CapProp.DeviceName).ToString();
方法3:Windows平台专属——用Media Foundation枚举设备
如果你的程序仅在Windows环境运行,可借助Media Foundation获取更友好的相机名称:
using System; using System.Collections.Generic; using Windows.Media.Capture; using Windows.Devices.Enumeration; public static async System.Threading.Tasks.Task<List<string>> GetCameraNamesAsync() { List<string> cameraNames = new List<string>(); string deviceSelector = MediaCapture.GetVideoDeviceSelector(); DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(deviceSelector); foreach (DeviceInformation device in devices) { cameraNames.Add(device.Name); } return cameraNames; }
内容的提问来源于stack exchange,提问作者nckstr15
相关产品推荐
相关产品推荐

