У меня есть малина Pi, которая записывает видеоролики о обнаружении движения от датчика PIR. Иногда «случайные» вариации тепла будут ложно запускать датчик и записывать видео, если движения нет. Если на изображении нет какого-либо движения, я бы хотел отфильтровать эти видео с обработкой изображений с помощью OpenCV 2.4.8Освещение движения от солнца
Существует два критерия для сохранения видео: вариация тепла, вызывающая датчик PIR и движение в видео. Он работает для большинства видеороликов, но я заметил, что освещение иногда будет сильно изменяться и имитировать реальное движение в видео и вызвать фильтр ложно.
# -*- coding: utf-8 -*-
import os
import cv2
import numpy as np
def diffImg(t0, t1, t2):
d1 = cv2.absdiff(t2, t1)
d2 = cv2.absdiff(t1, t0)
return cv2.bitwise_and(d1, d2)
kernel = np.ones((5,5),np.uint8)
for dirpath, dnames, fnames in os.walk("/path/to/videos"):
for f in fnames:
cap = cv2.VideoCapture(os.path.join(dirpath, f))
total = 0
count = 0
# Read three images first:
t_minus = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
t = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
t_plus = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
while True:
opening = cv2.morphologyEx(diffImg(t_minus, t, t_plus), cv2.MORPH_OPEN, kernel)
total += cv2.countNonZero(opening)
# Read next image
t_minus = t
t = t_plus
ret, frame = cap.read()
if ret == False:
break
t_plus = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
count += 1
if total/count < 800:
print "file %s has no motion (%d)" % (os.path.join(dirpath, f), total/count)
Мой алгоритм очень прост. Он захватывает три кадра и вычисляет разницу и создает двоичное изображение, используя cv2.bitwise_and. Чтобы удалить шум, он выполняет морфологическое открывание на этом дифференциальном изображении. Наконец, он использует cv2.countNonZero для определения количества движения в этом фрейме. В конце я делю общий объем движения на количество кадров (давайте назовем это движение/фрейм), чтобы получить число, с которым можно работать. Если это число меньше 800, видео считается, что нет движения.
Вот два примера (один положительный обнаружения и один ложный положительный результат обнаружения)
Положительные:
https://www.dropbox.com/s/ryvemvkoda6morn/2016-05-11_07-12-20.ts?dl=0 (движение/кадр: 843) Ложноположительный:
https://www.dropbox.com/s/lqegj92jxhjjegv/2016-05-12_19-16-10.ts?dl=0 (движение/рама: 879)
Как видно из последнего, когда освещение сильно меняется, оно ложно обнаруживается как движение. Как удалить эти ложные срабатывания из изменений освещения?
Еще одна вещь, о которой стоит упомянуть, заключается в том, что этот фильтр будет выполняться как пост-процесс, то есть он не будет в реальном времени, таким образом, я в порядке с решением, которое будет несколько более тяжелым, чем мой текущий.
(EDIT: Я бег Linux, поэтому решение должно работать на Linux)
Спасибо, я рассмотрю это еще и посмотрю, смогу ли я найти решение. – Linus
Я работаю на python и нуждаюсь в моем решении для работы в Linux, и из-за этого я не могу использовать эту конкретную реализацию, но спасибо за ссылку. – Linus