Maison >développement back-end >Tutoriel Python >Comment Python OpenCV utilise-t-il la méthode de séparation en arrière-plan ?
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
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))
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🎜🎜🎜rrreeeCe 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!