Как использовать оптическое отслеживание потока в opencv для сегментации изображения? - PullRequest
0 голосов
/ 22 мая 2019

Использование calcopticalflowpyrlk из opencv2 для отслеживания потока движения объектов, выбранных в первом кадре (зеленые точки):

enter image description here

Я рисую линию между старыми точками, поданными на calcopticalflowpyrlk, и теми, которые получены с помощью calcopticalflowpyrlk

В конце я получаю этот замечательный трек enter image description here


Цитируя @rotating_image ответ на похожий вопрос:

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


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

Но я по-прежнемуне могу понять, как это помогает мне сегментировать изображение?

Должен ли я вычислять векторы всех пикселей, и те, которые имеют ~ "одинаковый" ангел и величину, найденные ранее, являются объектом, а все остальноефон?

Или я что-то упустил?

1 Ответ

0 голосов
/ 24 мая 2019

Предполагая, что у вас есть потоковые изображения и вы хотите автоматически отслеживать капли потоков, которые идут в одном направлении.

Итак, вы получаете разреженный поток, который будет выглядеть как sth ниже

Вы можете использовать для этого раздел opencv.Разделение похоже на алгоритм кластеризации на основе расстояния, который лучше, чем kmean, потому что вам не нужно вводить число k.Проблема в том, что он подвержен шуму и ложным ассоциациям.Поэтому я предпочитаю использовать его на наборе вектора потока, который больше порога.

Вы можете найти образец ниже

int th_distance = 18; // radius tolerance

int th2 = th_distance * th_distance; // squared radius tolerance
vector<int> labels;

int n_labels = partition(pts, labels, [th2](const Point& lhs, const Point& rhs) {
    return ((lhs.x - rhs.x)*(lhs.x - rhs.x) + (lhs.y - rhs.y)*(lhs.y - rhs.y)) < th2; 
});

enter image description here -> enter image description here

, где каждый цветозначает сегменты.Вы можете настроить параметр для вашего видео

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

вот пример https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html

enter image description here enter image description here

Наконец, агрегируйте вектор движенияв конечный вектор K и обозначим на последнем векторе K в центре корпуса.

Затем объедините конечный вектор K каждого изображения, чтобы сформировать траекторию.

...