1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-31 00:03:03 +04:00

Fix Farneback Optical Flow Algorithm

- Before this PR, following tests failed on some platform.
  CUDA_OptFlow/FarnebackOpticalFlow.Accuracy/19
  CUDA_OptFlow/FarnebackOpticalFlow.Accuracy/23

- The algorithm now recognizes the OPTFLOW_USE_INITIAL_FLOW flag.
  Previously, when the flag was set, it did not use the flow data
  passed as input, instead used some garbage data in memory.

- More strict test limit.
This commit is contained in:
Namgoo Lee
2019-01-11 04:00:08 +00:00
parent 054bd23a43
commit 4366c8734f
3 changed files with 49 additions and 14 deletions
+22 -7
View File
@@ -165,10 +165,29 @@ namespace
{
const GpuMat frame0 = _frame0.getGpuMat();
const GpuMat frame1 = _frame1.getGpuMat();
GpuMat flow = _flow.getGpuMat();
BufferPool pool(stream);
GpuMat flowx = pool.getBuffer(frame0.size(), CV_32FC1);
GpuMat flowy = pool.getBuffer(frame0.size(), CV_32FC1);
CV_Assert(frame0.channels() == 1 && frame1.channels() == 1);
CV_Assert(frame0.size() == frame1.size());
GpuMat flowx, flowy;
// If flag is set, check for integrity; if not set, allocate memory space
if (flags_ & OPTFLOW_USE_INITIAL_FLOW)
{
CV_Assert(flow.size() == frame0.size() && flow.channels() == 2 &&
flow.depth() == CV_32F);
std::vector<cuda::GpuMat> _flows(2);
cuda::split(flow, _flows, stream);
flowx = _flows[0];
flowy = _flows[1];
}
else
{
flowx.create(frame0.size(), CV_32FC1);
flowy.create(frame0.size(), CV_32FC1);
}
calcImpl(frame0, frame1, flowx, flowy, stream);
@@ -291,8 +310,6 @@ namespace
void FarnebackOpticalFlowImpl::calcImpl(const GpuMat &frame0, const GpuMat &frame1, GpuMat &flowx, GpuMat &flowy, Stream &stream)
{
CV_Assert(frame0.channels() == 1 && frame1.channels() == 1);
CV_Assert(frame0.size() == frame1.size());
CV_Assert(polyN_ == 5 || polyN_ == 7);
CV_Assert(!fastPyramids_ || std::abs(pyrScale_ - 0.5) < 1e-6);
@@ -303,8 +320,6 @@ namespace
Size size = frame0.size();
GpuMat prevFlowX, prevFlowY, curFlowX, curFlowY;
flowx.create(size, CV_32F);
flowy.create(size, CV_32F);
GpuMat flowx0 = flowx;
GpuMat flowy0 = flowy;