こんな方におすすめ
- python勉強したけど、AIっぽいことしてみたい
- 上司にpythonをできることをアピールしたい
- ずっと動画を撮ると容量すごくて結局見ないから、変化があったときの写真だけ撮りたい
どうも、わやです。
かなり久しぶりの投稿になりますが、ちょくちょくpythonを勉強して仕事にで使いだしてます。
ある業務で、

と相談を持ちかけられました。





ということがあったので、PCのカメラを使って映像に動きがあったら写真を撮るというプログラムを作ってみました。
作ってみた感じかなり動作良くて、汎用性は高いので参考にされる方はご自身の環境にあうように改造してください。
この記事は半分メモみたいなものなので、見づらかったら申し訳ないです。。
準備:環境を整える
まずは準備です。
といってもやることはほとんどなくて、カメラ付きのノートPCを一台準備するだけです。
必要なもの
カメラ付きノートPC
あとは、phthonを使える環境を整えてください。
おそらくこのページに来られた方ならすでにpython環境を整えられてると思いますので不要かと思いますが、後々解説ページ作ろうかな。
プログラム作成
さて、それでは早速ですが、私が作成したプログラムを載せますね。
どこか間違っていてうまくいかないければコメント等で教えて下さい。
4行目のsave_pathには、写真を保存するファイルを作成しリンクを記入ください。
import cv2
#保存パスの指定
save_path= "保存先リンクを書くこと"
def main():
#カメラのキャプチャを開始
cam = cv2.VideoCapture(0)
#フレームの初期化(*1)
img1 = img2 = img3 = get_image(cam)
th=300
num=1
while True:
#Enterキーが押されたら終了
if cv2.waitKey(1)== 13: break
#差分を調べる ---(*2)
diff = check_image(img1, img2, img3)
#差分がthの値以上なら動きがあったと判定---(*3)
cnt= cv2.countNonZero (diff)
if cnt > th:
print("カメラに動きを検出")
cv2.imshow('PUSH ENTER KEY', img3)
#写真を画像 - (*4)
cv2.imwrite(save_path + str(num) + ".jpg", img3)
num += 1
else:
cv2.imshow('PUSH ENTER KEY',diff)
#比較用の画像を保存---(*5)
img1, img2, img3 = (img2, img3, get_image(cam))
#後始末
cam.release()
cv2.destroyAllWindows()
#画像に動きがあったか調べる関数
def check_image(img1, img2, img3):
#グレイスケール画像に変換 --- (*6)
gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY)
gray3 = cv2.cvtColor(img3, cv2.COLOR_RGB2GRAY)
#絶対差分を調べる ---(*7)
diff1 = cv2.absdiff(gray1, gray2)
diff2 = cv2.absdiff(gray2, gray3)
#論理積を調べる --- (*8)
diff_and = cv2.bitwise_and (diff1, diff2)
# 白黒二値化 -- (*9)
_, diff_wb = cv2.threshold(diff_and, 30, 255, cv2.THRESH_BINARY)
#ノイズの除去 --- (10)
diff = cv2.medianBlur(diff_wb, 5)
return diff
#カメラから画像を取得する
def get_image(cam):
img = cam.read() [1]
img = cv2.resize (img, (600, 400))
return img
main()
かなり簡単ですが、PCのカメラを使ってドラレコのように動きがあると写真が保存されます。
お試しにご自身のPCでご利用してみてください。
結論:pythonを使えば簡単に監視カメラライクなプログラムを作成できる
pythonってほんとに便利なプログラムだと思います。
プログラムをがっつりする業務ではない私でも1時間もあれば上記のプログラムを作成できる、すごいことですね。