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,
问题在于 current
和 prev
指向同一帧。
已通过在帧队列中使用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>?的主要内容,如果未能解决你的问题,请参考以下文章
详解OpenCV中的Lucas Kanade稀疏光流单应追踪器