1

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

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

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

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

+0

интерполяция между кадрами является активной темой исследования и получить хорошие результаты очень трудно, особенно на границах движения/объекта. В любом случае, ваши вопросы подразумевают, что вы сталкиваетесь с проблемами ранее. Если я правильно понимаю ваш алгоритм, вы «перемещаете» пиксели первого изображения вдоль векторов движения. Это верно? Что вы подразумеваете под «негладкой»? Какие части промежуточных кадров не дают правильного результата? –

+0

@ user_12 вы можете дать образцы изображений? мы могли бы лучше понять, что не так с промежуточными кадрами. – AruniRC

+0

Я добавил свою программу в компилируемой форме – Deepak

ответ

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; 
    } 
    } 
+1

ohh yess ........ – Deepak

+0

все еще есть небольшое количество неглазурного перехода от одного кадра к другому, что мне нужно сделать, чтобы решить это. – Deepak

+0

К сожалению, оптический поток, оцененный calcOpticalFlowFarneback, не является совершенным. Вы пытались визуализировать его, установив 'shift' в' 1.'? – AldurDisciple

 Смежные вопросы

  • Нет связанных вопросов^_^