2012-06-06 1 views
1

G 'Morning SO-Концептуальный алгоритм интерполяции

Я пытаюсь переместить некоторые ограничивающие рамки на видео. Я в какой-то момент. Если у меня есть кадр в файле данных каждые 15 кадров, тогда я должен создать 14 кадров между каждой реальной. Поскольку это инструмент (на самом деле часть плагина ffmpeg), он должен работать для любого размера пробела.

Я написал функцию, которая занимает расстояние между двумя точками и сколько кадров он должен плавно перейти от начальной точки до конечной точки. То, что эта функция идеально будет возвращать, представляет собой массив из числа пикселей для перехода от предыдущего кадра.

Например, если x в кадре 1 равнялось 50, а в кадре 16 было 65, тогда у меня был бы массив из всех, что каждый кадр будет добавлять один к кадру раньше. Вот что у меня до сих пор:

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]++; 
    } 
} 

Должен ли я использовать оператор модуль или, возможно, приближается к нему по-другому? Жесткое кодирование в кажущихся произвольными значениях не слишком хорошо сочетается со мной.

+0

Ваш вопрос здесь не очень понятно. Когда вы говорите «ограничивающие рамки», вы имеете в виду, что пытаетесь нарисовать прямоугольник на каждом кадре вашего видео, чтобы прямоугольник плавно перемещался от исходного местоположения до конечного местоположения? – MusiGenesis

+0

Да. У меня есть программа распознавания лиц, которая выводит координаты и атрибуты полей для таких ящиков каждые 15 кадров и выводит их в файл журнала. Я пытаюсь создать программу для интерполяции, чтобы новый файл журнала имел координаты и атрибуты каждого кадра. Я знаю, что, вероятно, не очень хорошо объяснил это, и извиняюсь за то, что я плохой коммуникатор. Если что-то еще, что я могу прояснить, дайте мне знать. – SetSlapShot

ответ

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] 
+0

Гладкость - это то, что я собираюсь здесь, доброе слово. Я не слишком хорошо знаком с python, поэтому «integerstep», «step» и «delta» - это все плавающие точки в функции renderSmoothIntegerSequence? – SetSlapShot

+0

@SetSlapShot Я попытался написать псевдокод, так что это понятно. Шаг и дельта - это float, но integerstep представляет значение, которое фактически добавляется в список, поэтому оно является целым числом. – cheeken

+0

Да что-то с целым числом в имени, являющемся целым числом, теперь имеет гораздо больше смысла, когда я думаю об этом: P. Хорошо, что это так, спасибо. – SetSlapShot

1

Для того, чтобы анимация этого окна была гладкой, вам нужно будет нарисовать прямоугольник на каждом кадре, чтобы координаты прямоугольника не были квантованы целыми числами. Для слов, если ваш расчет интерполяции приводит (например) к значению X 21.354 и значению Y 50.813, то округление этих значений до 21 и 51 соответственно не будет работать; результирующее движение прямоугольника будет очень рывким и нерегулярным.

Проблема заключается в том, что кадры видео основаны на пикселях, что означает, что обычно нет встроенного способа рисования линий или прямоугольников с реальными (ака с плавающей точкой, а не целочисленными) координатами. Если библиотека, которую вы используете для рисования прямоугольника на каждом кадре, поддерживает только целые координаты, а не координаты с плавающей запятой (и вы должны это проверить, потому что многие графические библиотеки do поддерживают координаты с плавающей запятой, что сделало бы эту задачу очень легко для вас), тогда вам придется катиться самостоятельно.

Какую библиотеку вы используете, чтобы нарисовать эти прямоугольники на каждом кадре видео?

+0

Я не знал, что это возможно. Я использую libav * в ffmpeg, я смотрю, есть ли что-нибудь о рисовании чисел с плавающей запятой. Я действительно надеюсь, что это сделало бы это намного проще. – SetSlapShot

+0

Это не работает так, как будто, я пробовал модифицировать журнал отслеживания образцов, который они мне предоставили, с некоторыми десятичными знаками, но он не будет работать. Хорошая идея, хотя – SetSlapShot

+0

Это не очень хорошая идея, это идея * только *. Без возможности визуализировать вашу ячейку с координатами с плавающей запятой, вы не сможете получить гладкую анимацию из одной позиции в другую, если только положение и размер не изменяются естественным образом на целых границах, что в большинстве случаев невероятно маловероятно. – MusiGenesis