下面是详细的攻略:
准备工作
- 电脑需要安装相关的摄像头驱动程序。
- 了解 C# 操作 USB 设备的基础知识。
实现方法
- 导入
System.Management
和System.Text.RegularExpressions
两个命名空间。
using System.Management;
using System.Text.RegularExpressions;
- 使用
ManagementObjectSearcher
类获取设备管理器中的所有 USB 设备,并遍历搜索结果。
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
collection = searcher.Get();
foreach (var device in collection)
{
// do something
}
- 在遍历的过程中,对每个 USB 设备进行过滤,只保留摄像头设备。
有多种方法可以过滤,这里提供其中一种。首先,通过PNPDeviceID
属性获取设备的硬件 ID。
var deviceId = device.GetPropertyValue("PNPDeviceID").ToString();
- 硬件 ID 的格式为
USB\VID_[Vendor ID]&PID_[Product ID]\[Serial Number]
,我们需要使用正则表达式从中提取 Vendor ID 和 Product ID。
var vidMatch = Regex.Match(deviceId, "VID_(\\w+)");
var pidMatch = Regex.Match(deviceId, "PID_(\\w+)");
var vid = vidMatch.Success ? vidMatch.Groups[1].Value : string.Empty;
var pid = pidMatch.Success ? pidMatch.Groups[1].Value : string.Empty;
- 最后,根据 Vendor ID 和 Product ID 判断是否为指定的摄像头。下面是示例代码,判断设备是否为 Logitech C920 高清摄像头。
if (vid == "046D" && pid == "082D")
{
// 连接摄像头
}
- 如果设备是指定的摄像头,就可以进行连接操作了。连接操作的具体实现方法有很多种,这里提供其中一种方法,使用第三方库 AForge.NET 实现。
var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
var videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.Start();
上述代码会获取电脑中的所有摄像头,并选择第一个摄像头进行连接,然后启动摄像头。
示例代码
下面是两个示例代码,一个是获取摄像头相关的信息,判断摄像头是否为指定型号;另一个是对指定型号的摄像头进行连接。
using System.Management;
using System.Text.RegularExpressions;
using AForge.Video.DirectShow;
// 判断设备是否为指定型号的摄像头
bool IsTargetCamera(ManagementObject device, string vid, string pid)
{
var deviceId = device.GetPropertyValue("PNPDeviceID").ToString();
var vidMatch = Regex.Match(deviceId, "VID_(\\w+)");
var pidMatch = Regex.Match(deviceId, "PID_(\\w+)");
var deviceVid = vidMatch.Success ? vidMatch.Groups[1].Value : string.Empty;
var devicePid = pidMatch.Success ? pidMatch.Groups[1].Value : string.Empty;
return deviceVid == vid && devicePid == pid;
}
// 连接指定型号的摄像头
void ConnectTargetCamera(string vid, string pid)
{
// 获取所有 USB 设备
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
collection = searcher.Get();
// 遍历所有 USB 设备
foreach (var device in collection)
{
// 判断设备是否为指定型号的摄像头
if (IsTargetCamera(device, vid, pid))
{
// 使用 AForge.NET 连接摄像头
var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
var videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.Start();
break;
}
}
}
示例说明
示例代码第一个函数 IsTargetCamera
用于判断设备是否为指定型号的摄像头。其中 device
参数为 ManagementObject
类型的对象,表示搜索到的一个 USB 设备;vid
参数和 pid
参数分别表示 Vendor ID 和 Product ID,用于指定需要连接的摄像头设备型号。函数会使用正则表达式从设备的硬件 ID 中提取 Vendor ID 和 Product ID,然后进行比较。如果匹配成功,则表明设备是指定型号的摄像头。
示例代码第二个函数 ConnectTargetCamera
用于连接指定型号的摄像头。其中 vid
参数和 pid
参数与 IsTargetCamera
函数的参数相同,用于指定需要连接的摄像头设备型号。函数会使用 ManagementObjectSearcher
类搜索所有的 USB 设备,并遍历搜索结果。在遍历过程中,判断每个设备是否为指定型号的摄像头,如果是,则使用 AForge.NET 连接该摄像头。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#调用usb摄像头的实现方法 - Python技术站