def find_object(img, thresholds, sizerange, dist_thresh, erode=False, check_centers=True): body = nim.threshold(img, thresholds[0], thresholds[1]) if erode is not False: for i in range(erode): body = binary_erosion(body) if check_centers is False: blobs = nim.find_blobs(body, sizerange=sizerange, aslist=False) else: blobs = nim.find_blobs(body, sizerange=sizerange, aslist=True) body = blobs if check_centers: centers = nim.center_of_blob(blobs) dist = [] for center in centers: diff = np.linalg.norm( center - np.array(img.shape)/2. ) dist.append(diff) body = np.zeros_like(img) for j, d in enumerate(dist): if d < dist_thresh: body += blobs[j] if body.max() > 1: body /= body.max() if body is None: body = np.zeros_like(img) body = np.array(body*255, dtype=np.uint8) return body
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