1. ホーム
  2. OpenCV

(OpenCV+Python)-ターゲットトラッキング、バックグラウンドセグメンテーションツール。KNN、MOG2、GMG

2022-02-28 23:35:45
<パス

OpenCV には,前景と背景を分割する際に便利な BackgroundSubtractor というクラスがあります.
OpenCV3 には,K-Nearest (KNN), Mixture of Gaussians (MOG2), Geometric Multigid (GMG) の3種類の背景スプリッタが用意されています.

BackgroundSubtractorクラスは動画解析に特化しており、すなわち、BackgroundSubtractorクラスはフレームごとに環境を"学習"し、タイムラプス法による運動解析の結果を向上させるために使用することができます。

import cv2

camera = cv2.VideoCapture(0) # parameter 0 means the first camera
mog = cv2.createBackgroundSubtractorMOG2()

while (1):
    grabbed, frame_lwpCV = camera.read()
    fgmask = mog.apply(frame_lwpCV)
    cv2.imshow('frame', fgmask)
    key = cv2.waitKey(1) & 0xFF
    # Press the 'q' key to exit the loop
    if key == ord('q'):
        break
camera.release()
cv2.destroyAllWindows()



<イグ


BackgroundSubtractorクラスのもう一つの重要な機能は、影を計算する機能である。これは、ビデオフレームを正確に読み取るために絶対に必要な機能です。影を検出することで、検出された画像の影の部分を(閾値処理を用いて)除外し、実際の特徴に注目することができます。

import cv2
import numpy as np

camera = cv2.VideoCapture(0) # parameter 0 means the first camera
bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
while True:
    grabbed, frame_lwpCV = camera.read()
    fgmask = bs.apply(frame_lwpCV) # background splitter, this function computes the foreground mask
    # binary thresholding, the foreground mask contains the white value of the foreground as well as the gray value of the shadow, in thresholding the image, all pixels that are not pure white (244~255) are set to 0 instead of 255
    th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
    # The following is the same method as in basic motion detection, identifying the target, detecting the contours, and drawing the results on the original frame
    dilated = cv2.dilate(th, es, iterations=2) # morphological expansion
    image, contours, hierarchy = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # This function calculates the contours of a target in an image
    for c in contours:
        if cv2.contourArea(c) > 1600:
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame_lwpCV, (x, y), (x + w, y + h), (255, 255, 0), 2)

    cv2.imshow('mog', fgmask)
    cv2.imshow('thresh', th)
    cv2.imshow('detection', frame_lwpCV)
    key = cv2.waitKey(1) & 0xFF
    # Press the 'q' key to exit the loop
    if key == ord('q'):
        break
# When everything is done, release the capture
camera.release()
cv2.destroyAllWindows()


<イグ
左から順に、検出されたモーションターゲット、背景セグメンテーション、閾値処理後の背景セグメンテーション