Оценка 2D движения с использованием фильтрации Python, OpenCV и Kalman

У меня есть набор изображений, и я хотел бы рекурсивно предсказать, где в следующем изображении будет куча пикселей. Я использую Python, OpenCV, и считаю, что фильтрация Калмана может быть способом продвижения вперед, но я борюсь с реализацией. Для простоты приведенный ниже код открывается, а изображение и извлекает только один цветной канал, в этом случае красный.

До сих пор я использую оптический поток для определения движения между изображениями в X и Y для каждого пикселя. После каждой итерации я хотел бы использовать последние N итераций и с помощью движений X / Y, найденных каждый раз, вычислять скорость пикселя и предсказать, где он будет в следующем кадре. Группа пикселей, на которые я буду смотреть и предсказать, не указан, но не подходит для примера. Это будет просто массив Numpy (x, y).

Любая помощь будет принята с благодарностью. Упрощенный фрагмент кода ниже:

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 (eg, 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 

One Solution collect form web for “Оценка 2D движения с использованием фильтрации Python, OpenCV и Kalman”

Я не уверен, могу ли я объяснить это здесь; но у меня будет выстрел. Фильтр Калмана – это не что иное, как цикл, основанный на предсказании-измерении (коррекции).

У вас есть начальное состояние (положение и скорость) после двух изображений:

 X0 = [x0 v0] 

где v0 – поток между изображением1 и изображением2.

и x0 – позиция на изображении2.

Сделайте предположение (например, модель с постоянной скоростью). По предположению постоянной скорости вы прогнозируете, что этот объект переместится в 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 – время выборки (обычно используется как частота кадров, если используется с камерами). Вы должны знать разницу во времени ваших изображений здесь.

Позже вы исправите это предположение со следующим измерением (загрузите изображение3 здесь и получите v1 'из потока image2 и image3. Также возьмите x1' из image3).

 X1' = [x1' y1'] 

Для более простой версии KF найдите среднюю точку в качестве оценки, т. Е.

 ~X1 = (X1 + X1')/2. 

Если вы хотите использовать точный фильтр и использовать вычисления коэффициента усиления kalman и покрытия, я бы сказал, что вам нужно проверить алгоритм , стр. 4. Возьмите R маленьким, если ваши изображения достаточно точны (это шум датчика).

Найденный вами ~ X1 приведет вас к началу. Замените начальное состояние на ~ X1 и перейдите к той же процедуре.

Если вы проверите opencv doc , этот алгоритм может быть уже использован для вас.

Если вы не собираетесь использовать камеры и opencv методы; Я предлагаю вам использовать MATLAB только потому, что там легче манипулировать матрицами.

  • Использование C API tesseract 3.02 с ctypes и cv2 в python
  • OpenCV Python: как определить, закрыто ли окно?
  • Модули OpenCV: solvePnP tvec и оси
  • установка opencv для python на mavericks
  • Веб-камера: libv4l2 & VIDIOC_DQBUF: нет такого устройства
  • Преобразование HSV2BGR не выполняется в скрипте OpenCV Python
  • От JPG до b64encode до cv2.imread ()
  • создать многоканальный нулевой циферблат в python с cv2
  • Python - лучший язык программирования в мире.