warps = 5;
epsilon = 0.01;
iterations = 300;
+ scaleStep = 0.8;
useInitialFlow = false;
}
// create the scales
for (int s = 1; s < nscales; ++s)
{
- gpu::pyrDown(I0s[s - 1], I0s[s]);
- gpu::pyrDown(I1s[s - 1], I1s[s]);
+ gpu::resize(I0s[s-1], I0s[s], Size(), scaleStep, scaleStep);
+ gpu::resize(I1s[s-1], I1s[s], Size(), scaleStep, scaleStep);
if (I0s[s].cols < 16 || I0s[s].rows < 16)
{
if (useInitialFlow)
{
- gpu::pyrDown(u1s[s - 1], u1s[s]);
- gpu::pyrDown(u2s[s - 1], u2s[s]);
+ gpu::resize(u1s[s-1], u1s[s], Size(), scaleStep, scaleStep);
+ gpu::resize(u2s[s-1], u2s[s], Size(), scaleStep, scaleStep);
- gpu::multiply(u1s[s], Scalar::all(0.5), u1s[s]);
- gpu::multiply(u2s[s], Scalar::all(0.5), u2s[s]);
+ gpu::multiply(u1s[s], Scalar::all(scaleStep), u1s[s]);
+ gpu::multiply(u2s[s], Scalar::all(scaleStep), u2s[s]);
}
else
{
gpu::resize(u2s[s], u2s[s - 1], I0s[s - 1].size());
// scale the optical flow with the appropriate zoom factor
- gpu::multiply(u1s[s - 1], Scalar::all(2), u1s[s - 1]);
- gpu::multiply(u2s[s - 1], Scalar::all(2), u2s[s - 1]);
+ gpu::multiply(u1s[s - 1], Scalar::all(1/scaleStep), u1s[s - 1]);
+ gpu::multiply(u2s[s - 1], Scalar::all(1/scaleStep), u2s[s - 1]);
}
}
d_alg(loadMat(frame0, useRoi), loadMat(frame1, useRoi), d_flowx, d_flowy);
cv::Ptr<cv::DenseOpticalFlow> alg = cv::createOptFlow_DualTVL1();
+ alg->set("medianFiltering", 1);
+ alg->set("innerIterations", 1);
+ alg->set("outerIterations", d_alg.iterations);
cv::Mat flow;
alg->calc(frame0, frame1, flow);
cv::Mat gold[2];
cv::split(flow, gold);
- EXPECT_MAT_SIMILAR(gold[0], d_flowx, 3e-3);
- EXPECT_MAT_SIMILAR(gold[1], d_flowy, 3e-3);
+ EXPECT_MAT_SIMILAR(gold[0], d_flowx, 4e-3);
+ EXPECT_MAT_SIMILAR(gold[1], d_flowy, 4e-3);
}
INSTANTIATE_TEST_CASE_P(GPU_Video, OpticalFlowDual_TVL1, testing::Combine(