Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 基于运动的帧映射_Opencv_Image Processing_Computer Vision_Motion_Opticalflow - Fatal编程技术网

Opencv 基于运动的帧映射

Opencv 基于运动的帧映射,opencv,image-processing,computer-vision,motion,opticalflow,Opencv,Image Processing,Computer Vision,Motion,Opticalflow,我需要在两帧之间创建3个中间帧(prevImg、nextImg),我已经使用opencv中的calcOpticalFlowFarneback()函数找到了每个像素的运动 calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize, iter, polyn, sigma, method); 然后,我通过调用函数createNewFrame()创建了3个中

我需要在两帧之间创建3个中间帧(prevImg、nextImg),我已经使用
opencv中的
calcOpticalFlowFarneback()
函数找到了每个像素的运动

  calcOpticalFlowFarneback(gray1, gray2, flow, pyrScale, pyrLevel, winSize,
                           iter, polyn, sigma, method);
然后,我通过调用函数createNewFrame()创建了3个中间帧,其shift(func.argument)值分别为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);
}
void createNewFrame(材料与材料、材料与材料、流动、浮动移位、内部与c、材料与上一层、材料与下一层)
{
对于(int y=0;y
但是我没有得到合适的中间帧。。 从一帧到另一帧的过渡是不平滑的(闪烁)。 我的代码中有什么问题?我需要做什么才能得到正确的答案
中间框架

我认为你应该乘以你的变量
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;
    }
  }
for(int y=0;y
帧间插值是一个活跃的研究课题,要获得好的结果非常困难,特别是在运动/对象边界上。不管怎样,你的问题意味着你在更早地遇到问题。如果我正确理解了您的算法,那么您正在沿运动向量“移动”第一幅图像的像素。对吗?“非平滑”是什么意思?中间帧的哪些部分没有给出正确的结果?@user_12您能给出示例图像吗?我们也许能够更好地了解中间帧的错误。我已经以可编译的形式添加了我的程序,但从一个帧到另一个帧仍有少量的非平滑过渡,我需要做些什么来解决这个问题。不幸的是,calcOpticalFlowFarneback估计的光流并不完美。您是否尝试通过将
shift
设置为
1.
来可视化它?我没有尝试。。。是否有其他方法可以实现我的目标?opencv中是否有其他函数比calcOpticalFlowFarneback()提供更精确的结果?还有其他一些用于密集光流的函数(请参见opencv文档),您可以检查其中一个是否提供更精确的结果。然而,精确的稠密光流仍然是一个活跃的研究领域,因此很可能它们都不会给出完美的结果。。。