0

我在 C# 中使用 openCV 库中的 Lucas Kanade 光流算法;有一系列帧,我想在每两个帧中找出什么是光流并将其显示在图片框中。

我可以从以下函数中获取 velX 和 velY:

Emgu.CV.OpticalFlow.LK(imGrayCurrent, imGrayNext, windSize, velX, velY);

现在,我应该如何使用这两个来显示两个帧之间的流?或者换句话说,我应该如何获得像素的位移?

肿瘤坏死因子

4

1 回答 1

1

一种常见的方法是使用 HSV 到 RGB 的转换,请参阅Middlebury Flow Dataset。所以:

  1. 将运动向量转换为极坐标:

    长度 = sqrt(velx² + vely²)

    angle = acos(vely / length) [注意额外检查例如无穷大]

  2. 将角度归一化为 [0,360](对于 OpenCV,或 [0,1],具体取决于您稍后使用的函数)并将长度归一化为 [0,1]。创建一个 hsv 空间(具有第一个通道 H(色调)、第二个通道 S(饱和度)和第三个通道 V(值)的 3 通道图像)并设置:H = 角度、S = 长度和 V = 1。

  3. 将 HSV 颜色空间转换为 RGB,例如使用 cv::cvtColor(hsv, rgb, HSV2BGR);

生成的图像现在显示运动矢量场 (velx,vely),其中颜色决定运动的方向,饱和度决定运动的长度或速度。

于 2013-02-10T21:24:12.197 回答