繁体   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