Оценка 2D движения с использованием фильтрации Python, OpenCV и Kalman
У меня есть набор изображений, и я хотел бы рекурсивно предсказать, где в следующем изображении будет куча пикселей. Я использую Python, OpenCV, и считаю, что фильтрация Калмана может быть способом продвижения вперед, но я борюсь с реализацией. Для простоты приведенный ниже код открывается, а изображение и извлекает только один цветной канал, в этом случае красный.
До сих пор я использую оптический поток для определения движения между изображениями в X и Y для каждого пикселя. После каждой итерации я хотел бы использовать последние N итераций и с помощью движений X / Y, найденных каждый раз, вычислять скорость пикселя и предсказать, где он будет в следующем кадре. Группа пикселей, на которые я буду смотреть и предсказать, не указан, но не подходит для примера. Это будет просто массив Numpy (x, y).
- Python / OpenCV: вычисление карты глубины из стереоизображений
- Чтение потока с IP-камеры с помощью cv2.VideoCapture ()
- Как обрабатывать изображения видео, кадр за кадром в потоковой передаче видео с помощью Opencv python
- Программа OpenCV / C ++ медленнее, чем ее numpy-копия, что мне делать?
- Как обрезать в большую внутреннюю ограничительную рамку в OpenCV?
Любая помощь будет принята с благодарностью. Упрощенный фрагмент кода ниже:
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 только потому, что там легче манипулировать матрицами.
- xlsxwriter не применяет формат к строке заголовка dataframe – Python Pandas
- Как сделать текст strikethough в Sphinx