ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LabVIEW视频跟踪实战:阈值分割与粒子分析实现质心定位

LabVIEW视频跟踪实战:阈值分割与粒子分析实现质心定位 做视觉引导项目这几个月我把LabVIEW视频跟踪这条路整个趟了一遍。所谓视频跟踪就是用摄像头代替人的眼睛在连续的图像帧里锁定目标物体的位置实时输出坐标供机械臂、运动平台或者PLC去执行动作。传送带上的工件识别抓取、无人机视觉跟随、实验台上的小球轨迹测量本质都是同一件事稳定地找到目标并算出它在图像里的位置偏移。这篇文章我把整个项目的设计思路、图像采集链路、分割处理流程、常见坑点都整理出来适合做LabVIEW视觉项目、自动化产线改造或者相关毕业设计的朋友参考。完整跑通一个阈值分割粒子分析质心跟踪的案例之后再往模板匹配、特征跟踪进阶会顺利很多。1. 视频跟踪项目该怎么拆先定义你要的跟踪1.1 我见过的三类视频跟踪需求先别急着写程序拿到需求第一步是搞清楚你要的到底是哪一种跟踪。我做过和接触过的项目里绝大多数可以归成三类。第一类目标的外观特征稳定形状、纹理、颜色都相对固定。比如包装盒上的Logo、电路板上的元件、贴着标签的工件。这类需求我一般直接用模板匹配来做NI Vision开发包里对应的是IMAQ Match Pattern这一族函数。它的思路是提前截一张模板图像存起来然后在实时画面里找和模板最相似的区域。第二类目标是靠颜色或亮度区分的也是工程里最常见的。比如深色小球在浅色背景上滚过、LED指示灯亮起、传送带上的深色工件在浅色皮带上运动。这类需求用阈值分割粒子分析就能解决也是本文案例要讲的重点。它的逻辑是把图像变成黑白二值图白色区域就是目标然后算这些白色区域的面积、质心、外接矩形。第三类不知道目标长什么样只要画面里有动起来的东西就算目标。比如车流统计、区域入侵检测、人流量分析。这类会用到帧差法、背景建模甚至光流法LabVIEW视觉库里也有相关函数但工程落地相对少见更多是科研或算法验证。下面用一张表把三条路径放一起对比项目前期选型可以直接对照。方案核心函数适用场景主要弱点模板匹配IMAQ Match Pattern特征稳定、纹理清晰目标目标变形/旋转时容易失配阈值分割粒子分析IMAQ Threshold IMAQ Particle Analysis目标与背景灰度/颜色差异明显受光照变化影响较大帧差法/背景建模IMAQ Difference 形态学目标运动、背景相对静止目标静止时会直接消失1.2 为什么我最终选了LabVIEW做视频跟踪很多朋友会问Python加OpenCV不也能做跟踪吗为什么还要用LabVIEW这个问题我在项目初期也纠结过。我的结论是这样如果只是纯算法研究Python确实灵活OpenCV的跟踪器、深度学习模型都很方便。但视频跟踪项目从来不只是跟踪它往往还要带上位机界面、要和PLC走串口或TCP通信、要把结果记录下来、要发布成可执行文件丢给现场电脑用。把这些都串起来的时候LabVIEW的开发效率优势就非常明显了。前面板拖几个控件就是人机界面视觉函数库封装得很干净错误处理和通信模块都是现成的。而且图形化编程有个天生的好处现场改参数不用重新编译双击阈值控件改个数字立刻就能看到效果调试节奏快得多。另外还有一点NI Vision的函数库已经沉淀了很多年稳定性是经过大量工业现场验证的。图像采集、滤波、形态学、粒子分析这些基础操作调用底层函数比自己一行行写算法要可靠得多出问题的概率也低。1.3 方案选型里的几个关键取舍选型阶段有几个取舍我每次做项目都会反复权衡。速度与精度的平衡放在第一位。分辨率越高能分辨的细节越多精度自然越好但图像处理时间会直线上升。你的项目如果相机帧率30fps留给每一帧的处理时间只有大约33毫秒这里面要包含采集、分割、计算、坐标输出整个流程。如果处理后还要发串口给PLC时间更紧张。所以不要盲目追求高分辨率够用就好。第二个是自动曝光还是固定参数。我早期做过一个项目相机默认开启自动曝光结果目标从亮区走进暗区的时候画面亮度自动变化阈值分割跟着全乱套。后来我把曝光、增益全部固定手动调好一组参数问题立刻消失。这个坑我建议所有人都提前避开。第三个是光源和背景。工业视觉里一直有句话叫打光比算法重要视频跟踪也一样。如果目标是红色小球背景是白色传送带你用一个红色LED光源打上去目标在画面里非常亮背景很暗跟踪阈值随便设都能完美分割。算法上费半天劲处理的鲁棒性问题可能一个光源就解决了。项目开始时多花点心思在光学环境上后面能省大量调试时间。2. 环境与图像采集链路先点亮眼睛2.1 一套完整的工具栈要准备哪些东西先说版本我做这个项目用的是LabVIEW 2018配合Vision Development Module 2018。其实2014、2015的版本也完全能做差别不大。VDM是必须装的没有它就没有图像采集和视觉处理函数库。另外还需要装相机驱动NI-IMAQdx它负责让LabVIEW能枚举和读取市面上绝大多数USB和GigE接口的工业相机。相机方面USB3.0接口的工业相机足够大多数视频跟踪项目使用。选型时留意传感器最好选全局曝光Global Shutter的类型拍快速运动的目标不会出现果冻效应画面不会变形。镜头用定焦工业镜头就行焦距根据工作距离和视野大小来选。比如相机架在离传送带大约500毫米的高度配一颗8mm或12mm镜头的视野就够覆盖一个中等大小的工件了。还有一个很关键的软件细节安装VDM之后建议在MAXMeasurement Automation Explorer里先确认相机能被识别到。插上相机打开MAX如果左侧设备列表里能看到相机名称并预览出画面再回到LabVIEW编程能省掉很多通信层面的报错排查。2.2 相机采集流程的核心细节图像采集这部分我习惯把流程拆成四个步骤打开相机、配置采集模式、循环抓帧、程序结束时关闭相机。对应的函数依次是IMAQdx Open Camera、IMAQdx Configure Grab、IMAQdx Grab最后是IMAQdx Close Camera。Grab模式适合做视频跟踪因为它会把采集配置成连续模式程序循环里每次调用Grab就取回最新一帧图像。注意不要用Snapshot模式那个每次都重新初始化采集链路速度很慢帧率根本跑不起来。像素格式建议画面是彩色但没有特殊需求的话直接用RGB U32或者YUV格式采集如果画面本身就是黑白直接选Grayscale U8。这里有个减少处理量的技巧如果目标在画面里本来就是彩色物体而你最终要按灰度阈值分割那可以在采集阶段就设成灰度格式省掉后面转灰度的步骤。不过这么做会丢失颜色信息如果后续还想做颜色匹配就得保留彩色格式。分辨率设多少合适我一般从200万像素1920×1080起步在电脑上实测一下处理一帧需要多长时间再根据项目实时性要求调整。帧率低一点无所谓但画面的实时性必须保证。处理时间如果超过帧间隔会出帧堆积整个程序越来越卡。2.3 图像预处理的几个关键操作采集到原始图像之后通常不能直接拿去计算要先做预处理。我总结了一套固定套路转灰度、去噪、阈值分割、形态学清理。转灰度这步很多人会忽略方法的影响。RGB转换灰度时不同通道对目标的响应不一样。如果目标是红色的那么在红色通道里它最亮提取单色平面比直接用通用灰度转换效果更好。这一步LabVIEW里用IMAQ ExtractSingleColorPlane选Red、Green、Blue其中一个通道。去噪我用得最多的是中值滤波IMAQ LowPass里内置几种滤波器中值滤波对椒盐噪声画面里孤立的黑白噪点清除效果很好。做视频跟踪时画面里少量噪点完全可以通过噪声滤除但要注意滤波核不能设太大否则目标边缘会被磨圆影响质心的定位精度一般3×3或5×5就够。阈值分割是重头戏。画面稳定、光照好的情况下直接用IMAQ Threshold给上下限转成二值图。光照如果会缓慢变化可以用IMAQ AutoBThreshold2里面有Otsu、聚类等自动阈值算法。不过我个人的工程经验是固定阈值的可控性最好。调好一次参数锁定不会再乱跳。2.4 图像显示与数据流怎么组织处理完的图像一定要在界面上实时显示否则现场根本没法调试。前面板上放一个Image控件用IMAQ WindDraw或者直接把Image控件连接到显示VI即可。显示用的图像Buffer和算法处理用的Buffer分开管理两个循环并行的结构能有效避免界面刷新拖慢算法节拍。更讲究一点的写法是把采集循环和处理循环分开中间用队列或Notifier传递图像引用。采集循环只负责抓帧把图像引用入队处理循环从队列取出图像做算法算完结果再走串口或者写入UI。这就是典型的生产者消费者模式视频跟踪这种对实时性有要求、单帧处理又比较重的项目强烈建议用这种结构。热词里有人问labview数据缓存一段时间如何实现在跟踪场景里确实常见。你如果需要保留最近100帧的质心坐标用来画轨迹或做分析就定义一个环形队列数组每帧入队、队满覆盖最旧的同时显示在波形图上。这种写法做跟踪轨迹回放很方便代码也不复杂。3. 案例实操做一个能实时输出目标坐标的跟踪器3.1 案例目标与整体流程我以传送带视觉跟踪为背景把完整流程走一遍。场景是这样USB工业相机垂直安装在传送带上方传送带表面是浅灰色目标是一个深色小工件。程序要实时计算工件在画面里的质心坐标并把坐标显示在前面板。如果后续接运动控制这个坐标就是位置环的输入。整体流程用文字描述就是初始化相机-循环抓帧-裁剪ROI-提取红色或灰度通道-阈值分割-形态学处理-粒子分析-输出质心坐标。每一步对应一个明确的函数调用整个程序用状态机或者顺序结构搭起来都可以。我建议用状态机后面加功能比如切换模板匹配模式会方便很多。3.2 相机初始化与采集循环搭建打开LabVIEW新建一个VI前面板放上Image控件、两个数值显示控件分别显示X和Y坐标、一个停止按钮。程序框图按这个顺序搭用IMAQ Create创建两个图像缓存一个叫DisplayImage用于显示一个叫ProcImage用于算法处理。建议放在While循环外面创建循环里反复复用程序结束时释放。用IMAQdx Open Camera打开相机在前面板设置相机名称字符串。相机名称可以从MAX里看到一般是cam0这种格式。配置Grab模式IMAQdx Configure Grab。进入While循环循环里第一件事调用IMAQdx Grab把最新一帧图像拿到DisplayImage里。在循环里做图像处理后面的小节展开。循环结束后IMAQdx Close Camera然后IMAQ Dispose释放图像Buffer。这段流程里最容易犯的错误是忘记释放图像Buffer。LabVIEW有垃圾回收机制但图像Buffer是外部资源每帧都New一个Image对象而不释放程序跑几分钟内存占用就会持续涨。我见过现场程序跑一个晚上之后内存占用好几个GB就是这个问题引起的。所以Create在外面统一创建循环里复用最后Dispose这条规矩一定要记住。3.3 目标分割从彩色到二值掩膜假设目标是深色工件背景是浅色传送带那么像素亮度上目标比背景暗很多。第一步先裁剪ROI。我习惯在画面中央画一个矩形ROI把传送带区域框起来用IMAQ Set ROI配合IMAQ Create从原图上裁出子图像。这样做最大的好处是忽略掉视野边缘的杂散物体同时算法处理的像素数量大幅减少每一帧能省下不少时间。还有一个隐藏好处ROI之外的干扰光源、人手影子不会参与计算分割稳定性更好。第二步转灰度。用IMAQ ExtractSingleColorPlane提取绿色通道或者直接灰度转换目的是把三通道的彩色图像变成单通道灰度图。选择绿色通道的原因是多数工业相机的绿色通道感光响应较好噪点相对少一些。第三步阈值分割。IMAQ Threshold函数把灰度值落在我们设定的区间内的像素置为白色255区间外的置为黑色0。对于深色目标我一般先设0到100试试打开前面板的Image控件看二值图预览如果目标区域显示为白色、背景是黑色说明阈值区间合适。如果背景也变成了白色说明上限太高把上限往下调如果目标主体没变白说明下限太低往上提。这里有个边界情况要注意环境亮度变化比较大的场景单一固定阈值会很痛苦。我采取的方法是固定曝光参数保证亮度稳定之后再调阈值这样一组参数能用很久。实在不能稳定光照再考虑自动阈值或者用阈值范围粒子面积筛选组合拳来扛干扰。3.4 形态学处理把碎片噪点清干净阈值分割之后的二值图往往不干净目标周围会有细小碎块目标内部可能有小空洞。直接拿这种图像去做粒子分析计算出来的质心是偏的。形态学处理就是干这个活的。LabVIEW里对应的函数是IMAQ Morphology运算类型可以选Erode、Dilate、Open、Close等。关键参数是结构元素的大小和运算次数。我通常先做一次开运算也就是先腐蚀再膨胀。开运算的效果是去掉二值图里的白色小噪点和小碎块同时保持目标主体的大小和形状基本不变。原理很好理解腐蚀操作会把所有白色区域缩小一圈那些只有几个像素的小噪点直接缩没了然后膨胀操作再把剩下的大目标恢复回原来的尺寸。这招对付椒盐噪声和阈值边缘的杂散小点特别有效。如果目标内部有细小黑色空洞就换成闭运算先膨胀再腐蚀把空洞填上。结构元素选3×3方形就可以最多用到5×5。运算次数我一般不超过3次。这里有个明显的经验点形态学处理参数不能拍脑袋设大处理过头了会把两个挨得很近的目标连成一个粒子分析的时候误判成一个超大的目标完全扭曲结果。形态学处理之后二值图里应该只剩下一块或几块白色区域这就代表画面里的目标。这时候再做粒子分析数据就会干净很多。3.5 粒子分析与质心坐标输出粒子分析是这套流程里最出结果的一步。用IMAQ Particle Analysis这个函数它会自动对二值图里的每一个白色连通区域做统计报告出质心坐标Center of Mass X/Y、面积Area、外接矩形Bounding Rect等物理量。前面板显示控件接上质心X和质心Y就能看到目标在图像里的像素坐标。如果你需要的是相对视野中心的偏移量可以再减一个常量图像中心X画面宽度/2图像中心Y画面高度/2。这个偏移量才是真正适合发给PLC的位置偏差。粒子分析函数还可以设置筛选条件。我强烈建议启用面积筛选比如Minimum Area设为200像素这样小于200像素的白色碎片直接被丢弃不会被当成目标。如果画面里同时出现了多个目标粒子分析会返回一个数组可以按面积排序取最大的那个也可以设一个面积范围只锁定某个目标。这一步灵活度很高是处理复杂场景的主要手段。输出坐标之后如果想做物理坐标换算就需要标定。简化做法是把相机架好后把一个已知尺寸的标定物放进视野量一下它在图像里所占的像素数算出像素当量像素当量 实际物理尺寸 / 像素数。比如一个50毫米的工件在图像里占250个像素那么每个像素就是0.2毫米。之后任何一个质心坐标乘上这个当量就是实际的物理坐标。这个办法虽然粗糙但在精度要求不高毫米级、相机固定不动的项目里非常实用。3.6 进阶模板匹配跟踪怎么配置阈值分割加粒子分析能解决大部分颜色对比明显的场景但有些目标纹理复杂、又不能用颜色区分就得用模板匹配了。LabVIEW里做模板匹配分两步。第一步是创建模板用IMAQ Create Template直接在当前画面里框选一块目标区域存为模板。第二步是在后续每一帧图像上调用IMAQ Match Pattern函数会在画面里搜索与模板相似的区域返回匹配位置和分数。参数上重点看几个匹配分数阈值默认是700总范围0到1000设得太低会误匹配设得太高可能找不到目标搜索策略里的金字塔层数决定匹配过程的加速程度层数越高计算越快但匹配精度会有损失一般从0到2之间调如果目标会在画面里旋转还要启用旋转角度范围代价是匹配时间明显增加。模板匹配对光照变化比较敏感同一模板在亮环境和暗环境下的匹配分数会差很多。实际项目里要么保证光照稳定要么多准备几个不同亮度的模板轮换匹配。还有一种做法是把每帧图像先做归一化或者直方图均衡化再匹配NI视觉库里也有对应函数但会增加处理时间需要测试。到最后你会发现模板匹配和阈值分割其实不是二选一的关系。有些复杂项目我是先用粒子分析粗定位目标位置然后在这个小范围内做模板匹配精确定位两步结合起来速度和精度都照顾到了。4. 视频跟踪常见问题与排查经验4.1 相机打不开、驱动报错怎么处理这个问题在项目刚开始的时候最磨人。常见的现象是LabVIEW调用IMAQdx Open Camera时报错提示设备找不到或者驱动错误。先检查硬件链路USB线是不是插在USB3.0口上工业相机一般对USB口类型敏感。然后是驱动确认NI-IMAQdx安装成功然后在MAX里看设备是否枚举出来。MAX里能看到相机并且能预览画面LabVIEW里报错多半是相机被其他程序占用了把别的软件关掉再试。如果MAX里也看不到设备重新插拔USB线换一个USB口再不行就重装驱动。这一套流程能解决九成以上的相机打开问题。4.2 画面卡顿、帧率上不去帧率上不去的核心瓶颈通常有两个算法处理太慢或者图像显示拖了后腿。算法慢就优化图像尺寸降低分辨率、缩小ROI、把算法从彩色处理改成灰度处理。有一个很实际的测试方法把处理函数单独放出来记录单帧耗时如果单帧处理时间超过帧间隔就必须优化。显示端也别忽视Image控件的自动缩放、灰度图像直接显示成彩色模式都会额外消耗CPU。另外关闭相机自动曝光也能减少动态计算开销。如果优化完还是卡就按前面提到的生产者消费者模式把采集和处理分开采集循环全速抓帧处理循环按实际能力消化中间用队列缓冲避免互相拖累。4.3 目标丢失、分割不稳定目标偶尔丢一帧或者分割出来的区域忽大忽小这是视频跟踪最常见的现象。最常见的机制是光照变化。车间里有人走过挡住顶灯、窗外太阳光移动画面亮度就会改变。应对办法固定曝光参数是第一步然后检查阈值区间是否合适上下限留多少余量。我做项目时喜欢把二值图实时显示出来一旦目标有丢失趋势肉眼看二值图就能快速定位是阈值区间偏了还是背景干扰进来了。还有一种情况是目标本身运动太快产生了运动模糊轮廓变得模糊之后分割就不稳定。这时候可以缩短相机的曝光时间快门速度比如从20毫秒调到2毫秒运动物体的边缘会清晰很多。代价是画面变暗需要配合更强的光源。4.4 内存持续增长程序跑着跑着内存越来越大这是视频跟踪项目后期优化最容易忽略的点。归根结底是图像Buffer管理不当循环里每帧都创建新的图像对象创建得比释放得快内存占用就一路涨上去。检查方法很简单在前面板放一个系统内存监视控件或者用Windows任务管理器看进程内存如果每秒都稳定上升基本就是图像Buffer泄漏。解决办法是像3.2节说的那样把IMAQ Create放在循环外循环内反复复用同一个Buffer程序退出前用IMAQ Dispose清理。这类问题我几乎在每个接手调试的LabVIEW视觉项目里都能遇见属于典型但好解决的坑。4.5 质心坐标抖动、输出不平滑质心坐标每个像素级别的抖动其实很正常因为分割边缘的毛刺、噪点都会影响质心计算。但如果抖动已经影响到下游设备动作就要做平滑处理。常用的办法是滑动平均滤波保存最近N帧的质心坐标输出它们的平均值。N取5到10比较合适太大反应变慢太小起不到平滑效果。如果你用的是LabVIEW的波形图显示可以配合历史数据缓冲区画一条轨迹曲线而不是只看跳动的数字。这样既直观又能看出目标运动趋势是否稳定。我还遇到过一种情况坐标抖动是因为粒子分析把多个碎片分别当成目标质心在几个区域之间乱跳。这种就要回到粒子筛选上调小阈值上限或增加面积约束确保只锁定主目标。4.6 排查速查表现象可能原因优先排查动作相机打不开驱动缺失、设备被占用、USB口异常MAX里确认设备、换口重新插拔画面卡顿算法耗时过长、显示拖慢测单帧耗时、缩小ROI、降低分辨率目标丢失光照变化、阈值不准、运动模糊固定曝光、实时显示二值图、缩短曝光时间内存上涨图像Buffer创建未释放Create移出循环、退出时Dispose坐标抖动边缘毛刺、碎片误判滑动平均滤波、加强面积筛选分割成块形态学参数过大、目标粘连减小结构元素尺寸、降低运算次数结尾几点个人体会项目做下来我最深的一个体会是视频跟踪的难点往往不在算法而在工程的稳定性。一套阈值分割粒子分析的方案只要光照控制好、参数调得当就足够稳过一个完整的生产班次。反倒是那些一上来就想着堆高级算法的项目往往在参数调试上耗费大量时间最后还不一定比简单方案可靠。所以我的建议是刚入手LabVIEW视频跟踪的朋友先别急着做模板匹配或者光流法老老实实把一个采集-预处理-分割-粒子分析流程跑通。每一帧图像都把中间结果打印或显示出来调参时对照着看很快就能建立手感。另外项目调试时录一段视频存下来迭代算法的时候反复回放对比比对着实时画面改代码高效得多。最后一个小技巧给程序加一个保存原始帧处理结果的DEBUG开关用热词里大家常问的TDMS或Excel记录功能把质心坐标日志存下来。现场出了问题打开日志回放一遍数据大部分问题都能直接定位。这个习惯帮我省了好几个通宵的排障时间分享给你们。
返回列表