Идентификация человека с помощью оптического потока и кластеризации?

Итак, я использую Matlab, и мне удалось изменить один из их примеров, чтобы теперь я мог отображать линии потока, когда люди идут внизу (камера находится над дверью). Я использую оптический поток Lucas-Kanade и набор инструментов компьютерного зрения.

Линии определены так, я также определил отслеживаемые точки. Эти отслеженные точки включают в себя случаи, когда исходные точки не изменились, и поэтому real(tmp(:)) в этом случае будет равен нулю, и эти точки будут такими же, как изначально идентифицированные характерные точки.

vel_Lines = [Y(:)   X(:)   Y(:)+real(tmp(:))   X(:)+imag(tmp(:))];
allTrackedPoints = [Y(:)+real(tmp(:))   X(:)+imag(tmp(:))]; 

Мой вопрос: как я могу ПРОСТО получить точки, которые были успешно отслежены на определенном расстоянии? Я хочу каким-то образом сохранить только те значения, изменение которых достаточно велико.

Я не очень хорошо разбираюсь в синтаксисе Matlab, поэтому надеялся, что это будет легко для кого-то.

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


person Peter Turner    schedule 07.09.2015    source источник
comment
Еще немного кода, чтобы проиллюстрировать вашу точку зрения, было бы неплохо. Это помогло бы мне создать решение, просто изменив ваш код, вместо того, чтобы писать что-то с нуля. Однако проще всего было бы сохранить векторы оптического потока из предыдущего кадра, выполнить расчет разницы и посмотреть, не превысило ли расстояние определенную величину. Кластеризация должна быть легкой. Вы бы поместили все точки в список, прошлись по каждой из них и собрали те точки, которые находятся на определенном расстоянии от точки, а затем удалили их из списка. Это будет проблематично, когда у вас есть люди поблизости.   -  person rayryeng    schedule 07.09.2015
comment
Спасибо! Конечно, надеясь идентифицировать объекты как проходящие под дверью, прежде чем они приблизятся друг к другу.   -  person Peter Turner    schedule 08.09.2015
comment
Спасибо! Могу ли я тогда отправить вам код по электронной почте? Я не могу поместить это здесь. Отслеживание не будет проблемой, даже с несколькими объектами, оно просто сначала идентифицирует людей (я обнаружил, что вычитание фона и блоббинг не работают должным образом, и поэтому прибегнул к этому подходу). Я также могу поделиться видео и прочее через гугл диск?   -  person Peter Turner    schedule 08.09.2015


Ответы (1)


Если ваша камера не движется, то вычитание фона может работать для вас лучше, чем оптический поток. См. этот пример.

Вы также можете использовать объект vision.PeopleDetector для обнаружения людей. См. этот пример.

Если вы настаиваете на использовании оптического потока, попробуйте алгоритм оптического потока Fareneback, доступный с версии R2015b.

person Dima    schedule 08.09.2015
comment
Спасибо, мне действительно удалось получить бинарное изображение, усреднив векторы потока, а затем пропустив результат через медианный фильтр для уменьшения шума. Хотелось бы еще знать, как можно сгруппировать точки в оптимальное количество кластеров. Например, я могу получить матрицу точек ([x y]), которые являются хорошими точками, т.е. представляют людей, НО я понятия не имею, как сгруппировать их в зависимости от их положения, чтобы разделить их на разных людей. Для кластеризации K-средних требуется значение k в качестве входных данных, но это то, что я пытаюсь выяснить? растяжки? - person Peter Turner; 09.09.2015