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.
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.
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.
Maintenant, ajoutons le code de détection de mouvement au code qui lit la vidéo. Jetons un œil à l'algorithme étape par étape.
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é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
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))
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)
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)
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()
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.
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é.
[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