[PYTHON] J'ai essayé de détecter rapidement un mouvement avec OpenCV

Parmi les articles que j'ai écrits, les articles sur OpenCV et Raspberry Pi que j'ai écrits il y a longtemps ont été récemment relus par tout le monde. Je pense que vous pouvez vous y référer car c'est un mot clé lié au "deep learning" et au "edge computing" qui sont les tendances récentes. Quand je pense à la situation où l'edge computing est utilisé, je sens que je vois souvent des cas de détection de mouvement avec une caméra. Il est utilisé en tant que fonction de conduite automatique, de robots et de caméras à point fixe. Donc, cette fois, je vais essayer de mettre en œuvre une détection de mouvement simple en utilisant pleinement les fonctions OpenCV.

Environnement d'exploitation

OpenCV est installé en utilisant pip install opencv-opencv```. Avec cela, vous pouvez également installer numpy, ce qui est essentiel lors de l'exécution d'OpenCV.

Programme pour lire la vidéo

Tout d'abord, créez un programme pour lire la vidéo. Cette fois, j'utiliserai la vidéo de ici distribuée dans le package officiel d'OpenCV. Téléchargez-le à l'avance et enregistrez-le dans le même dossier que le code source.

import cv2

filepath = "vtest.avi"
cap = cv2.VideoCapture(filepath)
#Cliquez ici lorsque vous utilisez une webcam
# cap = cv2.VideoCapture(0)

while True:
    #Obtenez image par image.
    ret, frame = cap.read()
    if not ret:
        break

    #Résultat de sortie
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(30)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

Ici, `` cv2.waitKey (30) '' spécifie à l'origine le temps d'attente pour l'entrée de clé de la sortie de la fenêtre par OpenCV, mais lors de la lecture d'une vidéo, ralentissez l'avancée des images. Il joue également un rôle en empêchant la vidéo de circuler rapidement.

Comment détecter un mouvement

Maintenant, ajoutons le code de détection de mouvement au code qui lit la vidéo. Jetons un œil à l'algorithme étape par étape.

Convertir en échelle de gris

Conversion en échelle de gris et binarisation pour la détection des contours indépendamment de la saturation. Plus précisément, utilisez la fonction suivante.

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Découpez un cadre pour comparaison

Définissez avg = None au début du code source et laissez un tableau de cadres pour comparaison dans avg. Ajoutez donc le code suivant dans la boucle qui produit la vidéo. Inutile de dire que les images laissées ici sont converties en échelle de gris.

if avg is None:
   avg = gray.copy().astype("float")
   continue

Trouvez la différence entre l'image actuelle et la moyenne mobile

Ajoutez à l'accumulateur d'images et trouvez la différence entre les images actuelles. Plus précisément, le code est le suivant.

cv2.accumulateWeighted(gray, avg, 0.6)
frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

Définir un seuil et binariser

Réglez maintenant le seuil et binarisez l'image. Cela rend le contour de la pièce qui a changé par rapport à l'image précédente claire. En utilisant la fonction `` findContours '', le code est le suivant.

contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

Dessiner sur l'image d'origine à partir du seuil calculé

Jusqu'à ce point, le processus de détection de mouvement est terminé. Mais nous devons visualiser les résultats. Utilisez la fonction `` drawContours '' pour dessiner le contour résultant sur le cadre.

frame = cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)

Formulaire rempli

Sur la base du contenu ci-dessus, le formulaire final complété sera le code source suivant.

import cv2

filepath = "vtest.avi"
cap = cv2.VideoCapture(filepath)
#Cliquez ici lorsque vous utilisez une webcam
# cap = cv2.VideoCapture(0)

avg = None

while True:
    #Obtenez image par image.
    ret, frame = cap.read()
    if not ret:
        break

    #Convertir en échelle de gris
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #Obtenez un cadre pour comparaison
    if avg is None:
        avg = gray.copy().astype("float")
        continue

    #Calculez la différence entre l'image actuelle et la moyenne mobile
    cv2.accumulateWeighted(gray, avg, 0.6)
    frameDelta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))

    #Effectuer un traitement de seuil sur les images delta
    thresh = cv2.threshold(frameDelta, 3, 255, cv2.THRESH_BINARY)[1]
    #Ajouter un contour au seuil de l'image
    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    frame = cv2.drawContours(frame, contours, -1, (0, 255, 0), 3)

    #Résultat de sortie
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(30)
    if key == 27:
        break

cap.release()
cv2.destroyAllWindows()

résultat

result.gif

Puisque le contour de la partie modifiée de l'image est tracé, en plus du mouvement de la personne qui peut être vu visuellement, un léger tremblement de l'arrière-plan est également détecté comme un changement.

Résumé

Cette fois, nous avons implémenté le processus de détection de mouvement en utilisant uniquement la fonction OpenCV. Je n'utilise aucun nouvel algorithme, mais j'ai pu facilement détecter les "choses en mouvement". Puisqu'il s'agit d'un système simple, il détecte également ce que l'on appelle le bruit comme les changements en arrière-plan.Dans ce cas, si vous souhaitez détecter uniquement le mouvement de personnes ou d'objets spécifiques, vous pouvez encore améliorer l'algorithme ou l'apprentissage en profondeur. Doit être utilisé.

référence

[Outline: First Step -OpenCV-Python Tutorials 1 documentation-](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/ py_contours_begin.html) Comment détecter le mouvement d'une vidéo (caméra) à l'aide d'OpenCV J'ai essayé la détection de mouvement avec OpenCV

Recommended Posts

J'ai essayé de détecter rapidement un mouvement avec OpenCV
Je veux détecter des objets avec OpenCV
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de déplacer Faster R-CNN rapidement avec pytorch
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
Détecter le retour du chat avec OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de laisser VAE apprendre les animations
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé de déboguer.
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de prédire la survie du Titanic avec PyCaret
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé d'étudier DP avec séquence de Fibonacci
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
J'ai essayé de juger Tundele avec Naive Bays
Essayez de détecter les poissons avec python + OpenCV2.4 (inachevé)
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé de générer ObjectId (clé primaire) avec pymongo
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de créer un pipeline ML avec Cloud Composer
J'ai essayé de devenir un Ann Man en utilisant OpenCV
J'ai essayé de découvrir notre obscurité avec l'API Chatwork
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬