1

G' Morning SO-

我正在尝试移动视频上的一些边界框。我正处于一个症结所在。如果我在数据文件中每 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]++;
  }
}

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

4

2 回答 2

1

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

问题是视频的帧是基于像素的,这意味着通常没有内置的方法来绘制具有真实(又名浮点,而不是整数)坐标的线条或矩形。如果您用于在每个帧上绘制矩形的库仅支持整数坐标而不支持浮点坐标(并且您应该检查这一点,因为许多图形库确实支持浮点坐标,这将使这项任务非常容易你),那么你将不得不为此推出自己的产品。

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

于 2012-06-06T15:18:04.327 回答
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 中的示例实现(对不起,不是交流人)。

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]
于 2012-06-06T15:29:52.680 回答