前提・実現したいこと
python言語でonpencvを使い動きを検知し写真を撮ってくれるプログラムを作りたいと思いました。
参考サイト: https://news.mynavi.jp/article/zeropython-35/
そこで毎日その日付のファイルを作るプログラムを作り(1月1日に1月1日というファイル,
1月2日に1月2日というファイル....)そこに写真が入るプログラムを作ることにしました。
書けたのはよかったですが何故か動体検知カメラだけがonになりファイルが作成されませんでした。
なのでどちらも実行する方法が知りたいです。
該当のソースコード
python
1mport cv2 2import time 3import datetime 4import os 5import schedule 6 7 8today = datetime.date.today() 9now = datetime.datetime.now() 10# 保存パスの指定 11save_path = "./" 12 13 14 15 16def main(): 17 # カメラのキャプチャを開始 18 cam = cv2.VideoCapture(0) 19 # フレームの初期化 --- (*1) 20 img1 = img2 = img3 = get_image(cam) 21 th = 300 22 num = 1 23 while True: 24 # Enterキーが押されたら終了 25 if cv2.waitKey(1) == 13: 26 break 27 # 差分を調べる --- (*2) 28 diff = check_image(img1, img2, img3) 29 # 差分がthの値以上なら動きがあったと判定 --- (*3) 30 cnt = cv2.countNonZero(diff) 31 if cnt > th: 32 print("カメラに動きを検出") 33 cv2.imshow('PUSH ENTER KEY', img3) 34 # 写真を画像 --- (*4) 35 # cv2.imwrite(shutil.move(str(num) + ".jpg", str(today)), img3) 36 cv2.imwrite(save_path + str(num) + ".jpg", img3) 37 num += 1 38 else: 39 cv2.imshow('PUSH ENTER KEY', diff) 40 # 比較用の画像を保存 --- (*5) 41 img1, img2, img3 = (img2, img3, get_image(cam)) 42 # 後始末 43 cam.release() 44 cv2.destroyAllWindows() 45 46# 画像に動きがあったか調べる関数 47def check_image(img1, img2, img3): 48 # グレイスケール画像に変換 --- (*6) 49 gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY) 50 gray2 = cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY) 51 gray3 = cv2.cvtColor(img3, cv2.COLOR_RGB2GRAY) 52 # 絶対差分を調べる --- (*7) 53 diff1 = cv2.absdiff(gray1, gray2) 54 diff2 = cv2.absdiff(gray2, gray3) 55 # 論理積を調べる --- (*8) 56 diff_and = cv2.bitwise_and(diff1, diff2) 57 # 白黒二値化 --- (*9) 58 _, diff_wb = cv2.threshold(diff_and, 30, 255, cv2.THRESH_BINARY) 59 # ノイズの除去 --- (*10) 60 diff = cv2.medianBlur(diff_wb, 5) 61 return diff 62 63# カメラから画像を取得する 64def get_image(cam): 65 img = cam.read()[1] 66 img = cv2.resize(img, (600, 400)) 67 return img 68 69 70# 毎日ディレクトリ作成 71def create_file_everyday(): 72 if not os.path.exists(str(now)): 73 os.mkdir(str(now)) 74 print(str(now) + 'のファイルが作成されました') 75 else: 76 print('ファイルが作れませんでした') 77 78 79schedule.every(15).seconds.do(create_file_everyday) 80 81main() 82 83while True: 84 schedule.run_pending() 85 time.sleep(1)
試したこと
関数を呼び出す位置を変更 = 失敗
def create_file_everyday():の関数をmain関数より上に持っていった = 失敗
プログラムをファイルごとに分け実行 = 失敗
main()の名前がダメなのかと思い違う関数名に変更 = 失敗
補足情報(FW/ツールのバージョンなど)
def main() 〜 def get_imageは上記サイトのフルコピです。
テストのため15秒ごとにその時のファイルを作るプログラムにしてます。
特にエラーは出ていなかったので記述しておりません。
pycharm, MacBook Mac OS Big Sur ver 11.1, python 3.9.0
以上追記が必要な場合言ってください。よろしくお願いします。
あなたの回答
tips
プレビュー