Logo elodees  elodees

Une IA bien-veillante pour un monde meilleur













Seuls les caractères alphabétiques accentués ou non ainsi que l'espace sont acceptés

Logo IA




Flux optique





Pas encore de compte ?

Inscrivez-vous pour accéder à tous les contenus




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

License: MITLicenseMIT  Copyright (c) 2020 Chinmay Wyawahare


GitHub



Optical Flow



Optical Flow



Optical Flow








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.



Optical Flow



Optical Flow








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