簡體   English   中英

使用Python,OpenCV和卡爾曼濾波進行2D運動估計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM