AForge.Video.DirectShow调用本地摄像头需注意权限、驱动兼容性及格式协商:开启相机权限、以管理员运行、安装DirectX运行时;FilterInfoCollection为空多因权限或驱动问题;VideoCaptureDevice黑屏需显式设置VideoFormat(如MJPG或YUY2);保存JPEG前须处理BGR通道顺序并避免NewFrame中直接Save。

直接用 AForge.Video.DirectShow 调用本地摄像头拍照是可行的,但要注意它早已停止维护,.NET Core / .NET 5+ 项目无法原生运行,且 Windows 11 上部分设备驱动不兼容——别硬踩坑,先确认你的目标平台和 SDK 版本。
为什么 FilterInfoCollection 返回空列表?
这是最常卡住的第一步。不是代码写错了,而是权限或驱动问题:
- Windows 10/11 必须开启「相机」系统权限(设置 → 隐私 → 相机 → 允许应用访问相机)
- 以管理员身份运行程序(尤其调试时),否则
DirectShow枚举不到设备 -
AForge依赖旧版 DirectX 运行时,Win11 默认不装,需手动安装DirectX End-User Runtimes (June 2010) - USB 摄像头插在 USB 3.0 接口有时识别失败,换到 USB 2.0 口试试
验证方式:运行 GraphEdit(Windows SDK 工具)看能否列出「Video Capture Source」节点。
VideoCaptureDevice 启动后黑屏或报错 Failed to set output format
本质是视频格式协商失败。AForge 默认尝试 RGB24,但很多摄像头只支持 MJPG 或 YUY2:
- 启动前必须显式设置
VideoResolution和VideoFormat,不能依赖自动探测 - 用
device.VideoCapabilities遍历支持的格式,挑一个兼容性高的,比如:new VideoCapabilities(640, 480, "MJPG") - 若仍失败,强制设为
YUY2(兼容性最好):device.DesiredFrameSize = new Size(640, 480); device.DesiredFrameRate = 15; - 避免在
pictureBox的Paint事件里直接绘图,改用Invoke更新 UI,否则容易线程冲突
拍照保存为 JPEG 但文件损坏或颜色异常
AForge 的 Bitmap 输出默认是 BGR 通道顺序(OpenCV 风格),而 Save("xxx.jpg") 按 RGB 处理,导致色偏:
- 保存前必须手动转换通道:
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);(翻转 Y 轴修复镜像) - 更稳妥的做法是用
Bitmap.Clone()+PixelFormat.Format24bppRgb强制重排像素:
var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
var clone = bitmap.Clone(rect, PixelFormat.Format24bppRgb);
clone.Save("photo.jpg", ImageFormat.Jpeg);
clone.Dispose();
另外,别在 NewFrame 事件中频繁调用 Save——IO 阻塞会导致帧率暴跌甚至崩溃,加个简单锁或队列缓冲。
真正麻烦的不是调用逻辑,而是 AForge 对 UVC 协议新设备的支持断层、对 ARM64 Windows 的零适配,以及和现代 .NET 生命周期管理(如 Dispose 时机)的冲突。如果项目要长期维护,建议把拍照模块隔离成独立 .NET Framework 4.8 进程,主程序通过命名管道通信——别让整个应用被一个过时框架拖住升级节奏。











