Python 来自太阳的运动检测照明

Python 来自太阳的运动检测照明,python,opencv,filter,motion-detection,false-positive,Python,Opencv,Filter,Motion Detection,False Positive,我有一个树莓圆周率记录视频的运动检测从一个PIR传感器。有时,“随机”热变化会错误地触发传感器,并在没有任何运动时录制视频。如果图片中没有任何运动,我想使用OpenCV 2.4.8通过图像处理过滤掉这些视频 保存视频有两个标准:触发PIR传感器的热变化和视频中的运动。它适用于大多数视频,但我注意到,照明有时会变化很大,模拟视频中的真实运动,并错误地触发过滤器 # -*- coding: utf-8 -*- import os import cv2 import numpy as np def

我有一个树莓圆周率记录视频的运动检测从一个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)
#-*-编码:utf-8-*-
导入操作系统
进口cv2
将numpy作为np导入
def扩散(t0、t1、t2):
d1=cv2.absdiff(t2,t1)
d2=cv2.absdiff(t1,t0)
返回cv2.按位_和(d1,d2)
内核=np.ones((5,5),np.uint8)
对于os.walk(“/path/to/videos”)中的dirpath、dnames和fnames:
对于fnames中的f:
cap=cv2.VideoCapture(os.path.join(dirpath,f))
总数=0
计数=0
#首先阅读三幅图片:
t_减号=cv2.cvt颜色(cap.read()[1],cv2.COLOR_rgb2灰色)
t=cv2.cvt颜色(cap.read()[1],cv2.COLOR\u rgb2灰色)
t_plus=cv2.cvt颜色(cap.read()[1],cv2.COLOR_rgb2灰色)
尽管如此:
opening=cv2.morphologyEx(diffImg(t_减号,t,t_加号),cv2.MORPH_OPEN,kernel)
总计+=cv2.计数非零(期初)
#阅读下一张图片
t_减=t
t=t_+
ret,frame=cap.read()
如果ret==False:
打破
t_plus=cv2.cvt颜色(帧,cv2.COLOR_rgb2灰色)
计数+=1
如果总数/计数<800:
打印“文件%s没有运动(%d)”%(os.path.join(dirpath,f),总计/计数)
我的算法很简单。它获取三帧并计算差值,然后使用cv2.bitwise_和创建二值图像。为了去除噪声,它对差分图像执行形态学打开。最后,它使用cv2.countNonZero来确定该帧中的运动量。最后,我将总的运动量除以帧数(我们称之为运动/帧)得到一个数字。如果该数字小于800,则视频可能没有运动

以下是两个示例(一个阳性检测和一个假阳性检测)
肯定:
(动议/帧:843) 假阳性:
(动议/帧:879)

从后者可以看出,当照明变化很大时,它会被错误地检测为运动。如何从照明变化中消除这些误报

另一件值得一提的事情是,这个过滤器将作为一个后处理运行,即它不会是实时的,因此我可以使用一个比我当前的解决方案更高性能的解决方案


编辑:我正在运行Linux,因此解决方案需要在Linux上运行)

研究照明不变的运动检测算法,即进行对比度拉伸或亮度均衡

您是否研究过物理/硬件解决方案,可能会用一些可以减少眩光影响的东西覆盖PIR传感器

编辑:

我刚刚发现了通过掩蔽去除眩光效果的方法。这可能对你有帮助

编辑2:


在发布答案之前,我记不起来了,但我很久以前就见过它,它是用C++编写的。

谢谢,我会深入研究一下,看看我能不能找到解决方案。我在Python中工作,需要我的解决方案来处理Linux,因为我不能使用那个具体的实现,但是谢谢链接。