[PYTHON] Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV

introduction

OpenCV (Open Source Computer Vision Library) est une collection de bibliothèques de traitement vidéo / image sous licence BSD. Il existe de nombreux algorithmes tels que le filtrage d'images, la mise en correspondance de modèles, la reconnaissance d'objets, l'analyse vidéo et l'apprentissage automatique.

Exemple de suivi de mouvement avec OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s

Cliquez ici pour l'installation et une utilisation facile Installer OpenCV 3 (core + contrib) dans l'environnement Python 3 & Différence entre OpenCV 2 et OpenCV 3 & Easy operation check

Cliquez ici pour filtrer les images fixes Essayez la détection des bords avec OpenCV

Cliquez ici pour traiter les fichiers vidéo Essayez de convertir des vidéos en temps réel avec OpenCV Essayez de convertir des vidéos de caméra Web / caméra vidéo en temps réel avec OpenCV

Cette fois, j'essaierai de séparer l'arrière-plan et l'objet en mouvement à l'aide d'une vidéo prise avec une caméra à point fixe. Il peut être utilisé comme méthode d'extraction de personnes lors du suivi des personnes qui passent avec une caméra de surveillance.

algorithme

Si vous empilez les cadres tout en les pondérant, les parties qui ne bougent pas émergeront. Au lieu de simplement ajouter, le cadre actuel est ajouté et soustrait du cadre d'arrière-plan. OpenCV utilise cv2.absdiff (). Aussi, afin de réduire l'erreur de calcul de pondération, elle est calculée en virgule flottante (np.float32).

  1. Préparez un cadre d'arrière-plan rempli de zéro
  2. Nouvel arrière-plan = arrière-plan x (poids 1) + cadre actuel x poids
  3. Répétez l'étape 2

Cadre du corps en mouvement = | Cadre actuel - Arrière-plan |

programme

diff&accum.py


import cv2
import numpy as np

#Définition constante
ESC_KEY = 27     #Touche Echap
INTERVAL= 33     #intervalle
FRAME_RATE = 30  # fps

WINDOW_ORG = "org"
WINDOW_BACK = "back"
WINDOW_DIFF = "diff"

FILE_ORG = "org_768x576.avi"

#Préparation de la fenêtre
cv2.namedWindow(WINDOW_ORG)
cv2.namedWindow(WINDOW_BACK)
cv2.namedWindow(WINDOW_DIFF)

#Lire le fichier vidéo original
mov_org = cv2.VideoCapture(FILE_ORG)

#Première image lue
has_next, i_frame = mov_org.read()

#Cadre de fond
back_frame = np.zeros_like(i_frame, np.float32)

#Boucle de traitement de conversion
while has_next == True:
    #Convertir l'image d'entrée en type à virgule flottante
    f_frame = i_frame.astype(np.float32)

    #Calcul de la différence
    diff_frame = cv2.absdiff(f_frame, back_frame)

    #Mise à jour en arrière-plan
    cv2.accumulateWeighted(f_frame, back_frame, 0.025)

    #Affichage du cadre
    cv2.imshow(WINDOW_ORG, i_frame)
    cv2.imshow(WINDOW_BACK, back_frame.astype(np.uint8))
    cv2.imshow(WINDOW_DIFF, diff_frame.astype(np.uint8))

    #Quitter avec la touche Echap
    key = cv2.waitKey(INTERVAL)
    if key == ESC_KEY:
        break
    
    #Lire l'image suivante
    has_next, i_frame = mov_org.read()

#Terminer le traitement
cv2.destroyAllWindows()
mov_org.release()

Résultat d'exécution

org.png ** L'image d'origine **

diff.png ** Image d'extraction d'objets en mouvement **

back.png image de fond

J'ai réussi à extraire les gens qui marchent.

Recommended Posts

Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Essayez d'obtenir le contenu de Word avec Golang
Comment boucler et lire une vidéo gif avec openCV
Essayez de mesurer la position d'un objet sur le bureau (système de coordonnées réel) à partir de l'image de la caméra avec Python + OpenCV
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
Essayez d'extraire les caractéristiques des données de capteur avec CNN
Essayez de brouiller l'image avec opencv2
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
Je veux vérifier la position de mon visage avec OpenCV!
Essayez de déplacer le servomoteur avec RasPi (version ronde et ronde à 360 degrés)
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le diagramme homme-machine avec Python
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
Essayez de communiquer avec EV3 et PC! (MQTT)
Comment essayer l'algorithme des amis d'amis avec pyfof
Spécifiez les positions de début et de fin des fichiers à inclure avec qiitap
Script pour tweeter avec des multiples de 3 et des nombres avec 3 !!
Le moyen le plus simple d'utiliser OpenCV avec python
J'ai comparé la moyenne mobile du type de filtre IIR avec les pandas et scipy
Enregistrer l'objet dans un fichier avec pickle
Même dans le processus de conversion de CSV en délimiteur d'espace, essayez sérieusement de séparer les entrées / sorties et les règles
Conversion en ondelettes d'images avec PyWavelets et OpenCV
Essayez de détecter un objet avec RaspberryPi ~ Partie 1: Comparaison de la vitesse de détection ~
[Vérification] Essayez d'aligner le groupe de points avec la fonction d'optimisation de pytorch Partie 1
Essayez de simuler le mouvement du système solaire
Histoire de passer de Pipenv à la poésie
Essayez de détecter les poissons avec python + OpenCV2.4 (inachevé)
Une introduction au logiciel d'interface graphique de la plate-forme de classe fait avec Python / Tkinter! (Et de nombreux Try and Error)! (Au milieu de l'écriture)
[Blender] Comment obtenir l'ordre de sélection des sommets, des côtés et des faces d'un objet
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Une histoire sur la tentative de contribuer à l'analyse COVID-19 avec l'offre gratuite d'AWS et l'échec
C'est Noël, donc je vais essayer de dessiner la généalogie de Jésus-Christ avec Cabocha
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Essayez de résoudre le livre des défis de programmation avec python3
Ajouter des attributs d'objets de classe avec une instruction for
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
Ajoutez des informations au bas de la figure avec Matplotlib
Visualisons la pièce avec tarte aux râpes, partie 1
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Essayez d'estimer le nombre de likes sur Twitter
Essayez de déplacer le servomoteur avec RasPi (version à 180 degrés)
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Visualisez le statut d'appréciation des œuvres d'art avec OpenCV
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV