2016-05-14 3 views
1

У меня есть малина 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)

ответ

2

Посмотрите в алгоритмы освещения инвариантного обнаружения движения, а именно пойти на то, как контраст растяжения или выравнивание яркости.

Вы изучили физическое/аппаратное решение этого вопроса, возможно, покрытие датчика PIR с помощью чего-то, что может снизить эффекты бликов?

EDIT:

Я только что нашел this result о снятии бликов эффектов с помощью маскировки. Это может помочь вам.

EDIT 2:

не мог бы помнить об этом при размещении ответа, но я наткнулся на this implementation давно, его написано на C++.

+0

Спасибо, я рассмотрю это еще и посмотрю, смогу ли я найти решение. – Linus

+0

Я работаю на python и нуждаюсь в моем решении для работы в Linux, и из-за этого я не могу использовать эту конкретную реализацию, но спасибо за ссылку. – Linus

Смежные вопросы