【问题标题】:OpenCV warping image based on calcOpticalFlowFarneback基于 calcOpticalFlowFarneback 的 OpenCV 翘曲图像
【发布时间】:2013-07-01 19:51:26
【问题描述】:

我正在尝试使用密集光流对图像进行复杂的扭曲。我正在尝试将第二张图片变形为与第一张图片大致相同的形状。

cv::Mat flow;
cv::calcOpticalFlowFarneback( mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0 );

cv::Mat newFrame = cv::Mat::zeros( frame.rows, frame.cols, frame.type() );
cv:remap( frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR );

我从两个灰度帧计算流量。我现在正在尝试使用 cv::remap 函数使用此流信息重新映射我的原始(即非灰度)图像。但是,我从中得到了一个非常严重扭曲的图像。我最终得到的只是一张橙色和黑色的图像,与我的原始图像有点相似。

如何将cv::remap 与计算出的flow 一起使用?

【问题讨论】:

  • 您好,我看到了这篇文章,我也遇到了大致相同的问题(确切地说是相同的问题),我想知道您是否找到了解决方法? (我知道这篇文章很旧,对此我很抱歉,但我没有及时找到任何回复 :o)非常感谢!
  • @RaphaelSchimchowitsch:可能最好开始您自己的问题。如果我什至还有我编写的代码来执行此操作,我就不会……虽然我确实得到了一些工作。现在确定它是否与光流有关......
  • 啊哈,好的,我已经发布了我自己的问题,但我发现了这篇文章,所以我想知道你是否可以帮助我:) 但是好的^^非常感谢你的回复:)

标签: c++ opencv opticalflow image-stabilization


【解决方案1】:

remap 函数不能直接与flow 一起使用。必须使用一个单独的map,该map 是通过获取反向流(从frame2frame1)然后偏移每个流向量按其在像素网格上的(x, y) 位置计算的。请参阅下面的详细信息。

回忆一下反向光流公式:

frame1(x, y) = frame2(x + flowx(x, y), y + flowy(x, y))

remap 函数使用指定的map 转换源图像:

dst(x, y) = src(mapx(x, y), mapy(x, y))

比较以上两个等式,我们可以确定remap 需要的map

mapx(x, y) = x + flowx(x, y)
mapy(x, y) = y + flowy(x, y)

例子:

Mat flow; // backward flow
calcOpticalFlowFarneback(nextFrame, prevFrame, flow);

Mat map(flow.size(), CV_32FC2);
for (int y = 0; y < map.rows; ++y)
{
    for (int x = 0; x < map.cols; ++x)
    {
        Point2f f = flow.at<Point2f>(y, x);
        map.at<Point2f>(y, x) = Point2f(x + f.x, y + f.y);
    }
}

Mat newFrame;
remap(prevFrame, newFrame, map);

【讨论】:

  • 太棒了,这解释了很多。不幸的是,流程不包含我认为它返回绘图板的数据,并且可能很快就会出现另一个问题!谢谢!
  • 注意使用反向流,即从nextFrameprevFrame。这是必需的,因为流向量是针对源像素(“这是哪里来的”)给出的,而我们对目标像素感兴趣(“这是从哪里来的”)。
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 2019-09-28
  • 1970-01-01
  • 2013-09-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
相关资源
最近更新 更多