Отображение кадров на основе движения

Мне нужно создать 3 промежуточных кадра между двумя кадрами (prevImg, nextImg), я узнал движение каждого пикселя, используя функцию calcOpticalFlowFarneback() в opencv

  calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize,
                           iter, polyn, sigma, method);

затем я создал 3 промежуточных кадра, вызвав функцию createNewFrame() со следующими значениями сдвига (аргумент функции) 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);
}

Но я не получаю правильных промежуточных кадров... переход от одного кадра к другому не плавный (мерцание). В чем проблема в моем коде? Что мне нужно сделать, чтобы получить правильные промежуточные кадры? ?


person Deepak    schedule 22.07.2015    source источник
comment
интерполяция между кадрами является активной темой исследований, и получить хорошие результаты очень сложно, особенно на границах движения/объекта. В любом случае, ваши вопросы подразумевают, что вы сталкиваетесь с проблемами раньше. Если я правильно понимаю ваш алгоритм, вы перемещаете пиксели первого изображения по векторам движения. Это правильно? Что вы имеете в виду под «негладким»? Какие части промежуточных кадров не дают правильного результата?   -  person P.R.    schedule 28.07.2015
comment
@user_12, можешь дать образцы изображений? мы могли бы иметь лучшее представление о том, что не так с промежуточными кадрами.   -  person AruniRC    schedule 29.07.2015
comment
Я добавил свою программу в компилируемой форме   -  person Deepak    schedule 29.07.2015


Ответы (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;
    }
  }
person BConic    schedule 29.07.2015
comment
все еще есть небольшое количество не плавного перехода от одного кадра к другому, что мне нужно сделать, чтобы решить эту проблему.. - person Deepak; 30.07.2015
comment
К сожалению, оптический поток, оцененный с помощью calcOpticalFlowFarneback, не идеален. Вы пытались визуализировать это, установив shift в 1. ? - person BConic; 30.07.2015
comment
Я не пробовал... есть ли другой способ достичь моей цели? - person Deepak; 30.07.2015
comment
есть ли какая-либо другая функция в opencv, которая дает более точные результаты, чем calcOpticalFlowFarneback() - person Deepak; 30.07.2015
comment
Есть несколько других функций для плотного оптического потока (см. документацию OpenCV здесь), вы можете проверить, дает ли один из них более точные результаты. Однако точный плотный оптический поток все еще является активной областью исследований, поэтому, вероятно, ни один из них не даст идеальных результатов... - person BConic; 30.07.2015