【问题标题】: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。但它有同样的问题。适用于更高分辨率的视频,但不适用于较小的视频!
  • 这很有趣……

标签: c++ opencv opticalflow


【解决方案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);

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多