Raspberry Piで遊ぼう! 【フレーム差分法の紹介】

どもー、たなかです!
たなか「なんか唐突にRaspberry Piで遊びたい!」
と言ったわけで、Raspberry Piで監視カメラを作ろうと思います!
まあ、「ラズパイで遊ぶ」&「監視カメラを作る」しか決まってないので
とりあえず、適当にやるかということで


監視カメラと言ったらとりあえず
カメラを使って映像をリアルタイムに表示出来るようにすればいいので
PythonのOpenCVを利用して↓のようにWebカメラを利用して表示した!

import cv2

capture = cv2.VideoCapture(0)

while(True) :
ret, flame = capture.read()
cv2.imshow('Raw Flame', flame)

k = cv2.waitKey(1)
if k == 27 : #escを押すと終了

break

capture.release()
cv2.destroyAllWindows()

とりあえず、これを使えばwebカメラからの映像が見れます!
「監視カメラの映像を見る」というのには、成功したので
次の段階へ


では、ラズパイで映像をどうやって送るか…
やっぱり、監視カメラは遠隔で見たいじゃないですか!
ということで、私が考えた方法は、何かしらが動いたら写真を撮り、それをネットのなんかでアップするという方法です!

では、今度はWebカメラで写真を撮るプログラムを作成しよう!

import cv2

cam = cv2.VideoCapture(0)
img = cam.read()[1] cv2.imwrite("sample.jpg", img)

cam.release()

↓のように撮れました!


何かしら動いたらどうして反応させるか

「フレーム差分法」というアルゴリズムを使って撮影させよう!
詳しくはこちら

んで、ソースコードをどうぞ

import cv2

save_path = "./save_image/"

camera = cv2.VideoCapture(0)

img1 = img2 = img3 = get_image(camera)

th = 300
n = 1

while True :

if cv2.waitKey(1) == 27 :

break

diff = check_image(img1, img2, img3)

cnt = cv2.countNonZero(diff)

if cnt > th :

print("taked image")
cv2.imshow('PUSH ENTER KEY', img3)
cv2.imwrite(save_path + str(n) + ".jpg", img3)
n += 1

else :

cv2.imshow('PUSH ENTER KEY', img3)
img1, img2, img3 = (img2, img3, get_image(camera))

camera.release()
cv2.destroyAllWindows()

def get_image(camera) :

img = camera.read()[1] return img

def check_image(img1, img2, img3) :

gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY)
gray3 = cv2.cvtColor(img3, cv2.COLOR_RGB2GRAY)

diff1 = cv2.absdiff(gray1, gray2)
diff2 = cv2.absdiff(gray2, gray3)

dif_and = cv2.bitwise_and(diff1, diff2)

_, dif_wb = cv2.threshold(dif_and, 30, 255, cv2.THRESH_BINARY)
diff = cv2.medianBlur(dif_wb, 5)
return diff

これで、以下のような写真が撮れました!

これらが3枚撮れて
これの差分を撮った写真がこれです!

差分だけでgifファイルを作るとこんな感じ


といった感じで、ラズパイで遊んでいます!(現在の進捗状況はここまで)
フレーム間差分法ではなく、これをTensorflowの機械学習で認識させたいので
これからも遊びたいと思います!
以上!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です