来自太阳的运动检测照明

2024-06-28 19:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个树莓皮,它可以记录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上运行)


Tags: importread视频oscount错误npplus
1条回答
网友
1楼 · 发布于 2024-06-28 19:18:56

看看光照不变的运动检测算法,也就是说,像对比度拉伸或亮度均衡。在

你有没有研究过一种物理/硬件解决方案来解决这个问题,也许用一些可以减少眩光影响的东西覆盖PIR传感器?在

编辑:

我刚找到this result关于通过掩蔽消除眩光效果。可能对你有帮助。在

编辑2:

在发布答案时记不起来了,但我很久以前就碰到过{a2},它是用C++编写的。在

相关问题 更多 >