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

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

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

5228閲覧

動体検出のプログラム(cv2.accumulateWeighted)について質問させてください

mamonPro

総合スコア38

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/14 00:01

前後のフレームの差から動体検出をするプログラムを勉強しています。
参考URL
OpenCVを利用して動画(カメラ)から動体検知をする方法について

Python

1#avgにデータが入っていない場合はgrayのデータフレームをコピーする 2if avg is None: 3 avg = gray.copy().astype("float") 4 continue 5#現在のフレームと移動平均との間の差を計算する 6cv2.accumulateWeighted(gray, avg, 0.5) 7frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg)) 8#二値化する 9thresh = cv2.threshold(frameDelta, 3, 255, cv2.THRESH_BINARY)[1]

この手法を割と多くのWebサイトで紹介されているのを見かけますが
現在のフレームと移動平均との間の差を計算する
cv2.accumulateWeighted(gray, avg, 0.5)
この部分について公式のTipsを見たりしたのですが
意味を理解しかねております。

今までよくわかっていないまま
前後のフレームを比較して差が生じたところを
3つ目の引数のパラメータを操作しながら顕著化するものとばかり
思っていたのですが、そうではないのでしょうか。

また、以下の文以降、avg = gray.copy().astype("float")はどこにも記述されていないのですが
ずっと一番最初に取得したavgを比較対象にしているということでしょうか。

Python

1#avgにデータが入っていない場合はgrayのデータフレームをコピーする 2if avg is None: 3 avg = gray.copy().astype("float") 4 continue

無知で申し訳ありませんが
どなたかもう少しかみ砕いてご教授お願いできませんでしょうか。

なお、こちらのURLで紹介されている方法は毎フレームごとに比較をしているのは
コードを見て理解できました。
OpenCVで動体検知をトライ(フレーム間差分法)

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

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

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

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

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

guest

回答1

0

私はpythonできない人ですが…

そのコードは毎フレーム実行するのですよね?
で,各フレームの入力画像は gray である,と.

if avg is None
avg = gray.copy().astype("float")

これは,「初回(1フレーム目の処理の際)に,avg の内容をgrayの内容のコピーとする」という話でしょう.
(で,初回の処理でこの avg =... が行われるので,次回以降ではこのifの条件を満たさなくなる.)

2フレーム目以降では,

cv2.accumulateWeighted(gray, avg, 0.5)

としてavgを更新しています.
accumulateWeightedの意味はCVのリファレンスを見た方が早いです(というか,わからんやつについてはリファレンスなりを見ましょう).
ここでは,avg = gray*0.5 + avg*0.5としてavgの内容を gray を用いて更新しています.
簡便なのでよくやる手です.(0.5はデカすぎると思うけど)
(イメージが湧かないなら,何か適当な数列でこの計算をやってみればよいかと)

あとは,avgとgrayの差を取っているだけですね.

投稿2020/07/14 01:19

編集2020/07/14 01:24
fana

総合スコア11996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問