Beispiel #1
0
    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()
Beispiel #2
0
    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()