мне нужно создать 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 другое не гладкое (мерцание). В чем проблема с кодом? Что мне нужно сделать, чтобы получить правильные промежуточные рамки? ?
интерполяция между кадрами является активной темой исследования и получить хорошие результаты очень трудно, особенно на границах движения/объекта. В любом случае, ваши вопросы подразумевают, что вы сталкиваетесь с проблемами ранее. Если я правильно понимаю ваш алгоритм, вы «перемещаете» пиксели первого изображения вдоль векторов движения. Это верно? Что вы подразумеваете под «негладкой»? Какие части промежуточных кадров не дают правильного результата? –
@ user_12 вы можете дать образцы изображений? мы могли бы лучше понять, что не так с промежуточными кадрами. – AruniRC
Я добавил свою программу в компилируемой форме – Deepak