在海康的MVS客户端里,这三种情况通常分别对应:丢失帧(Lost Frame)、空帧(实际可能是全黑图)和残帧/不完整帧(Incomplete Frame) 。它们的根因完全不同,不能都用"丢包"去治。
一、残帧/不完整帧------画面花屏、黑块、出图报错
这就是我之前说的"丢包"的典型表现。
-
快速定位 :打开MVS,右键相机选"属性",看"传输控制"下的丢失包数,如果一直在涨,那就是网络丢包。
-
必杀技:
-
网卡 :换Intel I210/I350独立网卡,禁用主板的。
-
巨帧:相机、网卡、交换机端到端全部开启9K巨帧,这是关键。
-
包间隔:在相机"传输控制"里,把包间隔调大,比如设个 5~10 µs,别让它零间隔狂发包。
-
缓冲区:网卡属性里,把接收缓冲区拉到最大(如2048)。
-
禁用防火墙/杀毒,排除软件拦截。
-
二、空帧------收到帧了,但画面全黑、没数据
这和网络丢包无关,是相机根本没抓到有效图像。
-
典型场景:触发模式下,有触发信号但拍出来是全黑的。
-
可能原因及解决:
-
触发信号与曝光时序不匹配 :触发后曝光时间太短,或者触发边沿/延时没设好,相机还没开始曝光就读出了。在MVS的"采集控制"里,重点检查触发延时(Trigger Delay),先归零测试。
-
曝光时间极短或被光源坑了:曝光设了几微秒,或频闪光源刚好在相机读出时灭了。手动拉高曝光或用常亮灯验证。
-
线材/接线问题:触发线接错(比如常接电源成了常关)、光耦极性设反。检查"输入线路"的触发激活方式是上/下沿。
-
相机输出确实全黑但图像完整 :用MVS单帧抓拍,把鼠标移到图像上,看看下方显示的像素值是否全为0。如果全0,说明不是空包,是全黑帧,按曝光排查。如果像素值是乱的,可能是残帧被误认。
-
三、丢帧------软件"跳帧",图像不连续,队列跟丢
软件根本没收到这一帧,但相机可能已经发了。
-
典型现象:相机帧率30,软件显示采集到的帧号不连续,比如1、2、4,其中3被丢了。
-
原因和解决:
-
取流线程卡死/处理不过来 :你的检测代码里面,回调函数耗时长,导致驱动层帧队列堆满,新帧被丢弃。
优化 :回调里只拷贝图像,另开线程处理。或增加相机传输队列里的帧缓存数量 (在SDK里用
SetGrabbingTimeout或加大ImagePool数量)。 -
触发频率 > 相机最大帧率:算一下设定的触发周期,不能小于相机曝光+读出的最小时间。线阵相机要特别注意行频和行触发的匹配。
-
CPU满载或调度问题:电源计划切到"高性能",关掉核心停车。检查任务管理器,如果处理进程CPU核心打满,就会丢帧。
-
触发信号干扰:偶尔的毛刺会导致误触发,让相机多拍了一张你没准备接收的"额外帧",打乱队列感知。在触发源里加个软件滤波(如果支持)。
-
四、综合排查建议(现场三板斧)
-
先用MVS的"统计信息"面板定案 :看一眼 丢失帧数、丢失包数、重传请求数。哪个在涨,就对应上面的哪种情况。
-
纯摸底测试:直接用MVS连续采图并保存,不跑你的程序。如果这时一切正常,那基本是你代码取流流程有问题;如果MVS下也残/丢,那是网络或驱动的事。
-
一个最容易忽视的坑 :如果相机被放到了路由口或虚拟网段下,而你的搜索协议包乱飞,也可能导致控制流混乱造成掉线。务必保证相机和电脑在同一物理网段。
这三种情况经常并发,比如先因网络大残帧,处理线程一卡顿,又导致丢帧,同时触发时序不稳又出空帧。按上面的分类去抓主要矛盾,很快就能收住。