Optical Flow光流函数计算速度
OpticalFlow光流函数计算速度视频号
OpticalFlow光流函数计算速度B站
通过机器视觉图像处理的方法,也是可以估计速度的。虽然没有交警测试仪那么准确,但是也是可以得到一个大概的速度。我们在高速上看到路边摆着的那种带摄像头还有数显的测速装备(通常只显示100KM的时速或以下,绿色没超速,红色超速),大概也是基于图像处理的方式,连续抓取两幅图像,通过目标在两幅图像中的位移以及两幅图像的时间差来计算速度的:V=D/T。
在NI视觉中,官方提供了一组运动估计的函数,通过光流函数可以计算出流动目标的大概的运动方向的速度。
NI视觉的运动估计
其中光流(HS)、光流(LK)是用于计算目标的速度流信息,配合后面的覆盖运动矢量函数,可以将估计的运动方向的速度大小以覆盖箭头的方式表现在图像上,但是些算法,并没有直接输出速度数据。光流(LKP)函数则是基于金字塔的Lucas和Kanade算法计算两幅连续图像之间的一组特征点的位置变化,示例中没有返回位置数据,但是函数本身是有Distance距离返回的,可以创建显示控件得到两幅图像之间的特征点的距离变化D,然后再根据两幅图像的时间差T,根据公式V=D/T就可以计算出特征点的速度V了。但是这种方法需要图像中有固定的目标特征点,很多时候并不好满足。
基于光流(LKP)的距离计算
基于光流(HS)或光流(LK)的速度估计
使用基于光流(HS)或光流(LK)函数的速度估计,则看起来要更容易估计常规流体的运动速度,但是这两个函数均没有距离或速度相关的数据输出。这个是NI对自己的算法没信息,还是保守不给用户使用数据啊?都可以覆盖矢量了,有方向有大小,为什么不返回数据呢?
在基于光流(HS)或光流(LK)的光流范例基础上,修改了一下,应该也可以大概的计算一下速度。上面的基于光流(HS)或光流(LK)的速度估计中,不是有覆盖矢量图了吗?那么使用复制覆盖函数,将这些覆盖复制到一幅纯黑或纯白的背景图像上,然后再去计算这些覆盖矢量的特征,应该就可以估算出运动方向和速度大小了:
OpticalFlow光流覆盖矢量提取估计速度.vi程序框图
OpticalFlow光流覆盖矢量提取估计速度.vi前面板效果图
在Optica Flow基础上,增加了一个复制覆盖的功能,将其速度信息的覆盖复制到另一个纯色背景图像上,这样方便去分析覆盖的矢量箭头。利用箭头特征的长短、方向,使用粒子分析等函数,应该可以简单的计算出速度信息,当然就算能计算,那也只是一个相对值,精度不会太高就是了。因为他本身计算出来的速度矢量就不会太精准,还因为覆盖的矢量也只量I32类型的整数类型。之后再使用粒子分析等函数时,会再次丢失一些精度。整体精度不会很高就是了。不过应该可以大概的估计出一个速度。如果是左右流动的方向,那么可以考虑计算一下所有矢量的平均值,这样相对来说可能更准确一些。