[英]2D motion estimation using Python, OpenCV & Kalman filtering
我有一組圖像,並且想遞歸地預測下一個圖像中的像素點。 我使用的是Python,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
我不確定是否可以在這里解釋。 但我會試一試。 卡爾曼濾波器不過是基於預測測量(校正)的循環。
在兩幅圖像之后,您便擁有了初始狀態(位置和速度):
X0 = [x0 v0]
其中v0是image1和image2之間的流。
x0是image2的位置。
做一個假設(如恆速模型)。 在恆定速度假設下,您將預測該對象將移動到X1 = A * X0,其中從恆定速度模型方程式中找到A:
x1 = x0 + v0*T
v1 = v0
=> X1 = [x1 v1]
= [1 T ; 0 1] * [x0 v0]
= [1 T ; 0 1] * X0
T是您的采樣時間(如果與相機一起使用,則通常作為幀速率)。 您需要在此處了解圖像的時差。
稍后,您將通過下一個測量來糾正此假設(在此處加載image3並從image2和image3的流中獲取v1'。還要從image3中獲取x1')。
X1' = [x1' y1']
對於更簡單的KF版本,找到平均點作為估計值,即
~X1 = (X1 + X1')/2.
如果要使用精確的濾波器,並使用卡爾曼增益和覆蓋率計算,我想說的是,您需要檢查算法 ,第4頁。如果圖像足夠准確,則將R減小(這是傳感器噪聲)。
您會發現〜X1,使您開始。 將初始狀態替換為〜X1並執行相同的步驟。
如果您檢查opencv doc ,則該算法可能已經存在供您使用。
如果您不打算使用相機和opencv方法; 我建議您使用MATLAB,只是因為在那里更容易操作矩陣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.