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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:39:04