Фильтр Калмана для нескольких объектов: проблемы идентификации - PullRequest
0 голосов
/ 03 мая 2020

Я хотел бы использовать реализацию фильтра Калмана, которую я добавил для отслеживания объектов, которые передаются в видео. В видео объекты находятся в движении, некоторые выходят за границы видео, а другие входят в него. вместо отслеживания новых элементов алгоритм перемещает дорожки от старых объектов к новым. как я могу решить эту проблему?

Здесь пример изображения , чтобы объяснить лучше, если я не был достаточно ясен

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 Ответ

0 голосов
/ 03 мая 2020

Если вы не связаны с фильтром Калмана, есть другое решение этой проблемы. Обычно такая проблема решается с помощью оптического потока функций в последовательности изображений.

Пример в OpenCV можно найти здесь .

Идея состоит в том, чтобы найти важные функции для отслеживания вашего изображения (круги, углы и т. Д. c). Это можно сделать с помощью удобной функции для начала, и вы можете не знать, что использовать:

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

Затем вы передаете функции в функцию оптического потока вместе с двумя последовательными изображениями, и она выполнит некоторые magi c:

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

В вашем случае вы упомянули, что хотели бы использовать ID. Я понятия не имею, как выглядят ваши данные, но я предлагаю вам использовать на своем изображении функцию goodFeaturesToTrack и посмотреть, что получится. Затем вы получите представление о том, что можно использовать для отслеживания.

После этого вы можете использовать указанную c функцию, которая извлекает ваши любимые функции. Допустим, вы нашли функцию, которая извлекает функции изображения киви из изображения, возможно, из эллипсов. Скажи один эллипс на киви. Затем вы помещаете этот список в функцию отслеживания, и он сообщает вам, куда они попали на следующем изображении. Список имеет фиксированный порядок, который можно использовать в качестве идентификатора.

Документы OpenCV для функции можно найти по адресу cv2.calcOpticalFlowPyrLK ()

Optical flow in OpenCV Источник: OpenCV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...