def calc_post_pos(movieinfo): threshed_img = nim.threshold(movieinfo.background, 0, 35) blob = nim.find_biggest_blob(threshed_img) center, radius = nim.find_circle(blob, npts=200, navg=30, nstart=0, plot=False) movieinfo.post_pos = center movieinfo.post_radius_in_pixels = radius
def get_active_frames(npmovie): # series of frames where position is not (0,0) try: frame_of_landing = npmovie.frame_of_landing except: frame_of_landing = -1 frames = np.nonzero(npmovie.obj.bool[0:frame_of_landing] > 50)[0] framediff = np.diff(frames) == 1 blobs = nim.find_biggest_blob(framediff) try: contframes = frames[np.where(blobs == 1)[0].tolist()].tolist() except: contframes = [] return contframes
def background_subtraction(self, raw, save_raw=False): mask_center_0 = int(self.mask_center[0]) mask_center_1 = int(self.mask_center[1]) mask_0_lo = max(0, mask_center_0 - self.mask_radius) mask_0_hi = min(self.width, mask_center_0 + self.mask_radius) mask_1_lo = max(0, mask_center_1 - self.mask_radius) mask_1_hi = min(self.width, mask_center_1 + self.mask_radius) if self.tracking_mask is not None: tracking_mask = copy.copy(self.tracking_mask) tracking_mask[mask_0_lo:mask_0_hi, mask_1_lo:mask_1_hi] = 1 if self.dynamic_tracking_mask is True: # TODO: currently dynamic tracking and such only works for square format cameras #print 'dynamic tracking' masked_img = raw[mask_0_lo:mask_0_hi, mask_1_lo:mask_1_hi] masked_background = self.background[mask_0_lo:mask_0_hi, mask_1_lo:mask_1_hi] else: masked_img = raw masked_background = self.background ''' if masked_img.shape[0] < 100 or masked_img.shape[1] < 100: #print 'no uframe' self.dynamic_tracking_mask = False uframe = uFrame() return uframe, None ''' absdiff = nim.absdiff(masked_img, masked_background) if self.dynamic_tracking_mask is False and self.tracking_mask is not None: absdiff *= tracking_mask #absdiff = nim.auto_adjust_levels(absdiff) #print 'shape: ', np.shape(absdiff) #threshold = max( 10, absdiff.max() - THRESHRANGE ) #print 'dynamic threshold: ', threshold #diffthresh = nim.threshold(absdiff, threshold) #print 'max absdiff: ', absdiff.max() diffthresh = nim.threshold(absdiff, 15, threshold_hi=255) # abort early if there is no info: s = np.sum(diffthresh) if s < 10: uframe = uFrame() #print 'no uframe, early abort, sum: ', s self.dynamic_tracking_mask = False return uframe, None blobs = nim.find_blobs(diffthresh, self.blob_size_range) if blobs is None: self.dynamic_tracking_mask = False masked_img = raw masked_background = self.background absdiff = nim.absdiff(masked_img, masked_background) diffthresh = nim.threshold(absdiff, threshold) if self.dynamic_tracking_mask is False and self.tracking_mask is not None: diffthresh *= tracking_mask blobs = nim.find_blobs(diffthresh, self.blob_size_range) if blobs is None: uframe = uFrame() if save_raw is False: #print 'no uframe' self.dynamic_tracking_mask = False return uframe, None else: frame = Frame(raw, absdiff, diffthresh) return uframe, frame nblobs = blobs.max() #print 'n blobs: ', nblobs if nblobs > 1: blobs = nim.find_biggest_blob(blobs) center = nim.center_of_blob(blobs) #print 'center: ', center if np.isnan(center)[0] or np.isnan(center)[1]: uframe = uFrame() #print 'no uframe, NaN center!' self.dynamic_tracking_mask = False return uframe, None if center[0] < 1 or center[1] < 1: uframe = uFrame() #print 'no uframe, NaN center!' self.dynamic_tracking_mask = False return uframe, None #print 'center found' if 1: limlo_x = max( int(center[0])-ROI_RADIUS, 0 ) limlo_y = max( int(center[1])-ROI_RADIUS, 0 ) limhi_x = min( int(center[0])+ROI_RADIUS, masked_img.shape[0] ) limhi_y = min( int(center[1])+ROI_RADIUS, masked_img.shape[1] ) # TODO: right now object entering or leaving frame doesnt work perfectly uimg = masked_img[limlo_x:limhi_x, limlo_y:limhi_y] uimg = copy.copy(uimg) uimg_absdiff = absdiff[limlo_x:limhi_x, limlo_y:limhi_y] uimg_absdiff = copy.copy(uimg_absdiff) uimg_diffthresh = blobs[limlo_x:limhi_x, limlo_y:limhi_y] uimg_diffthresh = copy.copy(uimg_diffthresh) if self.dynamic_tracking_mask is True: tmp = np.array([masked_img.shape[0]/2., masked_img.shape[1]/2.]) center = np.array(self.mask_center) + np.array(center) - tmp uimg_indices = [mask_0_lo+limlo_x, mask_0_lo+limhi_x, mask_1_lo+limlo_y, mask_1_lo+limhi_y] else: uimg_indices = [limlo_x, limhi_x, limlo_y, limhi_y] self.dynamic_tracking_mask = True self.mask_center = center uframe = uFrame(center, uimg, uimg_absdiff, uimg_diffthresh) uframe.blobsize = blobs.sum() uframe.indices = uimg_indices if save_raw is False: del(raw) del(absdiff) del(diffthresh) del(blobs) return uframe, None frame = Frame(masked_img, absdiff, diffthresh) return uframe, frame