質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1161閲覧

フレーム差分法での一つ一つの処理の理由

ikum

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/01/29 11:53

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
①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
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/01/29 11:58

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
退会済みユーザー

退会済みユーザー

2021/01/30 00:12 編集

https://teratail.com/questions/319357 とセットな感じ(誤って編集ではなく新しく投稿してしまった)でしょうか?とりあえず上のリンク先に回答をしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問