2012-06-06 43 views
1

G'上午SO-概念插值算法

我試圖移動視頻上的一些邊界框。我處於一個棘手的問題。如果我每15幀在數據文件上有一幀,那麼我必須在每一幀之間創建14幀。由於它是一個工具(實際上是ffmpeg插件的一部分),它需要適用於任何間隙大小。

我已經寫了一個函數,它需要兩點之間的距離,以及它有多少幀能夠平滑地從開始點過渡到結束點。理想情況下,這個函數返回的是一個從前一幀中移出多少個像素的數組。

例如,如果第1幀的x爲50,第16幀的第65幀爲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]++; 
    } 
} 

我應該使用取模運算符或可能接近它不同?硬編碼看起來像是任意值,並不適合我。

+0

你這裏的問題不是很清楚。當你說「邊界框」時,你的意思是你試圖在你的視頻的每一幀上繪製一個矩形,這樣矩形就能從其起始位置平滑地移動到你的結束位置? – MusiGenesis

+0

是的。我有一個面部識別程序,每15幀輸出這些盒子的座標和盒子屬性,並輸出到日誌文件。我正在嘗試創建一個插入此程序的程序,以便新的日誌文件具有每幀的座標和屬性。我知道我可能沒有解釋清楚,我爲我是一個很差的溝通者而道歉。如果我能澄清的東西讓我知道。 – SetSlapShot

回答

1

更一般地說,它聽起來像您想要生成總和爲y的整數的「最平滑」系列x。 (平滑度是該系列中元素之間的最小平均距離。)

這可以通過以下算法來實現。

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我試圖編寫僞代碼,這是可以理解的。步和delta是浮點數,但integerstep表示實際添加到列表中的值,所以它是一個整數。 – cheeken

+0

是的,它的名字中的'整數'是一個整數,現在我想到它更有意義:P。那麼會做到這一點,非常感謝。 – SetSlapShot

1

爲了使這個盒子動畫平滑,您需要能夠在每個框架上繪製矩形,以便矩形的座標不會被整數量化。換句話說,如果插值計算結果(例如)X值爲21.354,Y值爲50.813,則將這些值分別舍入爲21和51將不起作用;由此產生的矩形運動將是非常生澀和不規則的。

問題是,視頻的幀是基於像素的,這意味着通常沒有內置的方式來繪製線條或矩形與實數(又名浮點,而不是整數)座標。如果用於在每個框架上繪製矩形的庫僅支持整數座標而不支持浮點座標(並且您應該檢查這一點,因爲許多圖形庫支持浮點座標,這會使此任務變得非常非常對你來說很簡單),那麼你必須爲此而推出自己的產品。

您正在使用什麼庫實際將這些矩形繪製到視頻的每個幀上?

+0

我不知道這是可能的。我在ffmpeg中使用libav *,我正在查看是否有關於繪製浮點數的任何信息。我真的希望這樣做會使這更簡單。 – SetSlapShot

+0

它不起作用,我試着修改它們爲我提供的小數點示例跟蹤日誌,但它不會運行。好主意雖然 – SetSlapShot

+0

這不是一個好主意,它是* only *主意。如果沒有能力將您的方塊渲染到浮點座標,則無法從一個位置到另一個位置獲得流暢的動畫,除非位置和大小更改在整數邊界上自然中斷,而在大多數情況下這是不可能的。 – MusiGenesis