我有一个树莓皮,它可以记录PIR传感器的运动检测视频。有时“随机”的热量变化会错误地触发传感器,并在没有任何运动的情况下录制视频。如果图片中没有任何运动,我想用opencv2.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计算图像差分。为了去除噪声,它对差分图像执行形态学开放。最后,它使用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)
从后者可以看出,当光照变化很大时,它会被错误地检测为运动。如何从照明变化中移除这些误报?在
另一件值得一提的事情是,这个过滤器将作为一个后处理运行,即它不会是实时的,因此我可以接受一个比我当前的性能更高的解决方案。在
(编辑:我正在运行Linux,因此解决方案需要在Linux上运行)
看看光照不变的运动检测算法,也就是说,像对比度拉伸或亮度均衡。在
你有没有研究过一种物理/硬件解决方案来解决这个问题,也许用一些可以减少眩光影响的东西覆盖PIR传感器?在
编辑:
我刚找到this result关于通过掩蔽消除眩光效果。可能对你有帮助。在
编辑2:
在发布答案时记不起来了,但我很久以前就碰到过{a2},它是用C++编写的。在
相关问题 更多 >
编程相关推荐