Analisi dati clessidra¶

In questo quaderno viene mostrata l'analisi dati relativa al tempo di caduta della sabbia da una clessidra.

Downloads:

  • Quaderno jupyter
  • Video di riferimento Per l'ultima parte, dove vado ad esportarmi i vari frame come immagine
  • File csv con i dati usati per questa analisi
In [1]:
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

...
In [2]:
tempi, massa = np.loadtxt("dati.csv", delimiter = "\t", skiprows = 2, unpack = True)

Verifica dell'andamento lineare massa vs tempo¶

Plotto i valori delle masse misurate come funzione del numero di frame (del tempo) e verifico l'andamento lineare con un fit

In [3]:
# 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()

Calcolo l'aggiunta di massa in intervalli di tempo fissati¶

Valuto le differerenze di massa tra coppie di frame

In [4]:
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()
In [ ]:
 

Save single frames¶

Questo script salva ogni nFrames frames nella cartella frame

In [5]:
%%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
In [ ]: