Pas encore de compte ?
Flux optique - Lucas & Kanade
L'algorithme de Lucas–Kanade est une méthode différentielle utilisée pour l'estimation du flux optique.
Elle suppose que le flux est essentiellement constant dans un voisinage local du pixel considéré et résout l'équation du flux optique pour tous les pixels dans ce voisinage par la méthode des moindres carrés.
Testé sous Anaconda et Python 3.7
import math from scipy import signal from PIL import Image import numpy as np from numpy import * from matplotlib import pyplot as plt from pylab import * import cv2 import random def LK_OpticalFlow(Image1, Image2, kernel_size): I1 = np.array(Image1) I2 = np.array(Image2) S = np.shape(I1) # Apply Gaussian filter of size - 3x3 I1_smooth = cv2.GaussianBlur(I1, kernel_size, 0) I2_smooth = cv2.GaussianBlur(I2, kernel_size, 0) Ix = signal.convolve2d(I1_smooth, [[-0.25, 0.25], [-0.25, 0.25]], 'same') + signal.convolve2d(I2_smooth, [[-0.25, 0.25], [-0.25, 0.25]], 'same') Iy = signal.convolve2d(I1_smooth, [[-0.25, -0.25], [0.25, 0.25]], 'same') + signal.convolve2d(I2_smooth, [[-0.25, -0.25], [0.25, 0.25]], 'same') It = signal.convolve2d(I1_smooth, [[0.25, 0.25], [0.25, 0.25]], 'same') + signal.convolve2d(I2_smooth, [[-0.25, -0.25], [-0.25, -0.25]], 'same') features = cv2.goodFeaturesToTrack(I1_smooth, 10000, 0.01, 5) feature = np.int0(features) plt.figure(figsize=(12,8)) for i in feature: x,y = i.ravel() cv2.circle(I1_smooth, (x,y), 3, 0, -1) u = v = np.nan*np.ones(S) for l in feature: j,i = l.ravel() IX = ([Ix[i-1,j-1],Ix[i,j-1],Ix[i-1,j-1],Ix[i-1,j],Ix[i,j],Ix[i+1,j],Ix[i-1,j+1],Ix[i,j+1],Ix[i+1,j-1]]) IY = ([Iy[i-1,j-1],Iy[i,j-1],Iy[i-1,j-1],Iy[i-1,j],Iy[i,j],Iy[i+1,j],Iy[i-1,j+1],Iy[i,j+1],Iy[i+1,j-1]]) IT = ([It[i-1,j-1],It[i,j-1],It[i-1,j-1],It[i-1,j],It[i,j],It[i+1,j],It[i-1,j+1],It[i,j+1],It[i+1,j-1]]) LK = (IX, IY) LK = np.matrix(LK) LK_T = np.array(np.matrix(LK)) # A transpose LK = np.array(np.matrix.transpose(LK)) A1 = np.dot(LK_T, LK) # Pseudo Inverse A2 = np.linalg.pinv(A1) A3 = np.dot(A2, LK_T) (u[i,j],v[i,j]) = np.dot(A3, IT) colors = "bgrcmykw" color_index = random.randrange(0,8) c=colors[color_index] # Plot the vectors on the image plt.title('Vector plot of Optical Flow') plt.imshow(I1, cmap = cm.gray) for i in range(S[0]): for j in range(S[1]): if(abs(u[i,j]) > t or abs(v[i,j]) > t): plt.arrow(j, i, v[i,j], u[i,j], head_width = 5, head_length = 5, color = c) plt.show() t = 0.3 Image1 = cv2.imread('data/sphere/sphere0.png', cv2.IMREAD_GRAYSCALE) Image2 = cv2.imread('data/sphere/sphere1.png', cv2.IMREAD_GRAYSCALE) font = { 'family' : 'Courier New', 'color' : 'darkblue', 'weight' : 'medium', 'size' : 15, } plt.rcParams["axes.grid"] = False fig = plt.figure(figsize=(12,8)) plt.imshow(Image1, cmap='gray') plt.title('Sphere - Frame 1', fontdict=font) plt.rcParams["axes.grid"] = False fig = plt.figure(figsize=(12,8)) plt.imshow(Image2, cmap='gray') plt.title('Sphere - Frame 2', fontdict=font) LK_OpticalFlow(Image1, Image2, kernel_size=(3,3)) LK_OpticalFlow(Image1, Image2, kernel_size=(5,5)) LK_OpticalFlow(Image1, Image2, kernel_size=(11,11)) LK_OpticalFlow(Image1, Image2, kernel_size=(21,21)) Image1 = cv2.imread('data/traffic/traffic0.png', cv2.IMREAD_GRAYSCALE) Image2 = cv2.imread('data/traffic/traffic1.png', cv2.IMREAD_GRAYSCALE) plt.rcParams["axes.grid"] = False fig = plt.figure(figsize=(12,8)) plt.imshow(Image1, cmap='gray') plt.title('Traffic - Frame 1', fontdict=font) plt.rcParams["axes.grid"] = False fig = plt.figure(figsize=(12,8)) plt.imshow(Image2, cmap='gray') plt.title('Traffic - Frame 2', fontdict=font) LK_OpticalFlow(Image1, Image2, kernel_size=(3,3)) LK_OpticalFlow(Image1, Image2, kernel_size=(5,5)) LK_OpticalFlow(Image1, Image2, kernel_size=(21,21)) LK_OpticalFlow(Image1, Image2, kernel_size=(11,11))
Optical-Flow
Copyright (c) 2020 Chinmay Wyawahare
Flux optique - Horn & Schunck
L'algorithme de Horn-Schunck d'estimation du flux optique est une méthode globale qui introduit une contrainte globale de lissage pour résoudre le problème d'ouverture.
Flux optique - Lucas & Kanade
Optical-Flow - GitHub
Flux optique - Horn & Schunck
Optical-Flow - GitHub
Bienvenu, je m’appelle Eric Soupet et je suis l'administrateur du site elodees.com. elodees.com est un état de l'art de l'Intelligence Artificielle et se veut collaboratif, vous pouvez dès à présent proposer du contenu tels que des articles, des événements, des tutoriels, ... alors n'hésitez pas !
Crédit des images de la plate-forme : Pixabay - Pixabay License | Pexels - Pexels License