Колчанный сюжет с оптическим потоком?

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

Документация Quiver принимает четыре аргумента, в основном ([X, Y], U, V), когда X и Y являются отправными точками, а U и V - направлениями. С другой стороны, оптический поток на основе этого пример возвращаетp1 (смещения) с формой (m, n, l) изображения с формой (200,200). Моя путаница в том, как упорядочить параметры, потому что goodFeaturesToTrack также возвращает то же, что и p1

¿Как я могу соединить оба компонента, чтобы построить колчан движения облака?


person Chacho Fuva    schedule 21.05.2020    source источник


Ответы (2)


Я нашел довольно хорошее решение. Я объясняю весь свой пример здесь, используя последовательность такси в Гамбурге:

  1. Скачать последовательность такси.
$ curl -O ftp://ftp.ira.uka.de/pub/vid-text/image_sequences/taxi/taxi.zip
$ unzip -q taxi.zip
  1. Получить все изображения и выбрать два случайных кадра
from pathlib import Path
import numpy as np
import cv2 as cv
from PIL import Image
import matplotlib.pyplot as plt

taxis_fnames = list(Path('taxi').iterdir())
taxi1 = Image.open(taxis_fnames[rand_idx])
taxi2 = Image.open(taxis_fnames[rand_idx + 4])
  1. Вычислить оптический поток
flow = cv.calcOpticalFlowFarneback(np.array(taxi1), 
                                   np.array(taxi2), 
                                   None, 0.5, 3, 15, 3, 5, 1.2, 0)
  1. Постройте колчан
step = 3
plt.quiver(np.arange(0, flow.shape[1], step), np.arange(flow.shape[0], -1, -step), 
           flow[::step, ::step, 0], flow[::step, ::step, 1])

Шаг заключается в уменьшении количества выбранных векторов оптического потока. Позиции x идут от 0 до ширины изображения, а позиции y инвертируются (иначе оптический поток будет вверх ногами) от высоты изображения до 0. В некоторых случаях вам придется изменить шаг, чтобы высота и с были делится на него.

  1. Полученное изображение:

введите здесь описание изображения

person Guillem    schedule 02.07.2020

Вот общий метод простого и точного построения поля колчана.

def plot_quiver(ax, flow, spacing, margin=0, **kwargs):
    """Plots less dense quiver field.

    Args:
        ax: Matplotlib axis
        flow: motion vectors
        spacing: space (px) between each arrow in grid
        margin: width (px) of enclosing region without arrows
        kwargs: quiver kwargs (default: angles="xy", scale_units="xy")
    """
    h, w, *_ = flow.shape

    nx = int((w - 2 * margin) / spacing)
    ny = int((h - 2 * margin) / spacing)

    x = np.linspace(margin, w - margin - 1, nx, dtype=np.int64)
    y = np.linspace(margin, h - margin - 1, ny, dtype=np.int64)

    flow = flow[np.ix_(y, x)]
    u = flow[:, :, 0]
    v = flow[:, :, 1]

    kwargs = {**dict(angles="xy", scale_units="xy"), **kwargs}
    ax.quiver(x, y, u, v, **kwargs)

    ax.set_ylim(sorted(ax.get_ylim(), reverse=True))
    ax.set_aspect("equal")

Пример использования:

flow = cv2.calcOpticalFlowFarneback(
    frame_1, frame_2, None, 0.5, 3, 15, 3, 5, 1.2, 0
)

fig, ax = plt.subplots()
plot_quiver(ax, flow, spacing=10, scale=1, color="#ff44ff")
person Mateen Ulhaq    schedule 02.04.2021