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

使用C#与AForge时USB摄像头画面无法在PictureBox显示

解决AForge连接Logitech C920摄像头无法显示画面的问题

我之前做WinForms摄像头项目时,也碰到过和你一模一样的情况——内置摄像头正常工作,C920能被识别但画面出不来。结合你的代码和设备特性,大概率是这几个问题导致的,给你逐个排查:

1. 跨线程更新UI控件的线程安全问题

WinForms的控件只能在UI线程中更新,而AForge的NewFrame事件是在它自己的工作线程触发的。你的代码直接给picPhoto.Image赋值,内置摄像头可能因为线程调度巧合没触发异常,但C920的线程模型刚好暴露了这个问题。

修改你的cam_NewFrame方法,加上跨线程调用判断:

void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
    // 检查是否需要切换到UI线程更新控件
    if (picPhoto.InvokeRequired)
    {
        picPhoto.Invoke(new Action<Bitmap>(b => picPhoto.Image = b), bit);
    }
    else
    {
        picPhoto.Image = bit;
    }
}

这个应该是最可能的原因,先试试这个方案。

2. 摄像头分辨率/格式不兼容

Logitech C920支持多种高分辨率格式(比如1080P),AForge默认选择的分辨率可能和你的PictureBox不兼容,或者设备无法正常输出该格式。你可以手动指定一个C920支持且PictureBox能渲染的分辨率:

cam = new VideoCaptureDevice(webcam[cbCameras.SelectedIndex].MonikerString);
// 从设备支持的格式中选择一个合适的,比如1280x720
var targetRes = cam.VideoCapabilities.FirstOrDefault(cap => cap.FrameSize.Width == 1280 && cap.FrameSize.Height == 720);
if (targetRes != null)
{
    cam.VideoResolution = targetRes;
}
cam.NewFrame += cam_NewFrame;
cam.Start();

如果默认分辨率太高,PictureBox可能无法及时渲染,导致画面空白。

3. AForge版本兼容性问题

确保你使用的是最新版的AForge.NET Framework库,旧版本对一些USB摄像头的支持可能有漏洞。如果是NuGet安装的,尝试更新到最新稳定版。

先从第一个问题开始排查,这个解决后大部分C920的画面显示问题都能搞定。

内容的提问来源于stack exchange,提问作者ewom2468

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:27:15