2

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

1 回答 1

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'。同时从 image3 中获取 x1')。

X1' = [x1' y1'] 

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

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

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

你会发现 ~X1 带你开始。用 ~X1 替换初始状态并执行相同的过程。

如果您检查opencv doc,该算法可能已经在那里供您使用。

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

于 2013-07-08T17:51:41.993 回答