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

#python #c #opencv #image-processing

#python #c #opencv #обработка изображений

Вопрос:

У меня есть камера в фиксированном положении, смотрящая на цель, и я хочу определить, идет ли кто-то перед целью. Освещение в сцене может измениться, поэтому вычитание нового измененного кадра из предыдущего кадра приведет к обнаружению движения, даже если его на самом деле не произошло. Я подумал сравнить количество контуров (полученных с помощью findContours() на двоичном изображении края, полученном с помощью canny, а затем получить size () этого) между двумя кадрами, поскольку большое изменение здесь может означать движение, а также быть менее чувствительным к изменениям освещения, я новичок в OpenCVи мои реализации пока не увенчались успехом. Есть ли способ, которым я мог бы заставить это работать, или мне придется просто вычитать кадры. Мне не нужно отслеживать человека, просто определите, есть ли он в сцене.

Ответ №1:

Я немного устал, но есть разные способы сделать это.

SIFT и SURF — очень дорогостоящие операции, поэтому я не думаю, что вы захотите их использовать.

Существует несколько методов удаления фона.

  1. Среднее удаление: в этом случае вы получаете среднее значение из N кадров и рассматриваете его как BG. Это уязвимо для многих вещей, изменения освещенности, тени, перемещения объекта, который долгое время находится в определенном месте и т. Д.
  2. Модель гауссовой смеси: немного более продвинутая, чем 1. Все еще уязвим для многих вещей.
  3. IncPCP (инкрементное отслеживание основного компонента): Я не могу полностью вспомнить алгоритм, но основная идея заключалась в том, что они преобразуют каждый кадр в разреженную форму, а затем извлекают движущиеся объекты из разреженной матрицы.
  4. Оптический поток: вы обнаруживаете изменения во временной области видео. Например, вы сравниваете frame2 с frame1 блок за блоком и указываете направление изменения.
  5. Методы на основе CNN: Я знаю, что их много, но я действительно не следил за ними. Возможно, вам придется провести некоторое исследование. Насколько я знаю, они часто лучше, чем описанные выше методы.

Обратите внимание, что для @ 30 кадров в секунду ваш код должен завершаться за 33 мс на кадр, так что это может быть реальное время. Вы можете найти много кода, доступного для этой задачи.

Ответ №2:

Есть несколько способов, которыми вы могли бы это сделать.

Первое, что приходит на ум, — это выполнение 2D FFT для входящих изображений. Цвет не должен слишком сильно влиять на БПФ, но перемещение объекта, вход / выход из кадра будет.

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