Создание видео тепловой карты движения с помощью OpenCV и Python

искусственный интеллект

 

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

使用OpenCV和Python构建运动热图视频

 

Введение:

OpenCV, или (Open Source Computer Vision) — это библиотека, разработанная Intel в 1999 году, в основном для компьютерного зрения и обработки видео в реальном времени. Она написана на C++, но поддерживается на разных языках, включая Python.

процесс работы:

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

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

Давайте дадим краткий обзор двух основных шагов работы алгоритма:

  • Инициализация фона: на первом этапе модель фона вычисляется путем замораживания первого кадра.
  • Обновление: на втором этапе следующий кадр будет вычтен из предыдущего кадра, поэтому, если есть изменение (движение) между двумя кадрами, разница этих кадров будет отражать это изменение, которое можно изменить, применив фильтр «Рынок». продажи.

Вот пример фоновой маски, примененной к короткому видео, записанному с городской камеры:

使用OpenCV和Python构建运动热图视频

 

Код:

Полный репозиторий проекта смотрите здесь.

Сначала код считывает входной видеофайл и инициализирует некоторые необходимые переменные:

capture = cv2.VideoCapture('input.mp4')
background_subtractor = cv2.bgsegm.createBackgroundSubtractorMOG()
length = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))

Затем запускается цикл for, перебирающий кадры:

for i in range(0, length):

    ret, frame = capture.read()

    # If first frame
    if first_iteration_indicator == 1:

        first_frame = copy.deepcopy(frame)
        height, width = frame.shape[:2]
        accum_image = np.zeros((height, width), np.uint8)

Первый блок if проверяет, является ли кадр первым кадром видео, это делается для инициализации фона для вычитания фона, затем accum_image инициализирует массив размером, соответствующим размеру кадра.

filter = background_subtractor.apply(frame)  # remove the background

threshold = 2
maxValue = 2
ret, th1 = cv2.threshold(filter, threshold, maxValue, cv2.THRESH_BINARY)

accum_image = cv2.add(accum_image, th1)

color_image_video = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)

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

Затем добавьте результат маски в массив accum_image, проделайте это для каждого кадра. Результат состоит из массива accum_image, в котором хранится каждое движение, происходящее в видео, .

Кроме того, поэтому в конце, когда ранее описанные операции были выполнены для каждого кадра, цветовая карта применяется к маске, и маска объединяется с текущим кадром.

使用OpenCV和Python构建运动热图视频

 

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

video = cv2.VideoWriter('output.avi', fourcc, 30.0, (width, height))
for image in images:
    video.write(cv2.imread(os.path.join(image_folder, image)))

cv2.destroyAllWindows()

конечный результат:

使用OpenCV和Python构建运动热图视频