多目标卡尔曼滤波器:识别问题

Posted

技术标签:

【中文标题】多目标卡尔曼滤波器:识别问题【英文标题】:Kalman filter for multiple object : identification problems 【发布时间】:2020-05-03 15:28:23 【问题描述】:

我想使用我附加的卡尔曼滤波器实现来跟踪视频中流动的对象。 在视频中,物体处于运动状态,一些物体从视频边界出来,一些物体进入视频边界。 该算法不是跟踪新元素,而是将轨迹从旧对象移动到新对象。 我该如何解决这个问题?

这里example image 解释得更好,如果我还不够清楚的话

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

【问题讨论】:

【参考方案1】:

如果你没有绑定卡尔曼滤波器,这个问题还有另一种解决方案。通常使用图像序列中的特征optical flow 来解决此类问题。

OpenCV 中的一个例子可以在here找到。

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

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() 找到

来源:OpenCV

【讨论】:

这个方法可以返回ID吗? 那是什么意思?我刚刚在OpenCV的文档中看到了显示光流功能的,如果你向下滚动,还有一个卡尔曼函数docs.opencv.org/2.4/modules/video/doc/… 在答案中添加了更多信息。 您可以修改教程中显示的示例并绘制goodFeaturesToTrack 函数返回的内容。 在研究了卡尔曼滤波器和光流之后,我意识到光流是最接近我所寻找的东西。尽管如此,我无法理解如何使用光流而不一定要从视频中提取特征:我已经开发出一种方法来识别每一帧中的猕猴桃,但我不明白如何使用这些检测来提供跟踪算法。举个例子,是否可以使用 cv2.moments?

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

目标跟踪基于matlab帧差法结合卡尔曼滤波行人姿态识别含Matlab源码 1127期

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

多目标跟踪匈牙利 - 卡尔曼滤波算法

计算机视觉(多目标跟踪)算法中卡尔曼滤波算法详解

交互式多模型-扩展卡尔曼滤波IMM-EKF——机动目标跟踪中的应用

交互式多模型-扩展卡尔曼滤波IMM-EKF——机动目标跟踪中的应用