根据动作

时间:2015-07-22 16:51:30

标签: opencv image-processing computer-vision motion opticalflow

我需要在两个帧之间创建3个中间帧(prevImg,nextImg),我在calcOpticalFlowFarneback()

中使用opencv函数找到了每个像素的运动
  calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize,
                           iter, polyn, sigma, method);

然后我通过调用函数createNewFrame()创建了3个中间帧,后面的shift(func。参数)值为0.25,0.5,0.75

void createNewFrame(Mat & frame, const Mat & flow, float shift, int & c, Mat & prev, Mat &next)
{
  for (int y = 0; y < mapX.rows; y++)
  {
    for (int x = 0; x < mapX.cols; x++)
    {
      Point2f f = flow.at<Point2f>(y, x);
      mapX.at<float>(y, x) =  x + f.x/shift;
      mapY.at<float>(y, x) =  y + f.y/shift;
    }
  }
  remap(frame, newFrame, mapX, mapY, INTER_LINEAR);
}

但我没有得到适当的中间帧.. 从一帧到另一帧的过渡是非平滑的(闪烁)。 我的代码有什么问题?我需要做些什么才能做到正确 中间帧? ?

1 个答案:

答案 0 :(得分:1)

我认为你应该乘以你的变量shift,而不是除以它。

尝试用以下函数替换函数createNewFrame中的双循环:

  for (int y = 0; y < mapX.rows; y++)
  {
    for (int x = 0; x < mapX.cols; x++)
    {
      Point2f f = flow.at<Point2f>(y, x);
      mapX.at<float>(y, x) =  x + f.x*shift;
      mapY.at<float>(y, x) =  y + f.y*shift;
    }
  }