私は、PIRセンサからの動き検出に関するビデオを記録するラズベリーパイを持っています。場合によっては、「ランダム」熱変動がセンサを誤ってトリガし、動きがないときにビデオを記録することがあります。画像に動きがない場合は、OpenCVを使用して画像処理でこれらの動画をフィルタリングしたいのですが。2.4.8太陽からの動き検出照明
保存するビデオには2つの基準があります: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)
私のアルゴリズムは非常に簡単です。 3つのフレームを取得し、差分を計算し、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