【问题标题】:Conceptual Interpolation algorithm概念插值算法
【发布时间】:2012-06-06 14:35:46
【问题描述】:

G'早上好-

我正在尝试移动视频上的一些边界框。我正处于一个症结所在。如果我在数据文件上每 15 帧就有一个帧,那么我必须在每个真实帧之间创建 14 帧。由于它是一个工具(实际上是 ffmpeg 插件的一部分),它需要适用于任何间隙大小。

我编写了一个函数,它获取两点之间的距离,以及从起点平滑过渡到终点需要多少帧。理想情况下,此函数将返回一个数组,其中包含从前一帧移动多少像素

例如,如果第 1 帧的 x 为 50,而第 16 帧的 x 为 65,那么我将拥有一个全为 1 的数组,这样每一帧都会在之前的帧中添加一个。到目前为止,这是我所得到的:

int* generateSequence(int difference, int numStep){
  int* sequence = (int*)malloc(sizeof(int*)*numStep);
  int i;
  for(i=0; i<numStep; i++){ 
    sequence[i] = 0;
  }
  while(difference > numStep){
    for(i=0; i<numStep; i++){ 
      sequence[i]++;
    }
    difference -= numStep;
  }

我对这部分很满意,(对于两者之间的距离超过中间帧数的每倍数,它会在每个帧之间添加一个)。

但现在我已经到了需要向某些帧添加一个但不是全部的地步。我所拥有的只是这些陪审团操纵的算法,它们对于产生不同帧距离的工具来说不是很便携......

double delta = difference/numStep;
if(delta >=.05 && delta< .20){
  for(i=0; i<numStep; i+=6){ 
    sequence[i]++;
  }
}

我应该使用模数运算符还是以不同的方式接近它?用看似任意值的硬编码并不适合我。

【问题讨论】:

  • 你这里的问题不是很清楚。当您说“边界框”时,您的意思是您尝试在视频的每一帧上绘制一个矩形,以便该矩形从其起始位置平滑地移动到您的结束位置?
  • 是的。我有一个面部识别程序,每 15 帧输出一次此类框的坐标和框属性,并输出到日志文件。我正在尝试创建一个程序来对此进行插值,以便新的日志文件每帧都具有坐标和属性。我知道我可能没有很好地解释它,我很抱歉我是一个糟糕的沟通者。如果还有什么我可以澄清的,请告诉我。

标签: c algorithm math interpolation


【解决方案1】:

更一般地说,听起来您想要生成“最平滑”的x 整数系列,其总和为y。 (平滑度是系列中元素之间的最小平均距离。)

这可以通过以下算法实现。

given sum and steps
float step = sum/steps
float delta = 0
sequence = []
for x:
    int integerstep = round(step + delta)
    delta += step - integerstep
    sequence.push(round(integerstep))

下面是python的一个示例实现(对不起,不是c人)。

def renderSmoothIntegerSequence(steps, distance):
    step = float(distance)/steps
    delta = 0
    sequence = []
    for _ in xrange(steps):
        integerstep = int(round(step + delta))
        delta += step - integerstep
        sequence.append(integerstep)
    return sequence

示例调用:

>>> print renderSmoothIntegerSequence(5,8)
[2, 1, 2, 1, 2]
>>> print renderSmoothIntegerSequence(5,7)
[1, 2, 1, 2, 1]
>>> print renderSmoothIntegerSequence(32,1)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> print renderSmoothIntegerSequence(1,50)
[50]

【讨论】:

  • 平滑是我想要的,好词。我对python不太熟悉,所以'integerstep'、'step'和'delta'都是renderSmoothIntegerSequence函数中的浮点数对吗?
  • @SetSlapShot 我尝试编写伪代码,所以它是可以理解的。 step 和 delta 都是浮点数,但是 integerstep 表示的是实际添加到列表中的值,所以它是一个整数。
  • 是的,名字中带有'integer'的东西是一个整数,现在我想到它更有意义:P。好吧,那就行了,非常感谢。
【解决方案2】:

为了使这个盒子动画平滑,您需要能够在每一帧上绘制矩形,这样矩形的坐标就不会被整数量化。换句话说,如果您的插值计算结果(例如)X 值为 21.354,Y 值为 50.813,则将这些值分别舍入为 21 和 51 将不起作用;矩形的最终移动将非常不稳定和不规则。

问题在于视频的帧是基于像素的,这意味着通常没有内置的方法来绘制具有真实(也称为浮点,而不是整数)坐标的线条或矩形。如果你用来在每一帧上绘制矩形的库只支持整数坐标而不支持浮点坐标(你应该检查一下,因为许多图形库 do 支持浮点坐标,这会让这个任务对你来说很容易),那么你必须自己动手。

您使用什么库将这些矩形实际绘制到视频的每一帧上?

【讨论】:

  • 我不知道这是可能的。我在 ffmpeg 中使用 libav*,我正在寻找是否有任何关于绘制浮点数的内容。我真的希望这样可以让这一切变得更简单。
  • 它不能像那样工作,我尝试用一​​些小数修改他们为我提供的示例跟踪日志,但它无法运行。不过好主意
  • 这不是一个好主意,这是唯一的主意。如果无法将框渲染到浮点坐标,则无法从一个位置到另一个位置获得流畅的动画,除非位置和大小的变化自然会在整数边界上中断,这在大多数情况下是极不可能的。
  • 这有关系吗?如果我们在一帧(1/30 秒)内移动一个像素(百分之八英寸)的东西,我发现很难相信人眼能够分辨出差异
  • 自己试试看。要使任何动画平滑,您需要 1) 能够渲染到浮点坐标,或 2) 约束您的动画,使每个增量都是一个整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多