使用Python,OpenCV& amp;卡尔曼滤波

时间:2013-07-08 06:57:20

标签: python opencv numpy motion kalman-filter

我有一组图像,并希望递归预测下一张图像中一堆像素的位置。我正在使用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

1 个答案:

答案 0 :(得分:1)

我不确定我能不能在这里解释一下;但我会有机会。卡尔曼滤波器只不过是基于预测测量(校正)的环路。

您有两张图片后的初始状态(位置和速度):

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'。同时从x1'获取x1'图像3)。

X1' = [x1' y1'] 

对于更简单的KF版本,找到平均点作为估计,即

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

如果你想使用精确的过滤器,并使用卡尔曼增益和覆盖率计算,我会说你需要查看algorithm,第4页。如果图像足够准确,请将R小一点(它是传感器的噪音。)

你会发现~X1会带你到头。用~X1替换初始状态并执行相同的步骤。

如果您检查opencv doc,则可能已经存在算法供您使用。

如果您不打算使用相机和opencv方法;我建议你使用MATLAB,因为它更容易操作矩阵。