商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > C#怎么调用摄像头拍照_C#如何基于AForge框架开发【案例】

C#怎么调用摄像头拍照_C#如何基于AForge框架开发【案例】

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

先别说能不能直接用,先确认你的目标平台和SDK版本。用AForge.Video.DirectShow调用本地摄像头拍照,原则上可行,但有个大前提:它早就停止维护了。.NET Core或.NET 5以上的项目没法原生跑,Windows 11上部分设备驱动也不兼容。所以,别一上来就踩坑,平台和版本得先理清楚。

为什么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遍历支持的格式,挑一个兼容性高的。比如,优先选MJPG:new VideoCapabilities(640, 480, "MJPG")
  • 如果还不行,强制设为YUY2(兼容性最好):device.DesiredFrameSize = new Size(640, 480); device.DesiredFrameRate = 15;
  • 更新UI画面时,别在pictureBox的Paint事件里直接绘图,用Invoke更新,否则容易线程冲突。

拍照保存为JPEG但文件损坏或颜色异常

AForge的Bitmap输出默认是BGR通道顺序(OpenCV风格),而Sa ve方法按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.Sa ve("photo.jpg", ImageFormat.Jpeg);
clone.Dispose();

另外,别在NewFrame事件中频繁调用Sa ve。IO阻塞会导致帧率暴跌甚至程序崩溃,加个简单锁或队列缓冲会好很多。

真正麻烦的不是调用逻辑本身,而是AForge对UVC协议新设备的支持已经断层,对ARM64 Windows零适配,和现代.NET生命周期管理(如Dispose时机)也有冲突。如果项目需要长期维护,最好把拍照模块隔离成独立的.NET Framework 4.8进程,主程序通过命名管道通信。别让整个应用被一个过时框架拖住升级节奏。

C#怎么调用摄像头拍照_C#如何基于AForge框架开发【案例】

本文转载于:https://www.php.cn/faq/2311769.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注