mobile-face-gaze
mobile-face-gaze copied to clipboard
Filtering the gaze vector
Gaze vector coordinates can be filtered over time with a low-pass filter. @berndporr's approach is very easy to use. Efficient realtime IIR filter in Python
If I try to write a short example in order to low pass filter the gaze vector movements over time:
import iir_filter
from scipy import signal
# Lets say you are using Face Mesh as face detector and landmark generator.
# In this way the FPS can be fixed for example to 20Hz.
FPS = 20 #Hz
f_nyquist = FPS/2 #Hz
cutoff_freq=2 #Hz
order=2 #Order of lp filter
sos = signal.butter(N=order, Wn=cutoff_freq/f_nyquist , btype='low', fs=FPS, output='sos')
filter_gaze_vec_0 = iir_filter.IIR_filter(sos) # first lp filter class for gaze vector first element
filter_gaze_vec_1 = iir_filter.IIR_filter(sos) # second lp filter class for gaze vector second element
while True:
ret, frame = cap.read()
...
...
# On every frame, gaze vector points are filtered.
# Previous IIR coefficients are stored in the filter classes separately.
# Every new value is filtered...
sample_gaze_vec_0 = filter_gaze_vec_0.filter(sample_gaze_vec_0)
sample_gaze_vec_1 = filter_gaze_vec_1.filter(sample_gaze_vec_1)