In questo quaderno viene mostrata l'analisi dati relativa al tempo di caduta della sabbia da una clessidra.
Downloads:
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit
import cv2
Il file con i dati è un file csv, dove nella prima colonna è stato messo il numero di rame, mentre nella sconda colonna il peso in grammi letto dalla bilancia. Le due colonne in questo caso sono separate con un tab. Di seguito un esempio del formato del file
Num frame Massa (g)
30 0
60 0.04
90 0.81
120 1.51
150 2.23
180 2.99
210 3.57
240 4.32
...
tempi, massa = np.loadtxt("dati.csv", delimiter = "\t", skiprows = 2, unpack = True)
Plotto i valori delle masse misurate come funzione del numero di frame (del tempo) e verifico l'andamento lineare con un fit
# Retta di fit
def myLine(x, m, q):
return m*x + q
fig, ax = plt.subplots()
fig.set_size_inches(12, 5)
# Plotto i dati
ax.plot(tempi, massa, marker = ".", ls = "", c = "tab:green", label = "Data")
# Errore sulla massa
yerr = np.ones_like(massa) * 0.01
# Faccio il fit lineare e plotto la retta fittata
popt, pcov = curve_fit(myLine, tempi, massa, sigma = yerr, absolute_sigma = True )
ax.plot(tempi, myLine(tempi, *popt), ls = ":", c = "k", label = "Reta fittata")
# Un po' di cosmesi del grafico
ax.set_xlabel("Tempo [frame]", fontsize = 14)
ax.set_ylabel("Massa [g]", fontsize = 14)
ax.set_title("Massa vs tempo", fontsize = 16)
ax.grid()
ax.legend(fontsize = 14)
plt.show()
Valuto le differerenze di massa tra coppie di frame
dm = np.diff(massa)
h, bins = np.histogram(dm, bins = 30)
binc = bins[:-1] + (bins[1]-bins[0])/2
fig, ax = plt.subplots()
fig.set_size_inches(12,5)
ax.plot(binc, h, ds = "steps-mid", c = "darkgreen", lw = 2, label = "$\Delta m$")
ax.fill_between(binc, h, step = "mid", color = "lime", alpha = 1)
#ax.plot(binc, myFun(binc, *popt))
ax.set_xlabel("$\Delta m$ [g]", fontsize = 14)
ax.set_ylabel("Entries", fontsize = 14)
ax.set_title("Istogramma variazione massa", fontsize = 16)
ax.grid()
ax.legend(fontsize = 14)
plt.show()
Questo script salva ogni nFrames
frames nella cartella frame
%%time
# >>> Set input file here
inputFile = r"20230131_111812.mp4"
# >>> Set here ogni quanti frame salvare
nFrames = 30
# Leggo il file video
vidcap = cv2.VideoCapture(inputFile)
# Leggo un frame
success,image = vidcap.read()
# Contatore per sapere a che frame sono
count = 0
# Loopo finche' ho qualcosa da leggere
while success:
# Se sono al numero di frame da esportare, lo salvo
if count % nFrames == 0:
# Nome del file di output
outFrame = f"frame/frame{count}.jpg"
# Scrivo che sto per salvarlo e lo salvo
print(f"Sto per salvare {outFrame}")
cv2.imwrite(outFrame, image) # save frame as JPEG file
# Leggo il frame successivo ed incremento il contatore del numero di frame
success,image = vidcap.read()
#print('Read a new frame: ', success)
count += 1
Sto per salvare frame/frame0.jpg Sto per salvare frame/frame30.jpg Sto per salvare frame/frame60.jpg Sto per salvare frame/frame90.jpg Sto per salvare frame/frame120.jpg Sto per salvare frame/frame150.jpg Sto per salvare frame/frame180.jpg Sto per salvare frame/frame210.jpg Sto per salvare frame/frame240.jpg Sto per salvare frame/frame270.jpg Sto per salvare frame/frame300.jpg Sto per salvare frame/frame330.jpg Sto per salvare frame/frame360.jpg Sto per salvare frame/frame390.jpg Sto per salvare frame/frame420.jpg Sto per salvare frame/frame450.jpg Sto per salvare frame/frame480.jpg Sto per salvare frame/frame510.jpg Sto per salvare frame/frame540.jpg Sto per salvare frame/frame570.jpg Sto per salvare frame/frame600.jpg Sto per salvare frame/frame630.jpg Sto per salvare frame/frame660.jpg Sto per salvare frame/frame690.jpg Sto per salvare frame/frame720.jpg Sto per salvare frame/frame750.jpg Sto per salvare frame/frame780.jpg Sto per salvare frame/frame810.jpg Sto per salvare frame/frame840.jpg Sto per salvare frame/frame870.jpg Sto per salvare frame/frame900.jpg Sto per salvare frame/frame930.jpg Sto per salvare frame/frame960.jpg Sto per salvare frame/frame990.jpg Sto per salvare frame/frame1020.jpg Sto per salvare frame/frame1050.jpg Sto per salvare frame/frame1080.jpg Sto per salvare frame/frame1110.jpg Sto per salvare frame/frame1140.jpg Sto per salvare frame/frame1170.jpg Sto per salvare frame/frame1200.jpg Sto per salvare frame/frame1230.jpg Sto per salvare frame/frame1260.jpg Sto per salvare frame/frame1290.jpg Sto per salvare frame/frame1320.jpg Sto per salvare frame/frame1350.jpg Sto per salvare frame/frame1380.jpg Sto per salvare frame/frame1410.jpg Sto per salvare frame/frame1440.jpg Sto per salvare frame/frame1470.jpg Sto per salvare frame/frame1500.jpg Sto per salvare frame/frame1530.jpg Sto per salvare frame/frame1560.jpg Sto per salvare frame/frame1590.jpg Sto per salvare frame/frame1620.jpg Sto per salvare frame/frame1650.jpg Sto per salvare frame/frame1680.jpg Sto per salvare frame/frame1710.jpg Sto per salvare frame/frame1740.jpg Sto per salvare frame/frame1770.jpg Sto per salvare frame/frame1800.jpg Sto per salvare frame/frame1830.jpg Sto per salvare frame/frame1860.jpg Sto per salvare frame/frame1890.jpg Sto per salvare frame/frame1920.jpg Sto per salvare frame/frame1950.jpg Sto per salvare frame/frame1980.jpg Sto per salvare frame/frame2010.jpg Sto per salvare frame/frame2040.jpg Sto per salvare frame/frame2070.jpg Sto per salvare frame/frame2100.jpg Sto per salvare frame/frame2130.jpg Sto per salvare frame/frame2160.jpg Sto per salvare frame/frame2190.jpg Sto per salvare frame/frame2220.jpg Sto per salvare frame/frame2250.jpg Sto per salvare frame/frame2280.jpg Sto per salvare frame/frame2310.jpg Sto per salvare frame/frame2340.jpg Sto per salvare frame/frame2370.jpg Sto per salvare frame/frame2400.jpg Sto per salvare frame/frame2430.jpg Sto per salvare frame/frame2460.jpg Sto per salvare frame/frame2490.jpg Sto per salvare frame/frame2520.jpg Sto per salvare frame/frame2550.jpg Sto per salvare frame/frame2580.jpg Sto per salvare frame/frame2610.jpg Sto per salvare frame/frame2640.jpg Sto per salvare frame/frame2670.jpg Sto per salvare frame/frame2700.jpg Sto per salvare frame/frame2730.jpg Sto per salvare frame/frame2760.jpg Sto per salvare frame/frame2790.jpg Sto per salvare frame/frame2820.jpg Sto per salvare frame/frame2850.jpg Sto per salvare frame/frame2880.jpg Sto per salvare frame/frame2910.jpg Sto per salvare frame/frame2940.jpg Sto per salvare frame/frame2970.jpg Sto per salvare frame/frame3000.jpg Sto per salvare frame/frame3030.jpg Sto per salvare frame/frame3060.jpg Sto per salvare frame/frame3090.jpg Sto per salvare frame/frame3120.jpg Sto per salvare frame/frame3150.jpg Sto per salvare frame/frame3180.jpg Sto per salvare frame/frame3210.jpg Sto per salvare frame/frame3240.jpg Sto per salvare frame/frame3270.jpg Sto per salvare frame/frame3300.jpg Sto per salvare frame/frame3330.jpg Sto per salvare frame/frame3360.jpg Sto per salvare frame/frame3390.jpg Sto per salvare frame/frame3420.jpg Sto per salvare frame/frame3450.jpg Sto per salvare frame/frame3480.jpg Sto per salvare frame/frame3510.jpg Sto per salvare frame/frame3540.jpg Sto per salvare frame/frame3570.jpg Sto per salvare frame/frame3600.jpg Sto per salvare frame/frame3630.jpg Sto per salvare frame/frame3660.jpg Sto per salvare frame/frame3690.jpg Sto per salvare frame/frame3720.jpg Sto per salvare frame/frame3750.jpg Sto per salvare frame/frame3780.jpg Sto per salvare frame/frame3810.jpg Sto per salvare frame/frame3840.jpg Sto per salvare frame/frame3870.jpg Sto per salvare frame/frame3900.jpg Sto per salvare frame/frame3930.jpg Sto per salvare frame/frame3960.jpg Sto per salvare frame/frame3990.jpg Sto per salvare frame/frame4020.jpg CPU times: total: 1min 45s Wall time: 1min 3s