こんにちは Keita Nakamorです。久々の投稿です。
今日は、webカメラとOpenCVで動体検知してLine Notifyで画像を通知する 、ってことをやってみます。
予めアクセストークンをLine Notifyでとっておいて下さい。Bearer <ここにアクセストークンをはる> ってところに貼り付けます。<>は入りませんよ。
久々すぎるのでOpenCVの基礎からやっていきます。
Contents
ステップ1:静止画像ファイルを読み込んで出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ステップ1:静止画像ファイルを読み込んで出力する import os import cv2 import numpy as np img =cv2.imread('Pictures/Screenpresso/2020-03-27_17h43_20.png') # 画像サイズを調べる img.shape # (1040, 1920, 3) # BGR の数値を確認する img[0][0] # array([65, 63, 60], dtype=uint8) # 画像を出力する cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() # 画像をファイルに出力する #os.mkdir('./output') cv2.imwrite('output/test.jpg', img) |
ステップ2動画ファイルを読み込んで出力する→リアルタイムキャプチャーする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# ステップ2動画ファイルを読み込んで出力する→リアルタイムキャプチャーする import cv2 import numpy as np import sys '''# 動画を読み込む cap = cv2.VideoCapture('output/test.avi') ''' # リアルタイムキャプチャーする cap = cv2.VideoCapture(0) # 動画読み込みが失敗したら強制終了 if cap.isOpened() == False: print('読み込み失敗') sys.exit() #1フレームだけ読み込む ret, frame = cap.read() h, w, color = frame.shape # h,wの順 3つ目は色数 # 書き込み設定(コーデックの指定) fourcc = cv2.VideoWriter_fourcc(*'XVID') dst = cv2.VideoWriter('output/test001.avi', fourcc, 30.0, (w,h)) # ファイル名 設定 fps 解像度の順 # スクリプト実行 while True: ret, frame = cap.read() if ret == False: break # 表示 cv2.imshow('img', frame) # 書き込み dst.write(frame) # 停止動作 if cv2.waitKey(30) == 27: # ESC=27 break # 終了処理 cv2.destroyAllWindows() cap.release() |
ステップ3 リアルタイムキャプチャー と リアルタイム背景差分処理
アクセストークンは、Line Notifyから取得して<>内にコピペしてください。かっこ部分は削除してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# ステップ3 リアルタイムキャプチャー と リアルタイム背景差分処理 import cv2 import numpy as np import sys import time import datetime import requests def line_informer(file_name): # 条件 : request_headers = {'Authorization': 'Bearer <ここにアクセストークンをはる>'} payload = {'message': 'Detected {}.'.format(datetime.datetime.now())} #files = {'imageFile': open("dorobou_picking.png", "rb")} #バイナリファイルを開く files = {'imageFile': open('output/' + file_name , "rb")} # 通知系 API のエンドポイントのホスト名は notify-api.line.me #r = requests.post('https://notify-api.line.me/api/notify', headers=request_headers, data=payload) r = requests.post('https://notify-api.line.me/api/notify', headers=request_headers, data=payload, files=files) print(r.json()) def line_informer_start(): #スクリプトが実行されたことを通知する payload = {'message': 'Monitoring Start' } request_headers = {'Authorization': 'Bearer <ここにアクセストークンをはる>'} # 通知系 API のエンドポイントのホスト名は notify-api.line.me r = requests.post('https://notify-api.line.me/api/notify', headers=request_headers, data=payload) print(r.json()) line_informer_start() '''# テスト用:動画を読み込む cap = cv2.VideoCapture('output/test.avi') ''' # リアルタイムキャプチャーする cap = cv2.VideoCapture(0) # 動画読み込みが失敗したら強制終了 if cap.isOpened() == False: print('読み込み失敗') sys.exit() #1フレームだけ読み込んで h ,w を取り出す ret, frame = cap.read() h, w, ch = frame.shape # h,wの順 3つ目は色数 # 書き込み設定(コーデックの指定) time_str = str(datetime.datetime.now()) file_name = time_str[:10]+ '_' +time_str[11:13]+ time_str[14:16] + time_str[17:19] + '.avi' print(time_str) fourcc = cv2.VideoWriter_fourcc(*'XVID') fps =30 dst = cv2.VideoWriter('output/' + file_name, fourcc, fps, (w,h)) # ファイル名 設定 fps 解像度の順 # 背景差分の行列領域を確保 frame_back = np.zeros((h,w,ch),dtype=np.float32) # アラート時間インターバルの初期化 previous_datetime = datetime.datetime.now() # スクリプト実行 while True: ret, frame = cap.read() if ret == False: break # 画像処理 #frame2 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # グレースケール frame3= cv2.absdiff(frame.astype(np.float32), frame_back) # 背景差分 cv2.accumulateWeighted(frame,frame_back, 0.2) # 差分の大きさ pix_value= int(frame3.sum()/10000) cv2.putText(frame, 'Pix_value:{}'.format(pix_value), (0, 50), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv2.LINE_AA) cv2.putText(frame3, 'Pix_value:{}'.format(pix_value), (0, 50), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv2.LINE_AA) # しきい値としきい値を超えたときに録画REC表示する sreshold = 500 if pix_value > sreshold: # ラインに通知する(ただし 前回通知から30sec以上間隔をあけること) time_delta = datetime.datetime.now() - previous_datetime if time_delta.seconds > 10: # 画像をファイルに出力する #os.mkdir('./output') time_str = str(datetime.datetime.now()) file_name = time_str[:10]+ '_' +time_str[11:13]+ time_str[14:16] + time_str[17:19] + '.jpg' cv2.imwrite('output/' + file_name, frame) line_informer(file_name) previous_datetime = datetime.datetime.now() # REC表示 cv2.putText(frame, 'Jadge:{}'.format('REC'), (0, 100), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv2.LINE_AA) cv2.putText(frame3, 'Jadge:{}'.format('REC'), (0, 100), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 5, cv2.LINE_AA) # REC保存 dst.write(frame) # リアルタイム表示 cv2.imshow('img', frame) #cv2.imshow('img2', frame2) #グレースケール cv2.imshow('img3', frame3.astype(np.uint8)) # 背景差分 # 停止動作 if cv2.waitKey(30) == 27: # ESC=27 break # 終了処理 cv2.destroyAllWindows() cap.release() |
以上
The following two tabs change content below.
Keita N
最新記事 by Keita N (全て見る)
- 2024/1/13 ビットコインETFの取引開始:新たな時代の幕開け - 2024年1月13日
- 2024/1/5 日本ビジネスにおける変革の必要性とその方向性 - 2024年1月6日
- 2024/1/3 アメリカ債権ETFの見通しと最新動向 - 2024年1月3日