PYTHON WORK

【Python】簡単に監視カメラを作る方法!コードあり

2021-11-08

こんな方におすすめ

  • python勉強したけど、AIっぽいことしてみたい
  • 上司にpythonをできることをアピールしたい
  • ずっと動画を撮ると容量すごくて結局見ないから、変化があったときの写真だけ撮りたい

どうも、わやです。

かなり久しぶりの投稿になりますが、ちょくちょくpythonを勉強して仕事にで使いだしてます。

 

ある業務で、

〇〇っていう長時間かかる実験やってるだけど、急に止まっちゃったときになんで止まったか原因知る方法ないかな?

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

 

動画撮るのも考えたけど1ヶ月取り続けるとすごいサイズになるし、見返すもの大変なんだよね
うーん、それじゃあカメラの映像に動きがあったときだけ写真取るようにするのはどうかな?
わや
そんなことできるの?
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時間もあれば上記のプログラムを作成できる、すごいことですね。

  • この記事を書いた人

わや

大手メーカーで働く30歳研究職。機械設計やったりプログミングやったりと結構マルチタイプ エンジニア向けの情報を発信するので、記事を見て気に入ってもらえたら嬉しい。

-PYTHON, WORK