Acquisition de données par traitement d'images et d'un script python.

exemple du pendule pesant .

Principe : à partir des images d'une vidéo et d'un traitement d' images, les positions de la bille colorée du pendule sont récupérées.

La vidéo au format mp4 est obtenue avec un smartphone.
Les images de la séquence vidéo sont récupérées de la vidéo avec le logiciel FFmeg.
Utilisation du logiciel FFmeg en ligne de commande. Créer le dossier qui contiendra les images de la séquence vidéo, ici "img_pendule" .
exemple de ligne de commande :
f fmpeg . exe -i pendule3 .mp4 -q s c a l e : v 2 img_pendule\ s o r t i e_%03d . jpeg.

Le code python pour récupérés la boule rouge de la vidéo: analyse_image.py

import numpy as np
from matplotlib import pyplot as plt
from skimage.io import imread, imshow
from skimage.color import rgb2grey
from skimage.color import rgb2hsv
from skimage.feature import blob_doh

imagei = imread('..\img_pendule\sortie_281.jpeg')
#premier traitement de l'image conversion en HSV (en français : TSV). La couleur est décrite par sa teinte (hue), #l’intensité de cette couleur (saturation) et la valeur luminosité (value)
image = rgb2hsv(imagei)
fig, ax = plt.subplots()

#deuxième traitement de l'image conversion en gris
image2_gray = rgb2grey(image)

#blob_doh recupère les tâches lumineuses sur un fond sombre ou inversement.

#Il faut jouer sur les valeurs de max_sigma et threshold pour obtenir le minimum de tâche.
blob = blob_doh(image2_gray, max_sigma = 10, threshold = .016)
# position des tâches (x,y) et rayon de la tâche.
x = blob[:, 1]
y = blob[:, 0]
r = blob[:, 2]
#on trace des cerles entourant les tâches détectées.
for i in range(len(y)):
print('x,y,r ','(',x[i],',',y[i],',',r[i],')')
c = plt.Circle((x[i], y[i]), r[i], color = '#CE181E', linewidth = 2, fill = False)
ax.add_patch(c)

ax.imshow(image, interpolation = 'nearest')
plt.legend()
plt.show()

Résultat:

Maintenant il suffit de créer une boucle pour analyser les images de la vidéo: analyse_sequences.py

import numpy as np
from matplotlib import pyplot as plt
from skimage.io import imread, imshow
from skimage.color import rgb2grey
from skimage.color import rgb2hsv
from skimage.feature import blob_doh

Delta_t = 0.0333 # ms (29,97 images par seconde)

for i in range(1, 284):
if (i<10):
imagei = imread('D:\img_pendule\sortie_00{0}.jpeg'.format(i))
elif (i<100):
imagei = imread('D:\img_pendule\sortie_0{0}.jpeg'.format(i))
else:
imagei = imread('D:\img_pendule\sortie_{0}.jpeg'.format(i))
print(i)
image = rgb2hsv(imagei)
image_gray = rgb2grey(image)
blob = blob_doh(image_gray, max_sigma = 10, threshold = .010)
x = blob[:, 1]
y = blob[:, 0]
r = blob[:, 2]
for i in range(len(y)):
if (r[i]>5):
print('x,y,r ','(',x[i],',',y[i],',',r[i],')')
tt.append(t)
xx.append(x[i])
yy.append(y[i])
t = t + Delta_t

y0 = 65 #pixels
x0 = 640

theta = [np.arctan((xx[i]-x0)/(yy[i]-y0))*180/np.pi for i in range(len(yy))]
plt.plot(tt,theta,'g+')
plt.legend()
plt.show()

Résultat : courbes theta = f(temps) :

figure 1

theta = f(temps)