工业相机帧率获取(C# 版本)
附海康 / Basler / 堡盟三大品牌完整代码,轻松掌握实时 FPS!
“我的相机标称 30fps,为什么程序里只跑出 15fps?”
“如何在 UI 上实时显示当前帧率?”
“不同品牌 SDK 获取帧率的方式竟然完全不同?”
在工业视觉应用中,帧率(FPS)是衡量系统性能的核心指标。它不仅关系到产线节拍,更是排查性能瓶颈的第一线索。
本文将手把手教你用C#获取海康(Hikvision)、Basler、堡盟(Baumer)三大主流工业相机的实时帧率,并提供可直接复用的代码模板。
📊 一、帧率的两种含义
在讨论代码前,先明确两个概念:
| 类型 | 说明 | 获取方式 |
|---|---|---|
| 理论帧率 | 相机在当前分辨率/格式下能达到的最大帧率 | 通过相机参数(如AcquisitionFrameRate)查询 |
| 实际帧率 | 应用程序真正接收到图像的速率 | 需要通过时间戳计数来计算 |
💡本文重点:获取「实际帧率」,因为它最能反映你系统的真实性能。
💻 二、通用帧率计算器(C#)
无论使用哪个品牌的相机,实际帧率的计算逻辑是通用的:
// FrameRateCalculator.csusingSystem;usingSystem.Diagnostics;publicclassFrameRateCalculator{privatereadonlyStopwatchstopwatch=Stopwatch.StartNew();privatelongframeCount=0;privatedoublelastFps=0;// 每收到一帧图像,调用此方法publicvoidOnNewFrame(){frameCount++;}// 定期(如每秒)调用此方法获取当前FPSpublicdoubleGetFramesPerSecond(){varelapsedSeconds=stopwatch.Elapsed.TotalSeconds;if(elapsedSeconds>=1.0){lastFps=frameCount/elapsedSeconds;frameCount=0;stopwatch.Restart();}returnlastFps;}}接下来,我们只需在各自的图像回调函数中调用OnNewFrame()即可。
🔧 三、各品牌 SDK 实战代码
1. 海康(Hikvision)MVS .NET SDK
// HikvisionFrameRate.csusingMvCamCtrl.NET;usingSystem;usingSystem.Runtime.InteropServices;publicclassHikvisionCamera{privateMyCameracamera;privateFrameRateCalculatorfpsCalc=newFrameRateCalculator();privateboolisGrabbing=false;publicvoidStartGrabbing(){// ... 初始化和打开相机代码 ...// 注册图像回调camera.MV_CC_RegisterImageCallBackEx(OnImageCallback,IntPtr.Zero);camera.MV_CC_StartGrabbing();isGrabbing=true;}privatevoidOnImageCallback(IntPtrpData,refMyCamera.MV_FRAME_OUT_INFO_EXpFrameInfo,IntPtrpUser){// 处理图像数据...// 关键:通知帧率计算器fpsCalc.OnNewFrame();}publicdoubleGetCurrentFps()=>fpsCalc.GetFramesPerSecond();}2. Basler pylon .NET
// BaslerFrameRate.csusingBasler.Pylon;usingSystem;publicclassBaslerCamera{privateCameracamera;privateFrameRateCalculatorfpsCalc=newFrameRateCalculator();publicvoidStartGrabbing(){camera=newCamera();camera.Open();// 订阅图像接收事件camera.StreamGrabber.ImageGrabbed+=OnImageGrabbed;camera.StreamGrabber.Start();}privatevoidOnImageGrabbed(objectsender,ImageGrabbedEventArgse){if(e.GrabResult.GrabSucceeded){// 处理图像...// 关键:通知帧率计算器fpsCalc.OnNewFrame();}e.DisposeGrabResultIfClone();}publicdoubleGetCurrentFps()=>fpsCalc.GetFramesPerSecond();}3. 堡盟(Baumer)GAPI .NET
// BaumerFrameRate.csusingBGAPI2;usingSystem;publicclassBaumerCamera{privateBGAPI2.Devicedevice;privateBGAPI2.DataStreamdataStream;privateFrameRateCalculatorfpsCalc=newFrameRateCalculator();publicvoidStartGrabbing(){// ... 初始化设备和数据流 ...// 开始抓图dataStream.StartAcquisition();// 启动一个线程或使用异步方式持续取图Task.Run(()=>GrabLoop());}privatevoidGrabLoop(){while(/* running */){varbuffer=dataStream.GetBuffer(100);// 100ms超时if(buffer!=null){// 处理图像...// 关键:通知帧率计算器fpsCalc.OnNewFrame();dataStream.QueueBuffer(buffer);}}}publicdoubleGetCurrentFps()=>fpsCalc.GetFramesPerSecond();}📈 四、进阶:获取理论最大帧率
有时你也需要知道相机在当前配置下的理论极限:
- 海康:
MV_CC_GetIntValue("AcquisitionFrameRate") - Basler:
camera.Parameters[PLCamera.AcquisitionFrameRate].GetValue() - 堡盟:
device.GetRemoteNode("AcquisitionFrameRate").GetDouble()
⚠️ 注意:理论帧率受曝光时间、传输带宽、ROI区域等多种因素影响。
💬 结语
掌握帧率监控,你就掌握了工业视觉系统的“脉搏”。通过本文提供的 C# 代码模板,你可以轻松集成到自己的项目中,在 UI 上实时显示 FPS,快速定位性能瓶颈。
让每一帧都算数,让每一秒都高效。