cat-rec

この記事は約7分で読めます。

野良猫の自動撮影

GitHub
GitHub - choko1229/cat-rec: 野良猫の撮影 ~家に来る野良猫の撮影~
野良猫の撮影 ~家に来る野良猫の撮影~. Contribute to choko1229/cat-rec development by creating an account on GitHub.

cat-recとは

家によく来る野良猫を自動撮影するものを作成しました。

使ったのも

機器

サーバーCPU:core i7 8700RAM:32GiBOS:Ubuntu

Webカメラ:C270

ソフトウェア

Python-3.10.6numpy-1.23.3opencv-python-4.6.0.66opencv-contrib-python-4.6.0.66

作ったもの(ソースコード)

ソースコード(画像保存用)

import cv2
# 保存パスの指定
save_path = "./save/"
def main():
    # カメラのキャプチャを開始
    cam = cv2.VideoCapture(0)
    # フレームの初期化
    img1 = img2 = img3 = get_image(cam)
    th = 300
    num = 1
    while True:
        # Enterキーが押されたら終了
        if cv2.waitKey(1) == 13: break
        # 差分を調べる
        diff = check_image(img1, img2, img3)
        # 差分がthの値以上なら動きがあったと判定
        cnt = cv2.countNonZero(diff)
        if cnt > th:
            print("カメラに動きを検出")
            cv2.imshow('PUSH ENTER KEY', img3)
            # 写真を画像
            cv2.imwrite(save_path + "output" + ".jpg", img3)
            num += 1
        else:
            cv2.imshow('PUSH ENTER KEY', diff)
        # 比較用の画像を保存
        img1, img2, img3 = (img2, img3, get_image(cam))
    # 後始末
    cam.release()
    cv2.destroyAllWindows()
# 画像に動きがあったか調べる関数
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)
    # 論理積を調べる
    diff_and = cv2.bitwise_and(diff1, diff2)
    # 白黒二値化
    _, diff_wb = cv2.threshold(diff_and, 30, 255, cv2.THRESH_BINARY)
    # ノイズの除去
    diff = cv2.medianBlur(diff_wb, 5)
    return diff
# カメラから画像を取得する
def get_image(cam):
    img = cam.read()[1]
    img = cv2.resize(img, (1080, 720))
    return img
main()

ソースコード(Web公開用)

import os
import shutil
import datetime
import time
#無限ループ
while True:
#出力先フォルダを選択
 os.chdir('/media/choko1229/server/Dev/cat-rec/save/')
#output.jpgを探す
 if "output.jpg" in os.listdir():
  cmo = 99
  csa = 100
  time.sleep(0.01)
#output.jpgを0.jpgとしてWeb公開ページに移動
  shutil.move("/media/choko1229/server/Dev/cat-rec/save/output.jpg", "/var/www/html/dev/cat-rec/img/0.jpg")
#Web公開フォルダを選択
  os.chdir('/var/www/html/dev/cat-rec/img/')
#処理が完了するまでループ
  while csa > 0:
#n.jpgをn+1.jpgに変更
   os.rename(str(cmo) + ".jpg",str(csa) + ".jpg")
   cmo -= 1
   csa -= 1
  print("ファイルを移動しました。")
  print(datetime.datetime.now())
 else:
  pass

ソースコード(Web-HTML)

<!DOCTYPE html>
<html>
<head>
  <title>cat-rec</title>
  <meta charset="UTF-8">
</head>
<body>
  <h1>野良猫の撮影</h1>
  <p>野良猫の撮影記録</p>
  <!--画像-->
 <p>No.1
  <p>
  <a href="img/1.jpg">
<img src="img/1.jpg" alt="ログ1" width="10%" height="10%"/>
  </a>
<p>No.2
  <p>
  <a href="img/2.jpg">
<img src="img/2.jpg" alt="ログ2" width="10%" height="10%"/>
  </a>
<p>No.3
  <p>
  <a href="img/3.jpg">
<img src="img/3.jpg" alt="ログ3" width="10%" height="10%"/>
  </a>
.
.
.
<p>No.99
  <p>
  <a href="img/99.jpg">
<img src="img/99.jpg" alt="ログ99" width="10%" height="10%"/>
  </a>
<p>No.100
  <p>
  <a href="img/100.jpg">
<img src="img/100.jpg" alt="ログ100" width="10%" height="10%"/>
  </a>
</p>
</body>
</html>

実際に動かしてみた

動体検知プログラム実行の様子

カメラ内に動きを検知した場合その画像を保存する。
画像を保存したらコンソールに保存したことを通知する。

Web公開用プログラムの実行の様子

動体検知プログラムで保存された”outoput.jpg”
をWeb公開用フォルダに移動する。
移動時に”0jpg”に変更する。
フォルダ内のファイルの名前を変更する
・”99.jpg”を”100.jpg”
・”98.jpg”を”99.jpg”
・”97.jpg”を”98.jpg”
のように数字を1つずつ上げていく。

公開されたWebページ

移動されたファイルを読み取って表示しています。

タイトルとURLをコピーしました