基于 OpenCV 图像的光流场

Posted

技术标签:

【中文标题】基于 OpenCV 图像的光流场【英文标题】:OpenCV image-based optical flow field 【发布时间】:2013-10-24 06:38:11 【问题描述】:

我正在寻找一种简单的算法来检测整个输入的光流。 在 OpenCV 中,Lucas-Kanade 点跟踪功能非常好,但是对于超过少数几个点来说它非常慢。我正在寻找基于图像的结果,而不是基于点的结果。我能找到的唯一信息是关于 LK 跟踪的信息。

我可以根据简单的帧差计算运动的幅度,但我也想知道方向。我基本上想得到一个光流场纹理,我可以将其输入到 gpu 流体模拟中。

必须有一些基于基本运动检测器或其他东西的简单算法。类似于帧差分、缩放和模糊与 3 个连续帧的组合。

为了非常清楚,我不想要有关 Lucas-Kanade 方法的信息。

【问题讨论】:

Horn-Schunck 方法怎么样? 我是在 C++ 中使用来自here 的 calcOpticalFlowFarneback 完成的。在可视化过程中使用 cv::split 和 cv::merge 操作 HSV 平面和 cv::Mat.convertTo。 【参考方案1】:

OpenCV 有一个 BackgroundSubtractor 类可以进行帧差分,我想你必须自己做模糊部分。然而,这并不是严格意义上的光流计算。

Farneback 有一种用于密集光流的方法,在 OpenCV 中通过cv::calcOpticalFlowFarneback(..) 方法实现。它将生成具有大小和方向分量的矩阵“流”。 Horn-Schunck 方法不是 OpenCV 的内置方法。

PS:Lukas Kanade 不是很慢。可能是特征点的提取速度很慢。尝试使用 cv::FAST 检测器。

【讨论】:

以上是关于基于 OpenCV 图像的光流场的主要内容,如果未能解决你的问题,请参考以下文章

如何将光流场(浮点数)映射到像素数据(字符)以进行图像变形?

使用 OpenCV 在图像上生成光流

图像处理openCV光流法追踪运动物体

如何在opencv中使用光流跟踪来分割图像?

如何使用opencv实现金字塔光流lk跟踪算法

使用 python 的 OpenCV 光流