def run(self, show=False, save=False, tk_var_frame=None, wait=1, start_pos='none'): #interfaces if show or save: fsize = (self.width * 2, self.height) save_frame = np.zeros([self.height, self.width * 2, 3], dtype=np.uint8) if show: namedWindow('Tracking') if save: writer = VideoWriter() writer.open(self.fh.make_path('tracking.avi'), self.fourcc, round(self.fs), frameSize=fsize, isColor=True) #run self.framei = 0 self.pos = [] self.t = [] self.guess = [] self.contour = [] self.pct_xadj = [] self.heat = np.zeros((self.height, self.width)) consecutive_skips = 0 if start_pos == 'x': start_pts = [self.xori_adj, self.xoli_adj] elif start_pos == 'y': start_pts = [self.yori_adj, self.yoli_adj] elif start_pos == 'z': start_pts = [self.zori_adj, self.zoli_adj] elif start_pos == 'c': start_pts = [self.zori, self.xori, self.yori] elif start_pos == 'none': start_pts = [self.zori, self.xori, self.yori] consecutive_skips = self.consecutive_skip_threshold + 1 self.last_center = np.mean(self.pts[np.array(start_pts)], axis=0).astype(int) self.last_contour = np.array([self.last_center]) valid, frame, ts = self.get_frame(self.mov, skip=self.resample - 1) while valid: possible, diff_raw = self.find_possible_contours( frame, consecutive_skips) self.pct_xadj.append( np.mean(diff_raw[self.xadj_idxs[:, 0], self.xadj_idxs[:, 1]])) if len(possible) == 0: center = self.last_center contour = self.last_contour self.guess.append(True) consecutive_skips += 1 else: contour, center = self.choose_best_contour(possible) self.guess.append(False) consecutive_skips = 0 self.pos.append(center) self.contour.append(contour) self.t.append(ts) self.heat[center[1], center[0]] += 1 if show or save: lframe = self.label_frame(frame, center) save_frame[:, :self.width, :] = cvtColor( lframe.astype(np.float32), CV_GRAY2RGB) save_frame[:, self.width:, :] = cvtColor( (self.diff * 255).astype(np.float32), CV_GRAY2RGB) if show: self.show_frame(save_frame, wait=wait) if save: writer.write(save_frame) self.last_center = center self.last_contour = contour valid, frame, ts = self.get_frame(self.mov, skip=self.resample - 1) if tk_var_frame != None: tk_var_frame[0].set('%i/%i' % (self.results['n_frames'], len(self.time) / float(self.resample))) tk_var_frame[1].update() if save: writer.release() self.end()
def run(self, show=False, save=False, tk_var_frame=None): if show: namedWindow('Movie') namedWindow('Tracking') if save: bgs = np.shape(self.background) fsize = (bgs[0], bgs[1] * 2) writer = VideoWriter() writer.open(os.path.join(self.trial_dir, '%s_tracking_movie' % self.trial_name), self.fourcc, 37., frameSize=(fsize[1], fsize[0]), isColor=True) self.results['n_frames'] = 0 consecutive_skips = 0 while True: valid, frame = self.get_frame(self.mov, skip=self.resample - 1) if not valid: break diff = absdiff(frame, self.background) _, diff = threshold(diff, self.diff_thresh, 1, THRESH_BINARY) diff = diff * self.rooms_mask edges = Canny(diff.astype(np.uint8), self.cth1, self.cth2) contours, hier = findContours(edges, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1) contours = [ c for c in contours if not any([ pa.contains_point(contour_center(c)) for pa in self.paths_ignore ]) ] if consecutive_skips > self.consecutive_skip_threshold: consecutive_skips = 0 possible = contours else: possible = [ c for c in contours if dist(contour_center( c), self.last_center) < self.translation_max ] if len(possible) == 0: center = self.last_center self.results['skipped'] += 1 consecutive_skips += 1 if self.path_l.contains_point(center): self.results['left_assumed'] += 1 if self.path_r.contains_point(center): self.results['right_assumed'] += 1 if self.path_c.contains_point(center): self.results['middle_assumed'] += 1 else: chosen = possible[np.argmax([contourArea(c) for c in possible])] center = contour_center(chosen) self.results['centers'].append(center) self.results['heat'][center[1], center[0]] += 1 if self.path_l.contains_point(center): self.results['left'] += 1 if self.path_r.contains_point(center): self.results['right'] += 1 if self.path_c.contains_point(center): self.results['middle'] += 1 self.results['centers_all'].append(center) #display if show or save: showimg = np.copy(frame).astype(np.uint8) if self.path_l.contains_point(center): color = (0, 0, 0) elif self.path_r.contains_point(center): color = (255, 255, 255) else: color = (120, 120, 120) circle(showimg, tuple(center), radius=10, thickness=5, color=color) if show: cv2imshow('Movie', showimg) cv2imshow('Tracking', diff) waitKey(1) #/display if save: save_frame = np.zeros([fsize[0], fsize[1], 3], dtype=np.uint8) save_frame[:, :np.shape(frame)[1]] = cvtColor( showimg.astype(np.float32), CV_GRAY2RGB) save_frame[:, np.shape(frame)[1]:] = cvtColor( (diff * 255).astype(np.float32), CV_GRAY2RGB) writer.write(save_frame) self.results['n_frames'] += 1 self.last_center = center if tk_var_frame != None: tk_var_frame[0].set('%i/%i' % (self.results['n_frames'], len(self.time) / float(self.resample))) tk_var_frame[1].update() #pbar.update(self.results['n_frames']) #pbar.finish() if save: writer.release() self.end()
def run(self, show=False, save=False, tk_var_frame=None): if show: namedWindow('Movie') namedWindow('Tracking') if save: bgs = np.shape(self.background) fsize = (bgs[0], bgs[1]*2) writer = VideoWriter() writer.open(os.path.join(self.trial_dir,'%s_tracking_movie'%self.trial_name),self.fourcc,37.,frameSize=(fsize[1],fsize[0]),isColor=True) self.results['n_frames'] = 0 consecutive_skips = 0 while True: valid,frame = self.get_frame(self.mov,skip=self.resample-1) if not valid: break diff = absdiff(frame,self.background) _, diff = threshold(diff, self.diff_thresh, 1, THRESH_BINARY) diff = diff*self.rooms_mask edges = Canny(diff.astype(np.uint8), self.cth1, self.cth2) contours, hier = findContours(edges, RETR_EXTERNAL, CHAIN_APPROX_TC89_L1) contours = [c for c in contours if not any([pa.contains_point(contour_center(c)) for pa in self.paths_ignore])] if consecutive_skips>self.consecutive_skip_threshold: consecutive_skips=0 possible = contours else: possible = [c for c in contours if dist(contour_center(c),self.last_center)<self.translation_max] if len(possible) == 0: center = self.last_center self.results['skipped'] += 1 consecutive_skips+=1 if self.path_l.contains_point(center): self.results['left_assumed']+=1 if self.path_r.contains_point(center): self.results['right_assumed']+=1 if self.path_c.contains_point(center): self.results['middle_assumed']+=1 else: chosen = possible[np.argmax([contourArea(c) for c in possible])] center = contour_center(chosen) self.results['centers'].append(center) self.results['heat'][center[1],center[0]] += 1 if self.path_l.contains_point(center): self.results['left']+=1 if self.path_r.contains_point(center): self.results['right']+=1 if self.path_c.contains_point(center): self.results['middle']+=1 self.results['centers_all'].append(center) #display if show or save: showimg = np.copy(frame).astype(np.uint8) if self.path_l.contains_point(center): color = (0,0,0) elif self.path_r.contains_point(center): color = (255,255,255) else: color = (120,120,120) circle(showimg, tuple(center), radius=10, thickness=5, color=color) if show: cv2imshow('Movie',showimg) cv2imshow('Tracking', diff) waitKey(1) #/display if save: save_frame = np.zeros([fsize[0], fsize[1], 3],dtype=np.uint8) save_frame[:,:np.shape(frame)[1]] = cvtColor(showimg.astype(np.float32), CV_GRAY2RGB) save_frame[:,np.shape(frame)[1]:] = cvtColor((diff*255).astype(np.float32), CV_GRAY2RGB) writer.write(save_frame) self.results['n_frames'] += 1 self.last_center = center if tk_var_frame != None: tk_var_frame[0].set('%i/%i'%(self.results['n_frames'], len(self.time)/float(self.resample) )) tk_var_frame[1].update() #pbar.update(self.results['n_frames']) #pbar.finish() if save: writer.release() self.end()
def run(self, show=False, save=False, tk_var_frame=None, wait=1, start_pos='none'): #interfaces if show or save: fsize = (self.width*2, self.height) save_frame = np.zeros([self.height, self.width*2, 3], dtype=np.uint8) if show: namedWindow('Tracking') if save: writer = VideoWriter() writer.open(self.fh.make_path('tracking.avi'),self.fourcc,round(self.fs),frameSize=fsize,isColor=True) #run self.framei = 0 self.pos = [] self.t = [] self.guess = [] self.contour = [] self.pct_xadj = [] self.heat = np.zeros((self.height,self.width)) consecutive_skips = 0 if start_pos == 'x': start_pts = [self.xori_adj, self.xoli_adj] elif start_pos == 'y': start_pts = [self.yori_adj, self.yoli_adj] elif start_pos == 'z': start_pts = [self.zori_adj, self.zoli_adj] elif start_pos == 'c': start_pts = [self.zori, self.xori, self.yori] elif start_pos == 'none': start_pts = [self.zori, self.xori, self.yori] consecutive_skips = self.consecutive_skip_threshold+1 self.last_center = np.mean(self.pts[np.array(start_pts)],axis=0).astype(int) self.last_contour = np.array([self.last_center]) valid,frame,ts = self.get_frame(self.mov,skip=self.resample-1) while valid: possible,diff_raw = self.find_possible_contours(frame,consecutive_skips) self.pct_xadj.append(np.mean( diff_raw[self.xadj_idxs[:,0],self.xadj_idxs[:,1]])) if len(possible) == 0: center = self.last_center contour = self.last_contour self.guess.append(True) consecutive_skips+=1 else: contour,center = self.choose_best_contour(possible) self.guess.append(False) consecutive_skips = 0 self.pos.append(center) self.contour.append(contour) self.t.append(ts) self.heat[center[1],center[0]] += 1 if show or save: lframe = self.label_frame(frame, center) save_frame[:,:self.width, :] = cvtColor(lframe.astype(np.float32), CV_GRAY2RGB) save_frame[:,self.width:, :] = cvtColor((self.diff*255).astype(np.float32), CV_GRAY2RGB) if show: self.show_frame(save_frame, wait=wait) if save: writer.write(save_frame) self.last_center = center self.last_contour = contour valid,frame,ts = self.get_frame(self.mov,skip=self.resample-1) if tk_var_frame != None: tk_var_frame[0].set('%i/%i'%(self.results['n_frames'], len(self.time)/float(self.resample) )) tk_var_frame[1].update() if save: writer.release() self.end()