前提・実現したいこと
ここに質問の内容を詳しく書いてください。
①Pythonを使用し自作の監視カメラを作ったのですが、
img1、img2、img3をどうして初期化する必要があるのですか?
②フレーム差分法で、グレースケールにする理由
画像との差分を抽出する理由
論理積を調べる理由
画像を二値化にする理由
ノイズを除去する理由
これらの理由が知りたいです
該当のソースコード
Python
1ソースコード
import cv2
import os
保存パスの指定
save_path = "./gray_image/camera_capture_"
def main():
# カメラのキャプチャを開始 カメラの番号は、内蔵カメラが0、USBで追加のカメラを接続すると1 #基本的に0から順番に割り当てられる cam = cv2.VideoCapture(0) # フレームの初期化 img1 img2 img3 と一枚、一枚と変化している画像を格納している。 #画像配列[高さ、幅、RGB] (3次元配列) img1 = img2 = img3 = camera(cam) # 保存 th =70 num = 1 while True: # Enterキーが押されたら終了 if cv2.waitKey(1) == 13: break # 差分を調べる print(img1) diff = checkimage(img1, img2, img3) # 差分がthの値以上なら動きがあったと判定 cnt = cv2.countNonZero(diff)#countNoneroは面積計測をする print(cnt) if cnt > th: print("カメラに動きを検出") #画像をウィンドウ上に表示するためのもの,# # 第1引数は文字列型で指定するウィンドウ名です.第2引数は表示したい画像です cv2.imshow('PUSH', img3) #すでにファイルがあるかどうかをチェックするためのもの( os.path.exists) while os.path.exists( save_path + str(num) + ".jpg"): num += 1 # 画像を保存 cv2.imwrite(save_path + str(num) + ".jpg", img3) else: cv2.imshow('PUSH', diff) # 比較用の画像を保存 img1, img2, img3 = (img2, img3, camera(cam)) # 後始末 # カメラを使った処理には開放粗利が必要 cam.release() # Windowを開いた場合は閉じる処理が必要 cv2.destroyAllWindows()
画像に動きがあったか調べる関数 フレーム差分法を使用
#フレーム間差分とは、背景差分とは違い背景画像を用意する必要がなく、連続画像の差分から動体検知をすることができる。
#IMREAD_GRAYSCALE : グレースケール画像として読み込む
def checkimage(img1, img2, img3):
# グレイスケール画像に変換 読み取りの精度を上げるため
gray1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY)
gray3 = cv2.cvtColor(img3, cv2.COLOR_RGB2GRAY)
# 画像との差分を抽出 変数名(今回はimg_diff)= cv2,absdiff(変化後の画像,変化前の画像) diff1 = cv2.absdiff(gray1, gray2) diff2 = cv2.absdiff(gray2, gray3) # 論理積を調べる diff_and = cv2.bitwise_and(diff1, diff2,) # 白黒二値化 img_th(変数名) = cv2.threshold(使用数画像,閾値最小値,閾値最大値,閾値処理の種類) _, diff_wb = cv2.threshold(diff_and, 50, 255, cv2.THRESH_BINARY) # ノイズの除去 diff = cv2.medianBlur(diff_wb, 5) return diff
カメラから画像を取得する
def camera(cam):
img = cam.read() img = cv2.resize(img, (800, 800))#画像の大きさを変える(resize) return img
モジュールを直接実行した時だけ、実行したいコード
#Pythonスクリプトを直接実行した時には、そのスクリプトファイルは「main」という名前のモジュールとして認識される
#そのため、スクリプトファイルを直接実行すると__name__変数の中に自動で'main'という値が代入される
if name == 'main':
main()
試したこと
ここに問題に対して試したことを記載してください。
printを使って変数の中身を確認した
補足情報(FW/ツールのバージョンなど)
PyCharm
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー