class FindRed(Behavior): """ Uses the camera to find out if there is a red object in front of the robot """ def __init__(self, sensob=None, debug=False): super().__init__() self.priority = MED self.debug = debug self.imager = Imager(width=IMG_WIDTH, height=IMG_HEIGHT) self.motor_recommendations = [Motors.forward] def __name__(self): return "FindRed" def sense_and_act(self): """ Take a picture, find the percentage of red pixels """ def red_only(p): """ Maps red pixels to white, everything else to black """ lower = (155, 25, 0) upper = (255, 100, 100) r, g, b = p if (lower[0] <= r <= upper[0] and lower[1] <= g <= upper[1] and lower[2] <= b <= upper[2]): return (255, 255, 255) return (0, 0, 0) image = self.bbcon.get_sensob_value(Camera) mapped = self.imager.map_image2(red_only, image=image) if self.debug: mapped.dump_image(fid='image_mapped', type='png') im_arr = np.array(mapped.image) white_pixels = np.sum(im_arr == (255, 255, 255)) ratio = white_pixels / (len(im_arr[0]) * len(im_arr)) if ratio > 0.5: self.match_degree = 0.8 self.motor_speed = 1 else: self.match_degree = 0 self.motor_speed = 0.3
class FindRed(Behavior): """ This behaviour advices the robot to accelerate whenever the camera spots something red. """ def __init__(self, sensob=None, debug=False): self.priority = 1 self.debug = debug self.imager = Imager(width=IMG_WIDTH, height=IMG_HEIGHT) super().__init__() def sense_and_act(self): """ Take a picture, find the percentage of red pixels """ def red_only(p): """ Maps red pixels to white, everything else to black """ lower = (155, 25, 0) upper = (255, 100, 100) # r, g, b = p # if (lower[0] <= r <= upper[0] and # lower[1] <= g <= upper[1] and # lower[2] <= b <= upper[2]): # return (255, 255, 255) if lower <= p <= upper: return (255, 255, 255) return (0, 0, 0) image = self.bbcon.sensobs.values['camera'] mapped = self.imager.map_image2(red_only, image=image) if self.debug: mapped.dump_image(fid='image_mapped', type='png') im_arr = np.array(mapped.image) white_pixels = np.sum(im_arr == (255, 255, 255)) ratio = white_pixels/(len(im_arr[0])*len(im_arr)) return 0.8 if ratio > 0.05 else 0, 5