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'image, la 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 Effectuer divers filtres avec OpenCV (Gradient, Highpass, Laplacian, Gaussian) Extraire des points caractéristiques avec OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob)
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, je vais essayer de dessiner le flux optique en temps réel en utilisant OpenCV.
Le flux optique est une méthode permettant d'exprimer l'image d'un point caractéristique et la différence (vecteur) entre les images d'une image en mouvement. Comme la fréquence d'images est généralement constante, on peut dire qu'elle exprime la vitesse des points caractéristiques. Il existe deux méthodes de calcul: une qui utilise la correspondance de modèle et une qui utilise des points / entités caractéristiques. Cette fois, je vais dessiner un flux optique en utilisant des points caractéristiques. Le flux est le suivant.
Environnement d'exploitation
Données vidéo J'ai utilisé l'exemple de vidéo fourni avec OpenCV. OpenCV\opencv\sources\samples\data\768x576.avi
LucasKande.py
import numpy as np
import cv2
cap = cv2.VideoCapture('768x576.avi')
# Shi-Paramètres de détection de coin Tomasi
feature_params = dict( maxCorners = 100,
qualityLevel = 0.3,
minDistance = 7,
blockSize = 7 )
# Lucas-Paramètres de la méthode Kanade
lk_params = dict( winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
#Générer 100 couleurs au hasard (générer un ndarray aléatoire avec 100 lignes et 3 colonnes dans la plage de 0 à 255)
color = np.random.randint(0, 255, (100, 3))
#Traitement de la première image
end_flag, frame = cap.read()
gray_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
feature_prev = cv2.goodFeaturesToTrack(gray_prev, mask = None, **feature_params)
mask = np.zeros_like(frame)
while(end_flag):
#Convertir en échelle de gris
gray_next = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#Détection de flux optique
feature_next, status, err = cv2.calcOpticalFlowPyrLK(gray_prev, gray_next, feature_prev, None, **lk_params)
#Sélectionnez les points caractéristiques pour lesquels un flux optique a été détecté (0: non détecté, 1: détecté)
good_prev = feature_prev[status == 1]
good_next = feature_next[status == 1]
#Dessiner un flux optique
for i, (next_point, prev_point) in enumerate(zip(good_next, good_prev)):
prev_x, prev_y = prev_point.ravel()
next_x, next_y = next_point.ravel()
mask = cv2.line(mask, (next_x, next_y), (prev_x, prev_y), color[i].tolist(), 2)
frame = cv2.circle(frame, (next_x, next_y), 5, color[i].tolist(), -1)
img = cv2.add(frame, mask)
#Afficher dans la fenêtre
cv2.imshow('window', img)
#Appuyez sur la touche ESC pour terminer
if cv2.waitKey(30) & 0xff == 27:
break
#Préparation de l'image et du point suivant
gray_prev = gray_next.copy()
feature_prev = good_next.reshape(-1, 1, 2)
end_flag, frame = cap.read()
#Terminer le traitement
cv2.destroyAllWindows()
cap.release()
Avec OpenCV, vous n'avez besoin d'appeler qu'une seule méthode pour l'extraction des points caractéristiques et le calcul du flux optique. Quel monde pratique (^^;)
Une fois exécuté, le flux optique est dessiné en temps réel.
Recommended Posts