2016-05-14 7 views
1

私は、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を実行しています)照明不変動き検出アルゴリズムに

答えて

2

ルックを、すなわち、ストレッチング、コントラストや明るさの等化のようなもののために行きます。

これに物理的/ハードウェア的な解決策を見たことがありますか?おそらく、眩しさの影響を減らす可能性のあるものでPIRセンサーをカバーしていますか?

EDIT:

私はちょうどマスキングを通じてグレア効果の除去についてthis resultを見つけました。それはあなたを助けるかもしれません。

EDIT 2:答えを掲示しながら、

はこれを覚えていませんでしたが、私はずっと前this implementationに出くわし、そのC++で書かれました。

+0

ありがとうございます、私はこれをもう少し見て、解決策が見つかるかどうかを見ていきます。 – Linus

+0

私はPythonで作業しており、私の解決策がLinux上で動作する必要があります。そのため、その特定の実装を使用することはできませんが、リンクに感謝します。 – Linus

関連する問題