[PYTHON] Dessinez un flux optique en temps réel avec OpenCV (méthode Shi-Tomasi, méthode Lucas-Kanade)

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'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.

Flux optique

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.

  1. Détectez les points caractéristiques de l'image précédente. Cette fois, les points caractéristiques sont détectés à l'aide de la méthode Shi-Tomashi. Utilisez cv2.goodFeaturesToTrack ().
  2. Le flux optique des points caractéristiques dans la trame précédente est calculé par la méthode Lucas-Kanade de type pyramide d'images en utilisant les informations de la trame précédente et de la trame suivante. Utilisez cv2.calcOpticalFlowPyrLK ().
  3. Dessinez un flux optique sur le cadre.
  4. Répétez les étapes 2 et 3.

programme

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 (^^;)

Résultat d'exécution

Une fois exécuté, le flux optique est dessiné en temps réel.

result1.png

result2.png

result3.png

result4.png

Recommended Posts

Dessinez un flux optique en temps réel avec OpenCV (méthode Shi-Tomasi, méthode Lucas-Kanade)
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
Obtenez une sortie standard en temps réel avec le sous-processus Python
Obtenez des champs de chat en direct YouTube en temps réel avec l'API
Écrivez des graphiques en temps réel avec Matplotlib sur le notebook Jupyter
J'ai essayé de décrire le trafic en temps réel avec WebSocket
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Utiliser OpenCV avec Python 3 dans Window
Dessinez une illustration avec Python + OpenCV
Dessinez des figures avec OpenCV et PIL
Implémentation de la méthode de différence inter-trame avec OpenCV
Dessinez une flèche (vecteur) avec opencv / python
Comment générer un code QR et un code à barres en Python et le lire normalement ou en temps réel avec OpenCV