Maison > développement back-end > Tutoriel Python > 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 ?

王林
Libérer: 2023-05-16 21:09:15
avant
1315 Les gens l'ont consulté

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
Copier après la connexion

代码分析

分析上面代码的主要部分:

  • cv2.BackgroundSubtractor对象将用于生成前景掩码。在此示例中,使用了默认参数,但是也可以在create函数中声明特定的参数。

# create Background Subtractor objects  KNN or MOG2
if args.algo == 'MOG2':
    backSub = cv2.createBackgroundSubtractorMOG2()
else:
    backSub = cv2.createBackgroundSubtractorKNN()
Copier après la connexion
  • cv2.VideoCapture对象用于读取输入视频或输入图像序列

capture = cv2.VideoCapture(args.input)
if not capture.isOpened:
    print('Unable to open: ' + args.input)
    exit(0)
Copier après la connexion
  • 每帧都用于计算前景掩码和更新背景。如果要更改用于更新背景模型的学习率,可以通过将参数传递给apply方法来设置特定的学习率

# update the background model
    fgMask = backSub.apply(frame)
Copier après la connexion
  • 当前帧编号可以从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))
    Copier après la connexion

    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)
    Copier après la connexion
    🎜🎜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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal