OpenCV - 为啥光流不适用于 dequeue<Mat>?

Posted

技术标签:

【中文标题】OpenCV - 为啥光流不适用于 dequeue<Mat>?【英文标题】:OpenCV - why Optical Flow does not work with dequeue<Mat>?OpenCV - 为什么光流不适用于 dequeue<Mat>? 【发布时间】:2020-03-06 20:16:39 【问题描述】:

我正在尝试在某些视频上使用光流。但是当我不调整视频大小时,它根本不起作用。

根据documentation我设置的参数为:

calcOpticalFlowFarneback(prevgray, current, flow, 0.5, 1, 10, 2, 5, 1.1, 0);

如果视频按比例缩小或放大,它可以正常工作:

但如果要保持视频的原始大小,它根本不起作用:

我试过改变函数的参数:

calcOpticalFlowFarneback(prevgray, current, flow, 0.5, 1, 4, 2, 3, 1.1, 0);
//or
calcOpticalFlowFarneback(prevgray, current, flow, 0.5, 1, 50, 2, 5, 1.2, 0);
//or
calcOpticalFlowFarneback(prevgray, current, flow, 0.5, 1, 100, 20, 7, 1.2, 0);
...

但它们都没有任何区别。原始尺寸视频的结果仍然没有流量。

Lukas Kanade algorithm 也有同样的问题:

当我将720 x 480 或其他高分辨率视频缩小到一半大小 (360 x 240) 时,光流算法仍然可以正常工作。但是无论我如何设置参数,它们都不适用于没有缩放(原始尺寸)的视频。

如何在不调整视频大小的情况下使光流适用于视频?

【问题讨论】:

你试过 calcOpticalFlowPyrLK 吗?我建议你查看 OpenCV 4.2.0 的文档:docs.opencv.org/4.2.0/dc/d6b/… 您可以在处理之前使工作视频帧调整大小(320,240)吗?因为我尝试了这些尺寸并且效果很好。 @YunusTemurlenk 你是对的。我将它们缩放到一半大小并且仍然有效。看来,如果视频的原始尺寸很大,它可以工作,否则它不会。 @Ali 我试过calcOpticalFlowPyrLK。但它有同样的问题。适用于更高分辨率的视频,但不适用于较小的视频! 这很有趣…… 【参考方案1】:

根据this post, 问题在于 currentprev 指向同一帧。

已通过在帧队列中使用frame.clone() 而不是frame 修复。

deque<Mat> frames;
...
frames.push_back(frame.clone());
...
current = frame;
prev = frames[frames.size() - 5];
...
calcOpticalFlowFarneback(prevgray, current, flow, 0.5, 1, 10, 2, 5, 1.1, 0);

【讨论】:

以上是关于OpenCV - 为啥光流不适用于 dequeue<Mat>?的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 的 OpenCV 光流

运动目标检测——光流法与opencv代码实现

详解OpenCV中的Lucas Kanade稀疏光流单应追踪器

如何在openCV python中将背景减法与密集光流跟踪相结合

OpenCV4中DIS光流算法与应用

OpenCV中的光流及视频特征点追踪