基于运动的映射帧
Mapping frames based on motion
我需要在两帧(prevImg、nextImg)之间创建 3 个中间帧,我已经使用 opencv
中的 calcOpticalFlowFarneback()
函数找到了每个像素的运动
calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize,
iter, polyn, sigma, method);
然后我通过调用函数 createNewFrame() 创建了 3 个中间帧,其偏移(函数参数)值为 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);
}
但是我没有得到正确的中间帧..
从一帧到另一帧的过渡不平滑(闪烁)。
我的代码有什么问题?我需要做些什么才能得到正确的
中间帧? ?
我认为你应该乘以你的变量 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;
}
}
我需要在两帧(prevImg、nextImg)之间创建 3 个中间帧,我已经使用 opencv
calcOpticalFlowFarneback()
函数找到了每个像素的运动
calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize,
iter, polyn, sigma, method);
然后我通过调用函数 createNewFrame() 创建了 3 个中间帧,其偏移(函数参数)值为 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);
}
但是我没有得到正确的中间帧.. 从一帧到另一帧的过渡不平滑(闪烁)。 我的代码有什么问题?我需要做些什么才能得到正确的 中间帧? ?
我认为你应该乘以你的变量 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;
}
}