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

OpenCV - why Optical Flow does not work with dequeue<Mat>?

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

根据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);
...

但是其中 none 有什么不同。结果原尺寸视频还是没有流量

Lukas Kanade algorithm 有完全相同的问题:

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

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

根据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);