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

AForge图像采集程序在Windows 11下无法显示画面的问题求助

问题描述

基于.NET Framework 4.8的C# Windows窗体应用,使用AForge库开发基础图像采集程序,点击按钮可激活摄像头并在PictureBox显示画面。程序在Windows 10运行正常,但Windows 11中点击启用按钮后PictureBox无画面显示。

问题排查与修复方案

1. 跨线程UI更新问题

AForge的NewFrame事件在非UI线程触发,直接给PictureBox赋值属于跨线程操作。Windows 10对这类操作兼容性较强,而Windows 11的线程管控更严格,会导致画面无法渲染。需切换到UI线程更新控件:

private void Videocapturedevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    if (picBox.InvokeRequired)
    {
        picBox.Invoke(new Action(() =>
        {
            UpdatePictureBoxImage(eventArgs.Frame);
        }));
    }
    else
    {
        UpdatePictureBoxImage(eventArgs.Frame);
    }
}

private void UpdatePictureBoxImage(Bitmap frame)
{
    // 释放旧图像资源,避免内存泄漏
    if (picBox.Image != null)
    {
        picBox.Image.Dispose();
    }
    picBox.Image = (Bitmap)frame.Clone();
}

2. 代码冗余与资源泄漏问题

原代码存在冗余初始化逻辑,且未处理重复点击按钮时的设备资源释放,可能导致设备占用或事件重复绑定:

private void button1_Click(object sender, EventArgs e)
{
    // 先停止并清理之前的设备实例
    if (videocapturedevice != null && videocapturedevice.IsRunning)
    {
        videocapturedevice.SignalToStop();
        videocapturedevice.WaitForStop();
        videocapturedevice.NewFrame -= Videocapturedevice_NewFrame;
    }
    
    videocapturedevice = new VideoCaptureDevice(filterinfocollecton[cmbCamera.SelectedIndex].MonikerString);
    videocapturedevice.NewFrame += Videocapturedevice_NewFrame;
    videocapturedevice.Start();
}

3. Windows 11权限与兼容性处理

  • 摄像头权限:进入Windows设置→隐私和安全性→相机,确认该应用的摄像头访问权限已开启。
  • 兼容性设置:右键程序→属性→兼容性,勾选“以兼容模式运行这个程序”并选择Windows 10,同时勾选“以管理员身份运行此程序”。
  • AForge版本适配:确保使用的AForge库版本兼容.NET Framework 4.8,若版本过旧可尝试更新(注:AForge已停止维护,长期可考虑替换为EmguCV等现代图像库)。
修复后的完整代码
using System;
using System.Drawing;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;

namespace CameraProject
{
    public partial class Form1 : Form
    {
        private FilterInfoCollection filterinfocollecton;
        private VideoCaptureDevice videocapturedevice;
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            filterinfocollecton = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (filterinfocollecton.Count == 0)
            {
                MessageBox.Show("未找到摄像头设备。");
                return;
            }

            foreach (FilterInfo filterInfo in filterinfocollecton)
            {
                cmbCamera.Items.Add(filterInfo.Name);
            }
            cmbCamera.SelectedIndex = 0;
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            if (videocapturedevice != null && videocapturedevice.IsRunning)
            {
                videocapturedevice.SignalToStop();
                videocapturedevice.WaitForStop();
                videocapturedevice.NewFrame -= Videocapturedevice_NewFrame;
            }
            
            videocapturedevice = new VideoCaptureDevice(filterinfocollecton[cmbCamera.SelectedIndex].MonikerString);
            videocapturedevice.NewFrame += Videocapturedevice_NewFrame;
            videocapturedevice.Start();
        }

        private void Videocapturedevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (picBox.InvokeRequired)
            {
                picBox.Invoke(new Action(() => UpdatePictureBoxImage(eventArgs.Frame)));
            }
            else
            {
                UpdatePictureBoxImage(eventArgs.Frame);
            }
        }

        private void UpdatePictureBoxImage(Bitmap frame)
        {
            if (picBox.Image != null)
            {
                picBox.Image.Dispose();
            }
            picBox.Image = (Bitmap)frame.Clone();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (videocapturedevice != null && videocapturedevice.IsRunning)
            {
                videocapturedevice.SignalToStop();
                videocapturedevice.WaitForStop();
                videocapturedevice.NewFrame -= Videocapturedevice_NewFrame;
                videocapturedevice.Dispose();
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者K.T.A Roshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:05:55