news 2026/4/21 6:29:29

工业相机帧率获取(C#版本),附海康basler堡盟工业相机代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业相机帧率获取(C#版本),附海康basler堡盟工业相机代码

工业相机帧率获取(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")
  • Baslercamera.Parameters[PLCamera.AcquisitionFrameRate].GetValue()
  • 堡盟device.GetRemoteNode("AcquisitionFrameRate").GetDouble()

⚠️ 注意:理论帧率受曝光时间、传输带宽、ROI区域等多种因素影响。


💬 结语

掌握帧率监控,你就掌握了工业视觉系统的“脉搏”。通过本文提供的 C# 代码模板,你可以轻松集成到自己的项目中,在 UI 上实时显示 FPS,快速定位性能瓶颈。

让每一帧都算数,让每一秒都高效。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 6:23:22

RWKV-7 (1.5B World)开发者体验报告:从首次运行到二次开发全流程反馈

RWKV-7 (1.5B World)开发者体验报告:从首次运行到二次开发全流程反馈 1. 项目概述 RWKV-7 (1.5B World)是一款专为单卡GPU优化的轻量级大模型对话工具。作为RWKV架构的最新实现,它在保持1.5B参数规模的同时,提供了出色的多语言处理能力和高…

作者头像 李华
网站建设 2026/4/21 6:20:28

zmq源码分析之管道创建pipepair

文章目录 一、函数签名与参数 参数详解: 二、函数实现逐行解析 **第 1 步:定义底层队列类型** **第 2 步:创建第一个方向的队列** **第 3 步:创建第二个方向的队列** **第 4 步:创建两个管道对象(关键!)** **第 5 步:设置互为对等体** 三、pipe_t 构造函数详解 四、实…

作者头像 李华