2013-07-08 176 views
2

我有一組圖像,並且想要遞歸地預測一組像素將在下一個圖像中的位置。我正在使用Python,OpenCV,並認爲卡爾曼濾波可能是前進的方向,但我正在努力實現。爲了簡單起見,下面的代碼打開併成像並提取一個顏色通道,在本例中爲紅色。使用Python進行2D運動估計,OpenCV和卡爾曼濾波

到目前爲止,我使用光流確定每個像素在X和Y圖像之間的運動。每次迭代之後,我想使用最後的N次迭代,並且通過使用每次找到的X/Y運動,計算像素的速度,並預測它將在下一幀中結束的位置。我將查看並預測的這組像素未指定,但與示例無關。它只會是(x,y)值的Numpy數組。

任何幫助將不勝感激。下面的簡化代碼片段:

import numpy as np 
import cv2 
from PIL import Image 

imageNames = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg", "image5.jpg"] 

for i in range(len(imageNames)): 
    # Load images and extract just one colour channel (e.g., red) 
    image1 = Image.open(imageNames[i]) 
    image2 = Image.open(imageNames[i+1]) 
    image1R = np.asarray(image1[:,:,0]).astype(np.uint8) 
    image2R = np.asarray(image2[:,:,0]).astype(np.uint8) 

    # Get optical flow 
    flow = cv2.calcOpticalFlowFarneback(image1R, image2R, 0.5, 1, 5, 15, 10, 5, 1) 
    change_in_x = flow[:,:,0] 
    change_in_y = flow[:,:,1] 

    # Use previous flows to obtain velocity in x and y 

    # For a subset of the image, predict where points will be in the next image 
    # Use Kalman filtering? 

    # Repeat recursively 
+0

你在這裏有什麼問題?如何使用卡爾曼濾波器? – baci

+0

是的,可用於此示例。 – user1282437

+3

這看起來不像一個問題。 – tiago

回答

1

我不知道我是否可以在這裏解釋這一點;但我會有一個鏡頭。卡爾曼濾波器不過是一種基於預測測量(校正)的迴路。

你有兩張圖片後您的初始狀態(位置和速度):

X0 = [x0 v0] 

,其中V0是圖像1和圖像2之間的流動。

而x0是image2處的位置。

做一個假設(如等速模型)。下等速假設,你將預測該對象將移動到X1 =其中從等速模型方程式中發現的A * X0:

x1 = x0 + v0*T 
v1 = v0 

=> X1 = [x1 v1] 
     = [1 T ; 0 1] * [x0 v0] 
     = [1 T ; 0 1] * X0 

T是您的採樣時間(通常取爲幀如果與照相機一起使用的話)。你需要知道你的圖片在這裏的時差。

以後,你要糾正這種假設下一個測量(這裏負載圖像3,並獲得V1' 從圖像2和圖像3流。還拿X1' 從圖像3)。

X1' = [x1' y1'] 

對於KF的一個簡化版本,求其平均值作爲點估計,即

~X1 = (X1 + X1')/2. 

如果要使用精確的過濾器,並使用卡爾曼增益和coveriance計算,我會假設您需要查看algorithm,第4頁。如果圖像足夠精確(這是傳感器噪聲),請將R設爲較小值。

您將找到的〜X1將帶您開始。用〜X1代替初始狀態並重新執行相同的程序。

如果您檢查opencv doc,算法可能已經在那裏供您使用。

如果你不打算使用攝像頭和opencv方法;我建議你使用MATLAB,因爲在那裏操縱矩陣更容易。

+0

非常感謝您提供的有用信息!是的,我將嘗試使用OpenCV從Python內部實現過濾。 – user1282437