我在 C# 中使用 openCV 库中的 Lucas Kanade 光流算法;有一系列帧,我想在每两个帧中找出什么是光流并将其显示在图片框中。
我可以从以下函数中获取 velX 和 velY:
Emgu.CV.OpticalFlow.LK(imGrayCurrent, imGrayNext, windSize, velX, velY);
现在,我应该如何使用这两个来显示两个帧之间的流?或者换句话说,我应该如何获得像素的位移?
肿瘤坏死因子
我在 C# 中使用 openCV 库中的 Lucas Kanade 光流算法;有一系列帧,我想在每两个帧中找出什么是光流并将其显示在图片框中。
我可以从以下函数中获取 velX 和 velY:
Emgu.CV.OpticalFlow.LK(imGrayCurrent, imGrayNext, windSize, velX, velY);
现在,我应该如何使用这两个来显示两个帧之间的流?或者换句话说,我应该如何获得像素的位移?
肿瘤坏死因子
一种常见的方法是使用 HSV 到 RGB 的转换,请参阅Middlebury Flow Dataset。所以:
将运动向量转换为极坐标:
长度 = sqrt(velx² + vely²)
angle = acos(vely / length) [注意额外检查例如无穷大]
将角度归一化为 [0,360](对于 OpenCV,或 [0,1],具体取决于您稍后使用的函数)并将长度归一化为 [0,1]。创建一个 hsv 空间(具有第一个通道 H(色调)、第二个通道 S(饱和度)和第三个通道 V(值)的 3 通道图像)并设置:H = 角度、S = 长度和 V = 1。
将 HSV 颜色空间转换为 RGB,例如使用 cv::cvtColor(hsv, rgb, HSV2BGR);
生成的图像现在显示运动矢量场 (velx,vely),其中颜色决定运动的方向,饱和度决定运动的长度或速度。