Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe...
Transcript of Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe...
![Page 1: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/1.jpg)
![Page 2: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/2.jpg)
Auteur : Christophe Sinclair
Mail : [email protected]
URL : https://raspberrypi.pagesperso-orange.fr/
Version :4 juin 2020
![Page 3: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/3.jpg)
1. Table des matières 1 Installation ....................................................................................................................................... 5
1.1 Affichage de la version ............................................................................................................................ 5
1.2 Formations .............................................................................................................................................. 5
2 Traitement d’images ........................................................................................................................ 6
2.1 Tableaux Numpy ..................................................................................................................................... 6
2.1.1 Information sur un tableau ............................................................................................................. 6
2.2 Installation des librairies ......................................................................................................................... 7
2.2.1 matplotlib ........................................................................................................................................ 7
2.2.2 pandas ............................................................................................................................................. 7
2.2.3 seaborn et opencv .......................................................................................................................... 8
2.2.4 plotly ............................................................................................................................................. 22
2.2.5 scikit-learn ..................................................................................................................................... 22
2.2.6 scikit-image ................................................................................................................................... 23
2.2.7 bokeh ............................................................................................................................................ 24
2.2.8 dlib ................................................................................................................................................ 25
2.3 Mathplotlib ........................................................................................................................................... 26
2.3.1 Afficher une image à partir d’un fichier ........................................................................................ 26
2.3.2 Animation d’une image créée via le code ..................................................................................... 29
2.3.3 Inverser les composantes RVB BVR ......................................................................................... 30
2.4 Opencv .................................................................................................................................................. 31
2.4.1 Création d’une image à partir d’un tableau numpy ..................................................................... 31
2.4.2 Afficher un fichier image ............................................................................................................... 33
2.4.3 Créer une grande image ............................................................................................................... 36
2.4.4 Déformer une image par une fonction ......................................................................................... 37
2.4.5 Afficher une video ......................................................................................................................... 38
2.4.6 Déformer une vidéo ...................................................................................................................... 40
2.4.7 Changer le font d’une photo ......................................................................................................... 41
2.4.8 Modifier des parties d’image ........................................................................................................ 42
2.4.9 Modifier des parties de photos ..................................................................................................... 43
2.4.10 Dessiner des formes géométriques .............................................................................................. 44
2.4.11 Seuillage des images ..................................................................................................................... 46
2.4.12 Rotation ........................................................................................................................................ 48
2.4.13 Détection de visages dans une photo ........................................................................................... 49
2.4.14 Détection d’image dans une vidéo ............................................................................................... 51
2.5 scikit-image ........................................................................................................................................... 52
![Page 4: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/4.jpg)
2.5.1 Afficher une image ........................................................................................................................ 52
2.6 dlib ........................................................................................................................................................ 53
2.6.1 Afficher une image ........................................................................................................................ 53
2.6.2 Détection de visages dans une photo ........................................................................................... 54
2.6.3 Détection d’image dans une vidéo ............................................................................................... 55
2.6.4 Détection des éléments du visage ................................................................................................ 57
2.7 tkinter + pillow ...................................................................................................................................... 59
2.7.1 Afficher une image ........................................................................................................................ 59
![Page 5: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/5.jpg)
1 Installation Python est déjà préinstallé sur les Raspberry sous Raspberry PI OS.
1.1 Affichage de la version
1.2 Formations Mon but n’est pas de faire un cours de Python pour apprendre les bases. Pour cela, il existe de nombreuses
formations sur Internet.
Les meilleurs formations en français sont certainement celles disponibles sur le site Openclassroom aussi bien
pour l’apprentissage de base du langage, la programmation objet, que sur le web avec les Framework Django
ou Flask.
Python est également très utilisé pour la Data Science et le traitement d’images. Openclassroom contient un
certain nombre de formations sur ces sujets.
- Les bases du graphisme
- La data science
- Les tests
- Traitement d’images
![Page 6: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/6.jpg)
2 Traitement d’images Python contient de nombreuses librairies de traitement d’images pour l’affichage, le traitement de l’image elle
même, mais aussi dans le domaine de l’IA comme la reconnaissance faciale.
Openclassroom présente une formation sur le traitement d’images.
2.1 Tableaux Numpy Numpy permet de gérer des tableaux et de faire beaucoup d’opérations directement sur les éléments du
tableau, là ou en python il faudrait faire des boucles pour modifier chaque élément. Les opérations sont
également beaucoup plus rapides que les tableaux python standards.
Ce type de tableaux est particulièrement adapté au traitement d’images par exemple.
2.1.1 Information sur un tableau import numpy as np
# Création d'une liste à deux dimension de 2*3 éléments
a = ((1, 2, 3), (4, 5, 6))
# Conversion en tableau numpy d'octet
a = np.array(a, dtype=np.uint8)
# type
print('type:', type(a))
# description
print('shape:', a.shape)
# dimension
print('nbytes:', a.nbytes)
# affichage
print('np array:', a)
![Page 7: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/7.jpg)
2.2 Installation des librairies
2.2.1 matplotlib Déjà installé en standard sur le Raspberry
2.2.2 pandas
![Page 8: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/8.jpg)
2.2.3 seaborn et opencv
![Page 9: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/9.jpg)
sudo apt-get install libatlas-base-dev
![Page 10: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/10.jpg)
sudo apt-get install libjasper-dev
![Page 11: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/11.jpg)
sudo apt-get install libqtgui4
![Page 12: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/12.jpg)
![Page 13: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/13.jpg)
sudo apt install libqt4-test
![Page 14: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/14.jpg)
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev
libpng12-dev
![Page 15: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/15.jpg)
![Page 16: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/16.jpg)
sudo apt-get install libavcodec-dev libavformat-dev
libswscale-dev libv4l-dev
![Page 17: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/17.jpg)
![Page 18: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/18.jpg)
sudo apt-get install libxvidcore-dev libx264-dev
![Page 19: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/19.jpg)
sudo apt-get install libgtk2.0-dev libgtk-3-dev
![Page 20: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/20.jpg)
![Page 21: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/21.jpg)
sudo apt-get install libatlas-base-dev gfortran
Je ne suis pas sûr que tout soit nécessaire, mais ça fonctionne
![Page 22: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/22.jpg)
2.2.4 plotly
2.2.5 scikit-learn
![Page 23: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/23.jpg)
2.2.6 scikit-image
![Page 24: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/24.jpg)
2.2.7 bokeh
![Page 25: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/25.jpg)
2.2.8 dlib
![Page 26: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/26.jpg)
2.3 Mathplotlib Matplotlib est une librairie qui permet d’afficher des images. Ces images pouvant être des fichiers, créés par
programme ou des trames de vidéos.
2.3.1 Afficher une image à partir d’un fichier # Importer la librairie
import matplotlib.pyplot as plt
# Lire le fichier
img = plt.imread('../lena.png')
# Plaquer l'image sur une fenêtre
plt.imshow(img)
# Affiche la fenêtre
plt.show()
Juste pour le fun, la petite histoire de Lena
https://phototrend.fr/2016/07/dessous-images-lenna-icone-informatique-de-playboy/
![Page 27: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/27.jpg)
Sans les graduations
# Importer la librairie
import matplotlib.pyplot as plt
# Lire le fichier
img = plt.imread('../lena.png')
# Plaquer l'image sur une fenêtre
plt.imshow(img)
# Sans graduation
plt.xticks([])
plt.yticks([])
# Affiche la fenêtre
plt.show()
![Page 28: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/28.jpg)
Avec des graduations personnalisées
# Importer les librairies
import matplotlib.pyplot as plt
import numpy as np
# Lire le fichier
img = plt.imread('../lena.png')
# Plaquer l'image sur une fenêtre
plt.imshow(img)
# Graduation
plt.xticks(np.arange(0, 501, step=50))
plt.yticks([50, 150, 250, 350, 450])
# Affiche la fenêtre
plt.show()
![Page 29: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/29.jpg)
2.3.2 Animation d’une image créée via le code import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
k = 2*np.pi
w = 2*np.pi
dt = 0.01
xmin = 0
xmax = 3
nbx = 100
x = np.linspace(xmin, xmax, nbx)
fig = plt.figure() # initialise la figure
line, = plt.plot([],[])
plt.xlim(xmin, xmax)
plt.ylim(-1,1)
# fonction à définir quand blit=True
# crée l'arrière de l'animation qui sera présent sur chaque image
def init():
line.set_data([],[])
return line,
def animate(i):
t = i * dt
y = np.cos(k*x - w*t)
line.set_data(x, y)
return line,
ani = animation.FuncAnimation(fig, animate, init_func=init, frames=100, blit=True, interval=20,
repeat=True)
plt.show()
![Page 30: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/30.jpg)
2.3.3 Inverser les composantes RVB BVR import matplotlib.pyplot as plt
img = plt.imread('../lena.png')
img = img[:,:,[2,1,0]] # BGR to RGB
plt.imshow(img)
plt.xticks([]) # no graduations
plt.yticks([])
plt.show()
![Page 31: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/31.jpg)
2.4 Opencv Opencv est une librairie graphique spécialisée dans le traitement d’images
Pour que les programmes utilisant cette librairie fonctionnent, il faut pré-charger une librairie avec la
commande :
LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1
2.4.1 Création d’une image à partir d’un tableau numpy import cv2 as cv
import numpy as np
img = (
(( 0, 0, 0), (128, 128, 128), (255, 255, 255)),
(( 0, 0, 255), ( 0, 255, 0), (255, 0, 0)),
((255, 255, 0), ( 0, 255, 255), (255, 0, 255)))
img = np.array(img, dtype=np.uint8)
cv.imshow('win', img)
cv.waitKey()
cv.destroyAllWindows()
Cela devrait créer une image de seulement 6 pixels, mais l’affichage est automatiquement zoomé pour être
visible.
La commande « waitKey » sans paramètre attend l’appui sur une touche indéfiniment. Vous pouvez également
mettre une temporisation en milliseconde.
Attention : « waitKey(0) » bloque le programme. Cette commande semble de toute façon très capricieuse sur le
Raspberry.
![Page 32: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/32.jpg)
Le même programme avec un zoom
import cv2 as cv
import numpy as np
img = (
(( 0, 0, 0), (128, 128, 128), (255, 255, 255)),
(( 0, 0, 255), ( 0, 255, 0), (255, 0, 0)),
((255, 255, 0), ( 0, 255, 255), (255, 0, 255)))
img = np.array(img, dtype=np.uint8)
cv.namedWindow('win', cv.WINDOW_NORMAL)
scale = 60
height, width = img.shape[:2]
cv.resizeWindow('win', width*scale, height*scale)
cv.imshow('win', img)
cv.waitKey()
cv.destroyAllWindows()
![Page 33: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/33.jpg)
2.4.2 Afficher un fichier image Image en png
import cv2 as cv
img = cv.imread('../lena.png')
cv.imshow('win', img)
cv.waitKey()
cv.destroyAllWindows()
![Page 34: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/34.jpg)
Image en jpg
import cv2 as cv
img = cv.imread('lenafull.jpg')
cv.imshow('win', img)
cv.waitKey(0)
cv.destroyAllWindows()
![Page 35: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/35.jpg)
Image en bmp, même avec seulement 2 couleurs
![Page 36: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/36.jpg)
2.4.3 Créer une grande image import cv2 as cv
import numpy as np
sx, sy = 1200, 800
img = np.empty((sy, sx, 3), dtype=np.uint8)
color1 = 255, 0, 0
color2 = 0, 255, 0
color3 = 0, 0, 255
compteur = 0
for y in range(sy):
for x in range(sx):
if compteur % 3 == 0:
img[y, x] = color1
if compteur % 3 == 1:
img[y, x] = color2
if compteur % 3 == 2:
img[y, x] = color3
compteur += 1
cv.imshow('win', img)
cv.waitKey(0)
Cette image met environ 7s à s’afficher, ce fonctionnement est particulièrement inefficace.
![Page 37: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/37.jpg)
2.4.4 Déformer une image avec une fonction import cv2 as cv
import numpy as np
def f(x, y):
"""Reverse mapping function."""
d = (x**2 + y**2)**0.5
return x*d, y*d
img1 = cv.imread('lena.png')
sy, sx = img1.shape[:2]
img2 = np.zeros((sy, sx, 3), dtype=np.uint8)
cx, cy = (sx-1)/2, (sy-1)/2
for y2 in range(sy):
dy2 = 1 - y2/cy
for x2 in range(sx):
dx2 = x2/cx - 1
dx1, dy1 = f(dx2, dy2)
x1 = round(cx*(dx1 + 1))
y1 = round(cy*(1 - dy1))
if (0 <= x1 < sx) and (0 <= y1 < sy):
img2[y2, x2] = img1[y1, x1]
cv.imshow('win', img2)
cv.waitKey(0)
![Page 38: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/38.jpg)
2.4.5 Afficher une video A partir d’un fichier
import cv2 as cv
capture = cv.VideoCapture('VID_20200521_190725.mp4')
fps = capture.get(cv.CAP_PROP_FPS)
delay = round(1000/fps)
while True:
ret, frame = capture.read()
if not ret: # end of file
break
cv.imshow('win', frame)
key = cv.waitKey(delay)
if key == 27: # ESC
break
capture.release()
cv.destroyAllWindows()
![Page 39: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/39.jpg)
A partir d’une webcam (Microsoft LifeCam sur USB)
import cv2 as cv
capture = cv.VideoCapture(0)
fps = capture.get(cv.CAP_PROP_FPS)
delay = 1
while True:
ret, frame = capture.read()
if not ret: # end of file
break
cv.imshow('win', frame)
key = cv.waitKey(delay)
if key == 27: # ESC
break
capture.release()
cv.destroyAllWindows()
![Page 40: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/40.jpg)
2.4.6 Déformer une vidéo import cv2 as cv
import numpy as np
def f(x, y):
"""Reverse mapping function."""
d = (x**2 + y**2)**0.3
return x*d, y*d
capture = cv.VideoCapture('VID_20200521_193521.mp4')
fps = capture.get(cv.CAP_PROP_FPS)
delay = round(1000/fps)
while True:
ret, frame = capture.read()
if not ret: # end of file
break
sy, sx = frame.shape[:2]
img2 = np.zeros((sy, sx, 3), dtype=np.uint8)
cx, cy = (sx-1)/2, (sy-1)/2
for y2 in range(sy):
dy2 = 1 - y2/cy
for x2 in range(sx):
dx2 = x2/cx - 1
dx1, dy1 = f(dx2, dy2)
x1 = round(cx*(dx1 + 1))
y1 = round(cy*(1 - dy1))
if (0 <= x1 < sx) and (0 <= y1 < sy):
img2[y2, x2] = frame[y1, x1]
cv.imshow('win', img2)
#cv.imshow('win1', frame)
key = cv.waitKey(delay)
if key == 27: # ESC
break
capture.release()
cv.destroyAllWindows()
Ça marche, mais c’est très lent (une image toutes les 10s)
![Page 41: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/41.jpg)
2.4.7 Changer le font d’une photo import cv2
# Read the images
foreground = cv2.imread("photo.png")
background = cv2.imread("papier-japonais-fibre-blanche-fond-blanc-63x97.jpg")
alpha = cv2.imread("filtre2.png")
# Convert uint8 to float
foreground = foreground.astype(float)
background = background.astype(float)
# Normalize the alpha mask to keep intensity between 0 and 1
alpha = alpha.astype(float)/255
# Multiply the foreground with the alpha matte
foreground = cv2.multiply(alpha, foreground)
# Multiply the background with ( 1 - alpha )
background = cv2.multiply(1.0 - alpha, background)
# Add the masked foreground and background.
outImage = cv2.add(foreground, background)
# Display image
cv2.imshow("outImg", outImage/255)
cv2.waitKey(0)
![Page 42: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/42.jpg)
2.4.8 Modifier des parties d’image import cv2 as cv
import numpy as np
def replace(img1, img2, x, y):
h2, w2 = img2.shape[:2]
img1[y:y+h2, x:x+w2, :] = img2
img2 = np.array(
(((0, 0, 255),(0, 255, 0)),
((255, 0, 0),(255, 255, 255))),
np.uint8)
for i in range(0, 20):
img1 = np.zeros((5, 5, 3), np.uint8)
replace(img1, img2, x=i%2 + 1, y=i%2 + 1)
cv.namedWindow('win', cv.WINDOW_NORMAL)
scale = 60
h1, w1 = img1.shape[:2]
cv.resizeWindow('win', w1*scale, h1*scale)
cv.imshow('win', img1)
cv.waitKey(300)
cv.waitKey(1000)
cv.destroyAllWindows()
![Page 43: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/43.jpg)
2.4.9 Modifier des parties de photos import cv2 as cv
import numpy as np
def replace(img1, img2, x, y):
h2, w2 = img2.shape[:2]
img1[y:y+h2, x:x+w2, :] = img2
photo = cv.imread("../lena.png")
img2 = photo[200:300, 200:300]
for i in range(0, 400):
img1 = np.copy(photo);
replace(img1, img2, x=i, y=i)
cv.namedWindow('win', cv.WINDOW_NORMAL)
cv.imshow('win', img1)
cv.waitKey(20)
cv.waitKey(1000)
cv.destroyAllWindows()
![Page 44: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/44.jpg)
2.4.10 Dessiner des formes géométriques Opencv permet de dessiner des formes géométriques.
import numpy as np
import cv2 as cv
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
YELLOW = (0, 255, 255)
ORANGE = (0, 165, 255)
RED = (0, 0, 255)
RASPBERRY = (92, 11, 227)
BROWN = (42, 42, 165)
GREEN = (0, 255, 0)
CYAN = (255, 255, 0)
BLUE = (255, 0, 0)
MAGENTA = (255, 0, 255)
PURPLE = (128, 0, 128)
img = np.zeros((500, 500, 3), np.uint8)
for i in range (0, 500, 50):
cv.line(img, pt1=(i, 0), pt2=(i, 500), color=BLUE, thickness=2, lineType=cv.LINE_AA)
cv.line(img, pt1=(0, i), pt2=(500, i), color=BLUE, thickness=2, lineType=cv.LINE_AA)
cv.rectangle(img, pt1=(25, 25), pt2=(475, 475), color=RED)
cv.rectangle(img, pt1=(75, 75), pt2=(425, 425), color=ORANGE)
cv.rectangle(img, pt1=(125, 125), pt2=(375, 375), color=YELLOW)
cv.rectangle(img, pt1=(175, 175), pt2=(325, 325), color=BROWN)
cv.rectangle(img, pt1=(225, 225), pt2=(275, 275), color=GREEN)
cv.rectangle(img, pt1=(25, 25), pt2=(475, 475), color=MAGENTA)
cv.drawMarker(img, (250, 250), WHITE , cv.MARKER_DIAMOND, markerSize=25, thickness=2)
cv.circle(img, center=(50, 50), radius=20, color=BLACK, thickness=cv.FILLED)
cv.circle(img, center=(250, 250), radius=125, color=PURPLE)
poly = np.array(((250,25), (475, 250), (250, 475), (25, 250)), np.int32)
cv.polylines(img, pts=[poly], isClosed=True, color=RASPBERRY, thickness=2, lineType=cv.LINE_AA)
cv.putText(img, text='Raspberry', org=(200, 200), fontFace=cv.FONT_HERSHEY_SIMPLEX,
fontScale=1.5, color=PURPLE, thickness=2, lineType=cv.LINE_AA)
cv.imshow('win', img)
cv.waitKey()
cv.destroyAllWindows()
![Page 45: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/45.jpg)
![Page 46: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/46.jpg)
2.4.11 Seuillage des images Opencv permet des seuillages sur les images.
import numpy as np
import cv2 as cv
img = cv.imread('sudoku.png', cv.IMREAD_GRAYSCALE)
img = cv.medianBlur(img, 5)
img = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 3)
cv.imshow('win', img)
cv.waitKey()
cv.destroyAllWindows()
![Page 47: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/47.jpg)
![Page 48: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/48.jpg)
2.4.12 Rotation import cv2 as cv
import numpy as np
def replace(img1, img2, x, y):
h2, w2 = img2.shape[:2]
img1[y:y+h2, x:x+w2, :] = img2
photo = cv.imread("../lena.png")
for i in range(0, 360):
transfoMatrix = cv.getRotationMatrix2D((photo.shape[0] / 2, photo.shape[1] / 2), i, 0.8)
newImg = cv.warpAffine(photo, transfoMatrix, None,
flags = cv.INTER_LINEAR,
borderMode = cv.BORDER_REFLECT)
cv.namedWindow('win', cv.WINDOW_NORMAL)
cv.imshow('win', newImg)
cv.waitKey(5)
cv.waitKey(1000)
cv.destroyAllWindows()
![Page 49: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/49.jpg)
2.4.13 Détection de visages dans une photo Télécharger tout d’abord le fichier « harrcascade_frontalface.xml » sur le projet opencv de github.
Il y a également d’autres fichiers qui permettent de détecter d’autres choses, comme les yeux ou des chats.
import cv2 as cv
import math
IMAGE = 'gettyimages-200244519-007-1024x1024.jpg'
def detect_faces(classifier, img):
RED = (0, 0, 255)
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = classifier.detectMultiScale(img_gray)
for x, y, w, h in faces:
cv.circle(img, center = (math.floor(x + w / 2), math.floor(y + h / 2)), radius = math.trunc(h /
2), color=RED, thickness=2)
classifier = cv.CascadeClassifier('haarcascade_frontalface.xml')
img = cv.imread(IMAGE)
detect_faces(classifier, img)
cv.imshow('win', img)
cv.waitKey(0)
cv.destroyAllWindows()
![Page 50: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/50.jpg)
Cela détecte les visages de face, droit et pas trop important sur l’image (c’est pour cela que la personne au
premier plan n’est pas détectée)
![Page 51: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/51.jpg)
2.4.14 Détection d’image dans une vidéo import cv2 as cv
import math
def detect_faces(classifier, img):
RED = (0, 0, 255)
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = classifier.detectMultiScale(img_gray)
for x, y, w, h in faces:
cv.circle(img, center = (math.floor(x + w / 2), math.floor(y + h / 2)), radius = math.trunc(h /
2), color=RED, thickness=2)
capture = cv.VideoCapture('videofoot.mp4')
fps = capture.get(cv.CAP_PROP_FPS)
delay = round(1000/fps)
classifier = cv.CascadeClassifier('haarcascade_frontalface.xml')
while True:
ret, frame = capture.read()
detect_faces(classifier, frame)
if not ret: # end of file
break
cv.imshow('win', frame)
key = cv.waitKey(delay)
if key == 27: # ESC
break
capture.release()
cv.destroyAllWindows()
C’est franchement saccadé, mais ça marche, même si il y a beaucoup de non détections et de fausses détections.
![Page 52: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/52.jpg)
2.5 scikit-image
2.5.1 Afficher une image import skimage.io
img = skimage.io.imread('../lena.png')
skimage.io.imshow(img)
skimage.io.show()
![Page 53: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/53.jpg)
2.6 dlib
2.6.1 Afficher une image import dlib
img = dlib.load_rgb_image('../lena.png')
win = dlib.image_window()
win.set_image(img)
Ne pas oublier l’option –i sinon le programme s’arrête tout de suite
![Page 54: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/54.jpg)
2.6.2 Détection de visages dans une photo import face_recognition
import matplotlib.pyplot as plt
IMG = 'gettyimages-200244519-007-1024x1024.jpg'
#----- load and display image
img = face_recognition.load_image_file(IMG)
plt.xticks([])
plt.yticks([])
plt.imshow(img)
#----- detect faces
faces = face_recognition.face_locations(img, model='hog')
#----- show detections
for y0, x1, y1, x0 in faces:
x = x1, x0, x0, x1, x1
y = y0, y0, y1, y1, y0
plt.plot(x, y, color='lime')
plt.show()
![Page 55: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/55.jpg)
2.6.3 Détection d’image dans une vidéo import cv2 as cv
import face_recognition
#------------------------------------------------------------------------------
def detect_faces(img):
faces = face_recognition.face_locations(img[:,:,::-1])
for y0, x1, y1, x0 in faces:
cv.rectangle(img, (x0, y0), (x1, y1), (255,0,0), 2)
#------------------------------------------------------------------------------
def get_image():
capture = cv.VideoCapture('videofoot.mp4')
while True:
ret, img = capture.read()
if not ret:
break
yield img
key = cv.waitKey(1)
if key == 27:
break
capture.release()
#------------------------------------------------------------------------------
if __name__ == '__main__':
for img in get_image():
detect_faces(img)
cv.imshow('win', img)
cv.destroyAllWindows()
![Page 56: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/56.jpg)
Ça fonctionne, mais c’est extrêmement lent
![Page 57: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/57.jpg)
2.6.4 Détection des éléments du visage import face_recognition
import matplotlib.pyplot as plot
image = face_recognition.load_image_file('gettyimages-200244519-007-1024x1024.jpg')
plot.xticks([])
plot.yticks([])
plot.imshow(image)
visages = face_recognition.face_landmarks(image)
COLORS = {'chin': 'orange', # menton
'left_eyebrow': 'green', # sourcil gauche
'right_eyebrow': 'green', # sourcil droit
'nose_bridge': 'yellow', # arête du nez
'nose_tip': 'yellow', # trous de nez
'left_eye': 'blue', # oeil gauche
'right_eye': 'blue', # oeil droit
'top_lip': 'red', # lèvre haute
'bottom_lip': 'magenta'} # lèvre basse
for visage in visages:
for element, pts in visage.items():
x = tuple(p[0] for p in pts)
y = tuple(p[1] for p in pts)
plot.plot(x, y, color=COLORS[element])
plot.show()
![Page 58: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/58.jpg)
![Page 59: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/59.jpg)
2.7 tkinter + pillow
2.7.1 Afficher une image import tkinter as tk, numpy as np, PIL.Image, PIL.ImageTk
img = PIL.Image.open('../lena.png')
w, h = img.size
win = tk.Tk()
win.geometry(f'{w+20}x{h+20}')
win.resizable(False, False)
img = PIL.ImageTk.PhotoImage(image=img)
lbl = tk.Label(win, image=img)
lbl.place(x=8, y=8)
win.mainloop()
![Page 60: Auteur : Christophe Sinclair Mail : raspberry.pi123@orange · 2020-06-04 · Auteur : Christophe Sinclair Mail : raspberry.pi123@orange.fr URL : Version :4 juin 2020](https://reader034.fdocuments.in/reader034/viewer/2022042917/5f5baa6df319866e9f174d02/html5/thumbnails/60.jpg)
En GIF, plus pixélisé car le format ne gère que 256 couleurs
import tkinter as tk, numpy as np, PIL.Image, PIL.ImageTk
img = PIL.Image.open('../lena.gif')
w, h = img.size
win = tk.Tk()
win.geometry(f'{w+20}x{h+20}')
win.resizable(False, False)
img = PIL.ImageTk.PhotoImage(image=img)
lbl = tk.Label(win, image=img)
lbl.place(x=8, y=8)
win.mainloop()