OpenCV モーション検出

Salman Mehmood 2023年10月10日
OpenCV モーション検出

この記事では、OpenCV と Python を使用してモーション検出プロジェクトを作成する方法を学習します。

OpenCV と Python を使用してモーション検出プロジェクトを作成する

まず、このプロジェクトの要件についてお話ししましょう。最初の要件は明らかに Python をインストールするために必要であり、opencv と呼ばれる外部パッケージもインストールする必要があります。

このパッケージを PC にインストールするには、コマンドプロンプトを開き、このコマンドを実行する必要があります。エディターにジャンプして、コードの記述を始めましょう。

最初にインポートするのは、必要なライブラリ cv2time です。次は、OpenCV の VideoCapture() メソッドを使用して Web サイトからデータを取得します。

Video というオブジェクトを作成しましょう。Web サイトに 0 チャネルを使用しているため、VideoCapture()0 を渡す必要があります。

import cv2
import time

Video = cv2.VideoCapture(0)
First_Frame = None

次に、ビデオを抽出するため、while True ループまたは無限ループを作成します。ビデオは、画像のスライドショー上を連続的に移動します。

次に、while ループでいくつかの命令を定義し、最初の行で、Checkframe の 2つの変数を作成し、VideoCapture() メソッドによって抽出されたデータを読み取ります。次の手順では、この抽出された画像をグレースケールに変換します。

しかし、なぜこれをグレースケールに変換するのでしょうか。これは、特徴検出の精度を高めたいためです。

cvtColor() メソッドを使用してグレースケールに変更し、2つのパラメーターがあります。最初はフレームまたはグレースケールに変換する画像で、次は COLOR_BGR2GRAY です。これは画像を灰色に変換します。

次に、画像をぼかしたり滑らかにしたりします。これにより、オブジェクトの検出やオブジェクトの動きがはるかに簡単になります。GaussianBlur() メソッドを使用してスムージングを適用し、グレースケールイメージ、カーネルサイズ、およびシグマを渡します。

while True:
    Check, frame = Video.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)

フレームが来るかどうかをチェックする if ステートメントを作成します。これは、参照フレームとして First_Frame が必要なためです。

物理学が動きについて何を言っているか見てみましょう?動きは基準点から特定され、例を挙げて説明します。

あなたが電車に座っていて、あなたにとって、木は動いていますが、動いていないとしましょう。それらはまだですが、あなたはあなたの基準点から動いています。その場合、ツリーは参照ポイントですが、フレームはこの場合の参照です。

参照フレームとして First_Frame を修正しています。参照フレームから変更が発生した場合、モーションはそこにあると言えます。

ここで、First_Frame 変数が None である場合のようなステートメントを設定します。これは最初のケースでは true です。次に、First_Frame 変数を gray 変数であるグレースケールイメージと等しくします。

if First_Frame is None:
    First_Frame = gray
    continue

absdiff() メソッドを使用して、フレーム間の違いを見つけます。デルタフレーム変数を作成し、2つのパラメーターを absdiff() メソッドに渡して比較してみましょう。

ノイズがモーションとして検出されることを望まないため、モーションが検出されるしきい値または制限を設定する必要があります。

これを行うには、threshold() メソッドを使用します。これにはいくつかのパラメーターがあります。最初は delta_frame、2 番目は強度、3 番目はこの場合は白の色合い、次に次はタプルなので THRESH_BINARY なので、最初の要素を選択する必要があります。

また、次の手順でもう 1つの平滑化レイヤーを適用する必要があります。これを行うには、dilate() と呼ばれるもう 1つの平滑化関数を使用する必要があります。これは、3つのパラメーターを受け入れます。最初はしきい値、2 番目はなし、3 番目のパラメーターは反復です。

iterations パラメーターは、スムージングがどれだけ正確になるかを定義します。このパラメータ値を増やすと、プログラムもノイズをキャプチャします。

今回は輪郭を作成しますが、輪郭とは何ですか?輪郭は、動きが起こっているポイントです。

フレームが静止していて手が動いている場合、手の部分が輪郭になります。

findContours() メソッドは輪郭を見つけるのに役立ち、3つのパラメーターを受け入れます。最初はフレームで、copy() メソッドを使用してフレーム配列のコピーを作成しています。

delta_frame = cv2.absdiff(First_Frame, gray)
Threshold_frame = cv2.threshold(delta_frame, 50, 255, cv2.THRESH_BINARY)[1]
Threshold_frame = cv2.dilate(Threshold_frame, None, iterations=2)
(cntr, _) = cv2.findContours(
    Threshold_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)

次に、反復を通じて輪郭を取得し、おおよその領域をモーションとして定義します。エリアを定義しないと、非常にノイズの多いモーション検出が得られます。

まず、輪郭領域が 1000 未満の場合はモーション領域とは見なさないことを確認し、反復を継続し、1000 を超える場合は描画します。三角形。

for contour in cntr:
    if cv2.contourArea(contour) < 1000:
        continue

findContours() メソッドは 4つの値 (x, y, height, width) を提供し、長方形の領域をバインドする boundingRect() メソッドを使用してこれらのポイントを抽出します。次に、rectangle() メソッドを使用して長方形を作成します。

最初のパラメータは、長方形を描画するフレームまたは画像です。次は (x,y) 座標点、次は高さと幅、次はフレームの色、最後のパラメータは長方形を描くために選択したペンのサイズです。

(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)

完全なソースコード:

import cv2
import time

Video = cv2.VideoCapture(0)
First_Frame = None

while True:
    Check, frame = Video.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    if First_Frame is None:
        First_Frame = gray
        continue
    delta_frame = cv2.absdiff(First_Frame, gray)
    Threshold_frame = cv2.threshold(delta_frame, 50, 255, cv2.THRESH_BINARY)[1]
    Threshold_frame = cv2.dilate(Threshold_frame, None, iterations=2)
    (cntr, _) = cv2.findContours(
        Threshold_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
    )
    for contour in cntr:
        if cv2.contourArea(contour) < 1000:
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
    cv2.imshow("Frame", frame)
    Key = cv2.waitKey(1)
    if Key == ord("q"):
        break

Video.release()
cv2.destroyAllWindows()

これで、手が動いているときにモーション検出が行われることがわかります。

OpenCV と Python を使用してモーション検出プロジェクトを作成する

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - OpenCV Video