ホームページ  >  記事  >  バックエンド開発  >  Python OpenCV はバックグラウンド分離方法をどのように使用しますか?

Python OpenCV はバックグラウンド分離方法をどのように使用しますか?

王林
王林転載
2023-05-16 21:09:151262ブラウズ

理論

  • 背景分離 (BS) は、静的カメラを使用して前景マスク (シーン内の移動オブジェクトに属するピクセルを含むバイナリ イメージ) を生成するための一般的な手法です

  • 名前が示すように、BS は前景マスクを計算し、現在のフレームとシーンの静的部分を含む背景モデルの間で減算演算を実行します。これは次のように表示されます。すべての背景。

  • #バックグラウンド モデリングには、次の 2 つの主要な手順が含まれます:

    • ##1. バックグラウンドの初期化
    • 2. 背景の更新 最初のステップでは、背景の初期モデルを計算します。2 番目のステップでは、シーン内で起こり得る変化に適応するためにモデルが更新されます。
    • #実装

      ユーザーがビデオ ファイルまたは画像シーケンスを処理することを選択できるようにします。この例では、
    • cv2.BackgroundSubtractorMOG2
    を使用して前景マスクを生成します。
from __future__ import print_function
import cv2
import argparse
parser = argparse.ArgumentParser(
            description='This program shows how to use background subtraction methods provided by OpenCV. You can process both videos and images.')
parser.add_argument('--input', type=str, help='Path to a video or a sequence of image.', default='vtest.avi')
parser.add_argument('--algo', type=str, help='Background subtraction method (KNN, MOG2).', default='MOG2')
args = parser.parse_args()
## [create]
# create Background Subtractor objects
if args.algo == 'MOG2':
    backSub = cv2.createBackgroundSubtractorMOG2()
else:
    backSub = cv2.createBackgroundSubtractorKNN()
## [create]
## [capture]
capture = cv2.VideoCapture(args.input)
if not capture.isOpened():
    print('Unable to open: ' + args.input)
    exit(0)
## [capture]
while True:
    ret, frame = capture.read()
    if frame is None:
        break
    ## [apply]
    # update the background model
    fgMask = backSub.apply(frame)
    ## [apply]
    ## [display_frame_number]
    # get the frame number and write it on the current frame
    cv2.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)
    cv2.putText(frame, str(capture.get(cv2.CAP_PROP_POS_FRAMES)), (15, 15),
               cv2.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
    ## [display_frame_number]
    ## [show]
    # show the current frame and the fg masks
    cv2.imshow('Frame', frame)
    cv2.imshow('FG Mask', fgMask)
    ## [show]
    keyboard = cv2.waitKey(30)
    if keyboard == 'q' or keyboard == 27:
        break

コード分析

上記のコードの主要部分を分析します:

##cv2.BackgroundSubtractor

オブジェクトは次の目的で使用されます。フォアグラウンドマスクコードを生成します。この例ではデフォルトのパラメータが使用されていますが、

create

関数で特定のパラメータを宣言することもできます。
  • # create Background Subtractor objects  KNN or MOG2
    if args.algo == 'MOG2':
        backSub = cv2.createBackgroundSubtractorMOG2()
    else:
        backSub = cv2.createBackgroundSubtractorKNN()
    cv2.VideoCapture

    オブジェクトは入力ビデオまたは入力画像シーケンスを読み取るために使用されます
    capture = cv2.VideoCapture(args.input)
    if not capture.isOpened:
        print('Unable to open: ' + args.input)
        exit(0)
  • 各フレームは、前景マスクを計算し、背景を更新するために使用されます

    。バックグラウンド モデルの更新に使用される学習率を変更する場合は、引数を
  • apply
メソッド
  • # update the background model
        fgMask = backSub.apply(frame)
    ## に渡すことで、特定の学習率を設定できます。 #現在のフレーム番号は、cv2.Videocapture オブジェクトから抽出して、現在のフレームの左上隅に打ち込むことができます。白い四角形を使用して黒いフレーム番号を強調表示します

 # get the frame number and write it on the current frame
    cv2.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)
    cv2.putText(frame, str(capture.get(cv2.CAP_PROP_POS_FRAMES)), (15, 15),
               cv2.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
  • 現在の入力フレームと結果を表示します

    # show the current frame and the fg masks
        cv2.imshow('Frame', frame)
        cv2.imshow('FG Mask', fgMask)

以上がPython OpenCV はバックグラウンド分離方法をどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。