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