#python #c #opencv #image-processing
#python #c #opencv #обработка изображений
Вопрос:
У меня есть камера в фиксированном положении, смотрящая на цель, и я хочу определить, идет ли кто-то перед целью. Освещение в сцене может измениться, поэтому вычитание нового измененного кадра из предыдущего кадра приведет к обнаружению движения, даже если его на самом деле не произошло. Я подумал сравнить количество контуров (полученных с помощью findContours() на двоичном изображении края, полученном с помощью canny, а затем получить size () этого) между двумя кадрами, поскольку большое изменение здесь может означать движение, а также быть менее чувствительным к изменениям освещения, я новичок в OpenCVи мои реализации пока не увенчались успехом. Есть ли способ, которым я мог бы заставить это работать, или мне придется просто вычитать кадры. Мне не нужно отслеживать человека, просто определите, есть ли он в сцене.
Ответ №1:
Я немного устал, но есть разные способы сделать это.
SIFT и SURF — очень дорогостоящие операции, поэтому я не думаю, что вы захотите их использовать.
Существует несколько методов удаления фона.
- Среднее удаление: в этом случае вы получаете среднее значение из N кадров и рассматриваете его как BG. Это уязвимо для многих вещей, изменения освещенности, тени, перемещения объекта, который долгое время находится в определенном месте и т. Д.
- Модель гауссовой смеси: немного более продвинутая, чем 1. Все еще уязвим для многих вещей.
- IncPCP (инкрементное отслеживание основного компонента): Я не могу полностью вспомнить алгоритм, но основная идея заключалась в том, что они преобразуют каждый кадр в разреженную форму, а затем извлекают движущиеся объекты из разреженной матрицы.
- Оптический поток: вы обнаруживаете изменения во временной области видео. Например, вы сравниваете frame2 с frame1 блок за блоком и указываете направление изменения.
- Методы на основе CNN: Я знаю, что их много, но я действительно не следил за ними. Возможно, вам придется провести некоторое исследование. Насколько я знаю, они часто лучше, чем описанные выше методы.
Обратите внимание, что для @ 30 кадров в секунду ваш код должен завершаться за 33 мс на кадр, так что это может быть реальное время. Вы можете найти много кода, доступного для этой задачи.
Ответ №2:
Есть несколько способов, которыми вы могли бы это сделать.
Первое, что приходит на ум, — это выполнение 2D FFT для входящих изображений. Цвет не должен слишком сильно влиять на БПФ, но перемещение объекта, вход / выход из кадра будет.
Второй способ — использовать SIFT или SURF для создания списка объектов на изображении, вы можете вставить эти точки на карту, отсортировать, как вам нравится, затем выполнить set_difference между последним полученным вами изображением и текущим изображением, которое у вас есть. Вы также можете использовать функциональность FLANN’а для сравнения сгенерированных объектов.