def generate_heatmap(self,section):
if self.cache is None:
logger.warning('Surface cache is not build yet.')
return
x,y = self.real_world_size['x'],self.real_world_size['y']
x = max(1,int(x))
y = max(1,int(y))
filter_size = int(int(self.heatmap_detail * x)/2)*2 +1
std_dev = int(filter_size /6.)
self.heatmap = np.ones((y,x,4),dtype=np.uint8)
all_gaze = []
for frame_idx,c_e in enumerate(self.cache[section]):
if c_e:
frame_idx+=section.start
for gp in self.gaze_on_srf_by_frame_idx(frame_idx,c_e['m_from_screen']):
if gp['confidence']>=self.g_pool.min_data_confidence:
all_gaze.append(gp['norm_pos'])
if not all_gaze:
logger.warning("No gaze data on surface for heatmap found.")
all_gaze.append((-1.,-1.))
all_gaze = np.array(all_gaze)
all_gaze *= [self.real_world_size['x'],self.real_world_size['y']]
hist,xedge,yedge = np.histogram2d(all_gaze[:,0], all_gaze[:,1],
bins=[x,y],
range=[[0, self.real_world_size['x']], [0,self.real_world_size['y']]],
normed=False,
weights=None)
hist = np.rot90(hist)
#smoothing..
hist = cv2.GaussianBlur(hist,(filter_size,filter_size),std_dev)
maxval = np.amax(hist)
if maxval:
scale = 255./maxval
else:
scale = 0
hist = np.uint8( hist*(scale) )
#colormapping
c_map = cv2.applyColorMap(hist, cv2.COLORMAP_JET)
self.heatmap[:,:,:3] = c_map
self.heatmap[:,:,3] = 125
self.heatmap_texture = Named_Texture()
self.heatmap_texture.update_from_ndarray(self.heatmap)
评论列表
文章目录