OpenCV获取Usb相机视频流(Windows)

本文介绍如何在Windows环境下使用Python进行视频捕获,主要聚焦于通过USB连接的相机设备。利用VideoCapture库,我们可以轻松地从USB相机中获取视频流,并通过不同的参数设置来选择具体的输入源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、设备:usb相机
二、Windows下VideoCapture传入参数为0、1…
三、使用python代码,结果如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//指定视频采集设备的友好名字,为它创建一个Filter IBaseFilter * CTestPreviewDlg::CreateVideoDevice(const char * inFriendlyName) { return CreateHardwareFilter(CLSID_VideoInputDeviceCategory,inFriendlyName); } //根据设备的友好名字,创建一个代表该设备的Filter IBaseFilter * CTestPreviewDlg::CreateHardwareFilter(GUID inCategory,const char * inFriendlyName) { //创建一个系统枚举组件对象 ICreateDevEnum * enumHardware = NULL; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL, IID_ICreateDevEnum,(void**)&enumHardware); if(FAILED(hr)) { return NULL; } IBaseFilter * hardwareFilter = NULL; IEnumMoniker * enumMoniker = NULL; //为指定的目录创建枚举器 hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0); if(enumMoniker) { enumMoniker->Reset(); ULONG fetched = 0; IMoniker * moniker = NULL; char friendlyName[256]; //枚举得到该目录下所有的设备,逐个进行名字匹配 while(!hardwareFilter && SUCCEEDED(enumMoniker->Next(1,&moniker, &fetched)) && fetched) { if(moniker) { IPropertyBag * propertyBag = NULL; VARIANT name; friendlyName[0] = 0; hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&propertyBag); //读取设备的友好名字 if(SUCCEEDED(hr)) { name.vt = VT_BSTR; hr = propertyBag->Read(L"Friendlyname",&name,NULL); } if(SUCCEEDED(hr)) { WideCharToMultiByte(CP_ACP,0,name.bstrVal,-1, friendlyName,256,NULL,NULL); //如果当前设备的友好名字与用户指定的设备名字相同, //则将当前设备标识绑定为Filter形式 if(strcmp(friendlyName,inFriendlyName) == 0) { moniker->BindToObject(0,0,IID_IBaseFilter, (void**)&hardwareFilter); } } //释放使用过的接口 if(propertyBag) { propertyBag->Release(); propertyBag = NULL; } moniker->Release(); } } enumMoniker->Release(); } enumHardware->Release(); return hardwareFilter; }
在使用 OpenCvSharp 从 USB 相机捕获视频流时,可以通过 `VideoCapture` 类实现。该类封装了底层的 V4L2(Video for Linux 2)接口,在 Linux 系统上能够直接访问 USB 摄像头设备[^2]。 以下是一个完整的示例代码,展示了如何使用 OpenCvSharp 从 USB 相机读取并显示视频流: ```csharp using System; using OpenCvSharp; class Program { static void Main(string[] args) { // 打开默认摄像头(通常是 /dev/video0) VideoCapture capture = new VideoCapture(0, VideoCaptureAPIs.V4L2); if (!capture.IsOpened()) { Console.WriteLine("无法打开摄像头"); return; } // 设置分辨率(可选) capture.Set(CapProp.FrameWidth, 640); capture.Set(CapProp.FrameHeight, 480); // 创建显示窗口 Cv2.NamedWindow("USB Camera", WindowFlags.AutoSize); while (true) { Mat frame = new Mat(); capture.Read(frame); // 读取一帧图像 if (frame.Empty()) break; Cv2.ImShow("USB Camera", frame); // 显示图像 // 按下 ESC 键退出循环 if (Cv2.WaitKey(1) == 27) break; } // 释放资源 capture.Release(); Cv2.DestroyAllWindows(); } } ``` ### 说明: - **VideoCapture 构造函数中的参数**:`new VideoCapture(0, VideoCaptureAPIs.V4L2)` 中的 `0` 表示第一个摄像头设备(通常为 `/dev/video0`),`VideoCaptureAPIs.V4L2` 强制使用 Linux 下的 V4L2 接口。 - **设置分辨率**:通过 `Set()` 方法可以调整摄像头的输出分辨率,如 640x480。 - **读取和显示帧**:在一个无限循环中不断调用 `Read()` 获取图像帧,并使用 `ImShow()` 显示图像。 - **退出机制**:按键盘上的 ESC 键(ASCII 码为 27)退出循环,关闭摄像头和窗口。 ### 注意事项: - 在 Linux 平台上运行此程序前,请确保系统支持 V4L2 接口,并且 USB 摄像头已正确连接。 - 若使用的是 Windows 平台,则无需指定 `VideoCaptureAPIs.V4L2`,OpenCvSharp 会自动选择合适的后端。 - 如果出现权限问题,可能需要将用户添加到 `video` 用户组:`sudo usermod -aG video $USER`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值