C# .NET5 Winforms项目调用摄像头捕获图像的开源方案求助
.NET5 WinForms 摄像头捕获开源解决方案
方案1:Emgu CV 4.5+(开源MIT协议,推荐用于实时场景)
该版本原生适配.NET5+,是OpenCV的官方.NET封装,性能稳定,支持摄像头捕获、画面处理等全量功能。
- 打开NuGet包管理器,搜索安装三个依赖包:
Emgu.CV、Emgu.CV.runtime.windows、Emgu.CV.Bitmap,所有包版本保持一致即可 - 窗体拖入一个
PictureBox控件用于显示画面,添加以下核心代码:
using Emgu.CV; using System.Drawing; // 全局声明捕获对象和帧容器 private VideoCapture _cameraCapture; private Mat _currentFrame = new Mat(); // 窗体加载时初始化摄像头 private void Form1_Load(object sender, EventArgs e) { // 0对应系统默认摄像头,多摄像头可修改索引为1、2等 _cameraCapture = new VideoCapture(0); if (!_cameraCapture.IsOpened) { MessageBox.Show("摄像头启动失败,请检查设备权限"); return; } // 绑定帧捕获事件 _cameraCapture.ImageGrabbed += CameraCapture_ImageGrabbed; _cameraCapture.Start(); } // 每次捕获到新帧时触发 private void CameraCapture_ImageGrabbed(object sender, EventArgs e) { if (_cameraCapture == null || !_cameraCapture.IsOpened) return; // 读取当前帧数据 _cameraCapture.Read(_currentFrame); // 跨线程更新UI控件 Invoke(new Action(() => { pictureBox1.Image = _currentFrame.ToBitmap(); })); } // 窗体关闭时释放资源,避免摄像头占用 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { _cameraCapture?.Stop(); _cameraCapture?.Dispose(); _currentFrame?.Dispose(); }
如果你之前尝试的OpenCVSharp版本≥4.5,出现有进程无画面的问题,大概率是未安装对应运行时包:除了
OpenCvSharp4主包之外,还需要安装OpenCvSharp4.runtime.win包,同时将项目平台目标设置为x64或x86,不要使用Any CPU。
方案2:轻量无第三方依赖实现(基于Windows原生API)
不需要额外引入开源组件,直接调用.NET5桌面应用支持的UWP MediaCapture API,适合仅需要基础捕获功能的场景。
- 右键项目→属性→目标框架,修改为
net5.0-windows10.0.17763.0及以上版本,开启UWP API调用权限 - 添加以下核心代码:
using Windows.Media.Capture; using Windows.Media.MediaProperties; using System.IO; using System.Drawing; private MediaCapture _mediaCapture; // 初始化摄像头 private async void InitCameraBtn_Click(object sender, EventArgs e) { _mediaCapture = new MediaCapture(); await _mediaCapture.InitializeAsync(); // 捕获单张照片示例 using var stream = new InMemoryRandomAccessStream(); await _mediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateBmp(), stream); stream.Seek(0); pictureBox1.Image = new Bitmap(stream.AsStream()); // 如需实时预览,可定时调用抓帧逻辑,或引入`Microsoft.Toolkit.Forms.UI.Controls`包的CaptureElement控件绑定预览流 }
内容的提问来源于stack exchange,提问作者DiamondsBar
相关产品推荐
相关产品推荐

