多对象的卡尔曼滤波器:识别问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多对象的卡尔曼滤波器:识别问题相关的知识,希望对你有一定的参考价值。

我想使用我所附的卡尔曼滤波器实现来跟踪视频中流动的物体.在视频中,物体是运动的,有的从视频的边界出来,有的进入视频.算法不是跟踪新的元素,而是将轨道从旧的物体移动到新的物体上.如何解决这个问题?

这里有一个 例图 如果我说得不够清楚的话,我还想再解释一下。

class KalmanFilter(object):


def __init__(self):
    self.dt = 0.005  # delta time

    self.A = np.array([[1, 0], [0, 1]])  # matrix in observation equations
    self.u = np.zeros((2, 1))  # previous state vector

    # (x,y) tracking object center
    self.b = np.array([[0], [255]])  # vector of observations

    self.P = np.diag((3.0, 3.0))  # covariance matrix
    self.F = np.array([[1.0, self.dt], [0.0, 1.0]])  # state transition mat

    self.Q = np.eye(self.u.shape[0])  # process noise matrix
    self.R = np.eye(self.b.shape[0])  # observation noise matrix
    self.lastResult = np.array([[0], [255]])

def predict(self):
    # Predicted state estimate
    self.u = np.round(np.dot(self.F, self.u))
    # Predicted estimate covariance
    self.P = np.dot(self.F, np.dot(self.P, self.F.T)) + self.Q
    self.lastResult = self.u  # same last predicted result
    return self.u

def correct(self, b, flag):
    if not flag:  # update using prediction
        self.b = self.lastResult
    else:  # update using detection
        self.b = b
    C = np.dot(self.A, np.dot(self.P, self.A.T)) + self.R
    K = np.dot(self.P, np.dot(self.A.T, np.linalg.inv(C)))

    self.u = np.round(self.u + np.dot(K, (self.b - np.dot(self.A,
                                                          self.u))))
    self.P = self.P - np.dot(K, np.dot(C, K.T))
    self.lastResult = self.u
    return self.u
答案

如果你没有绑定卡尔曼滤波器,这个问题还有另一种解决方案。通常像这样的问题,可以使用 光流 图像序列中的特征。

在OpenCV中可以找到一个例子 此处.

我们的想法是在你的图像中找到要跟踪的重要特征(圆、角等)。这可以使用一个方便的函数来完成,你可能不知道该怎么用。

p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)

然后你把这些特征传给光流函数 再加上两张连续的图像,它就会施展魔法。

p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

在你的案例中,你提到你想使用一个ID。我不知道你的数据是怎样的,但我建议你使用的是 goodFeaturesToTrack 函数,看看返回的结果是什么。然后你就会知道可以用什么来跟踪。

之后你可以使用一个特定的函数,提取你喜欢的特征。比如说你找到了一个从图像中提取猕猴桃特征的函数,也许是椭圆。说每个奇异果有一个椭圆。然后你把这个列表放到跟踪函数中,它就会告诉你它们在下一张图像中的位置。这个列表有一个固定的顺序,你可以把它作为一个ID。

该函数的OpenCV文档可以在下面找到 cv2.calcOpticalFlowPyrLK()

Optical flow in OpenCV资料来源。OpenCV

以上是关于多对象的卡尔曼滤波器:识别问题的主要内容,如果未能解决你的问题,请参考以下文章

如果卡尔曼滤波器无法计算出稳定的卡尔曼增益,可能的原因是啥?

适用于 iOS 的卡尔曼滤波器

具有四个输入参数的卡尔曼滤波器

用于背景/前景分离的卡尔曼滤波器

具有 2 个测量噪声的卡尔曼滤波器

使用 Eigen 实现 3D 位置的卡尔曼滤波器