You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:12:14