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