Maison  >  Article  >  développement back-end  >  Comment Python OpenCV utilise-t-il la méthode de séparation en arrière-plan ?

Comment Python OpenCV utilise-t-il la méthode de séparation en arrière-plan ?

王林
王林avant
2023-05-16 21:09:151267parcourir

Théorie

  • La séparation d'arrière-plan (BS) est une technique courante pour générer un masque de premier plan (une image binaire contenant des pixels appartenant à des objets en mouvement dans la scène) à l'aide d'une caméra statique

  • Comme son nom l'indique, BS calcule le masque de premier plan , effectue une soustraction entre l'image actuelle et le modèle d'arrière-plan, qui contient la partie statique de la scène et tout ce qui peut être considéré comme arrière-plan, en tenant compte des caractéristiques de la scène observée.

  • La modélisation de l'arrière-plan comprend deux étapes principales :

    • 1. Initialisation de l'arrière-plan

    • 2. le modèle est mis à jour. Pour s'adapter aux changements possibles dans la scène

la mise en œuvre

donne à l'utilisateur la possibilité de traiter des fichiers vidéo ou des séquences d'images. Dans cet exemple, cv2.BackgroundSubtractorMOG2 sera utilisé pour générer le masque de premier plan. 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))

    Analyse du code

    Analysez les principales parties du code ci-dessus :
  • L'objet cv2.BackgroundSubtractor sera utilisé pour générer le masque de premier plan. Dans cet exemple, les paramètres par défaut sont utilisés, mais des paramètres spécifiques peuvent également être déclarés dans la fonction create.

  • # show the current frame and the fg masks
        cv2.imshow('Frame', frame)
        cv2.imshow('FG Mask', fgMask)
🎜🎜cv2.VideoCapture est utilisé pour lire la vidéo d'entrée ou la séquence d'images d'entrée 🎜🎜🎜rrreee🎜🎜🎜Chaque image est utilisée pour calculer le masque de premier plan et mettre à jour l'arrière-plan . Si vous souhaitez modifier le taux d'apprentissage utilisé pour mettre à jour le modèle d'arrière-plan, vous pouvez définir un taux d'apprentissage spécifique en passant des paramètres à la méthode apply 🎜🎜🎜rrreee🎜🎜🎜Le numéro d'image actuel peut être obtenu de cv2. Extrait de l'objet Videocapture et pointé dans le coin supérieur gauche de l'image actuelle. Utilisez un rectangle blanc pour mettre en surbrillance le numéro du cadre noir🎜🎜🎜rrreee🎜🎜🎜Afficher le cadre d'entrée actuel et le résultat🎜🎜🎜rrreee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer