class App(object): def __init__(self): self._window_manager = WindowManager('Minimum Viable Product', self._on_keypress) self._recorder = ImageDataRecorder(self._window_manager) self._second_phase_activate = False def _on_keypress(self, keycode): """Handle a keypress. space -> Take a screenshot. tab -> Start/stop recording a screencast. escape -> Quit. """ if keycode == 32: # space self._recorder.write_image('screenshot.png') elif keycode == 9: # tab if not self._recorder.is_writing_video: self._recorder.start_writing_video( 'screencast.avi') else: self._recorder.stop_writing_video() elif keycode == 27: # escape self._recorder.stop() while self._recorder.processed: pass self._window_manager.destroy_window() elif keycode == 115: # s self._second_phase_activate = True else: print(keycode) def _recorder_show(self): while self._recorder.processed and self._window_manager.is_window_created: self._window_manager.process_events() original = self._recorder.original_capture processing = self._recorder.processing_capture roi = self._recorder.roi_capture self._window_manager.show(original, processing, roi) self._recorder.release_frame() def run_simple(self): self._window_manager.create_window() self._recorder.start(0, 1000) self._recorder_show() def run_algorithm(self): self._window_manager.create_window() uart = uart_control.UartControl() # first phase: 4 faces base_count = 5 current_face = 1 led = 10 # with SpeakerManager() as speaker: # speaker.say('Начинаем получение данных', 3) while current_face <= 4: # TODO: # uart.enable_led(led)] self._recorder.start(current_face, base_count) # TODO: show recording process, ... self._recorder_show() time.sleep(4) # uart.disable_led() # time.sleep(1) # TODO: rotate 90 uart.start_step(1600) time.sleep(4) current_face += 1 # how to wait: by keypress 's' # while not self._second_phase_activate: # self._window_manager.process_events() with SpeakerManager() as speaker: speaker.say('Переверните упаковку', 3) time.sleep(10) # second phase: 2 faces while current_face <= 6: # TODO: # uart.enable_led(led) self._recorder.start(current_face, base_count) # TODO: show recording process, ... self._recorder_show() time.sleep(4) # uart.disable_led() # time.sleep(1) # TODO: rotate 180 uart.start_step(3200) time.sleep(8) current_face += 1 print(len(self._recorder.data)) image_folder = './images/' for key in self._recorder.data.keys(): image_filename = image_folder + 'image2_' + str(key) + '.png' print(image_filename) cv2.imwrite(image_filename, self._recorder.data[key])
class App(object): def __init__(self): self._window_manager = WindowManager('Minimum Viable Product', self._on_keypress) self._recorder = ImageDataRecorder(self._window_manager) self._second_phase_activate = False def _on_keypress(self, keycode): """Handle a keypress. space -> Take a screenshot. tab -> Start/stop recording a screencast. escape -> Quit. """ if keycode == 32: # space self._recorder.write_image('screenshot.png') elif keycode == 9: # tab if not self._recorder.is_writing_video: self._recorder.start_writing_video( 'screencast.avi') else: self._recorder.stop_writing_video() elif keycode == 27: # escape self._recorder.stop() while self._recorder.processed: pass self._window_manager.destroy_window() elif keycode == 115: # s self._second_phase_activate = True else: print(keycode) def _recorder_show(self): while self._recorder.processed and self._window_manager.is_window_created: self._window_manager.process_events() original = self._recorder.original_capture processing = self._recorder.processing_capture roi = self._recorder.roi_capture self._window_manager.show(original, processing, roi) self._recorder.release_frame() def run_simple(self): self._window_manager.create_window() self._recorder.start(0, 1000) self._recorder_show() def run_algorithm(self): self._window_manager.create_window() uart = uart_control.UartControl() # first phase: 4 faces base_count = 3 current_face = 0 led = 10 while current_face < 4: # TODO: uart.enable_led(led) self._recorder.start(current_face, base_count) # TODO: show recording process, ... self._recorder_show() time.sleep(4) uart.disable_led() time.sleep(1) # TODO: rotate 90 uart.start_step(1600) time.sleep(4) current_face += 1 # how to wait: by keypress 's' #while not self._second_phase_activate: # self._window_manager.process_events() time.sleep(10) # second phase: 2 faces while current_face < 6: # TODO: uart.enable_led(led) self._recorder.start(current_face, base_count) # TODO: show recording process, ... self._recorder_show() time.sleep(4) uart.disable_led() time.sleep(1) # TODO: rotate 180 uart.start_step(3200) time.sleep(8) current_face += 1 # print(len(self._recorder.data)) def test_uart(self): uart = uart_control.UartControl() uart.enable_led(10) uart.start_step(6400) time.sleep(12.8) uart.disable_led()
class MVP(object): def __init__(self): self._thread_mode = True self._windowManager = WindowManager('Minimum Viable Product', self.on_keypress) self._amount_frames = 0 self._success_finding_contours = 0 # DroidCam URL # url = 'http://192.168.55.78:4747/video' url = 0 self._captureManager = CaptureManager( cv2.VideoCapture(url), self._windowManager, False) # self._curveFilter = filters.BGRPortraCurveFilter() # self._convolutionFilter = filters.FindEdgesFilter() # self._imageProcessor = image_processor.SimpleImageProcessor() # self._objectDetector = object_detector.SimpleObjectDetector() def run(self): """Run the main loop.""" threadn = cv2.getNumberOfCPUs() pool = ThreadPool(processes=threadn) pending = deque() # latency = StatValue() # frame_interval = StatValue() # last_frame_time = clock() # TODO: Camera Calibration, Video Stabilization self._windowManager.create_window() while self._windowManager.is_window_created: self._captureManager.enter_frame() original = self._captureManager.original self._captureManager.frame = original # if original is not None: # output = self.process_and_detect(original) # self._captureManager.frame = output§ while len(pending) > 0 and pending[0].ready(): output = pending.popleft().get() # latency.update(clock() - t0) cv2.putText(output, "threaded : " + str(self._thread_mode), (15, 80), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2) # draw_str(res, (20, 40), "latency : %.1f ms" % (latency.value * 1000)) # draw_str(res, (20, 60), "frame interval : %.1f ms" % (frame_interval.value * 1000)) self._captureManager.frame = output self._captureManager.exit_frame() if len(pending) < threadn: # ret, frame = cap.read() # t = clock() # frame_interval.update(t - last_frame_time) # last_frame_time = t if self._thread_mode: task = pool.apply_async(self.process_and_detect, (original.copy(),)) else: task = DummyTask(self.process_and_detect(original)) pending.append(task) self._captureManager.exit_frame() self._windowManager.process_events() def process_and_detect(self, src): self._amount_frames += 1 # filters.strokeEdges(src, src) # self._curveFilter.apply(src, src) # self._convolutionFilter.apply(src, src) # self._imageProcessor.process(src, src) # self._objectDetector.detect(src) # TODO: Image Preprocessor: removing shadows, small blobs, noise, enhancing, etc # TODO: Image Processor processing = self.image_processing_template_one(src) # gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # filtering = cv2.bilateralFilter(gray, 1, 10, 120) # TODO: Object Detector output = cv2.cvtColor(processing, cv2.COLOR_GRAY2BGR) success_detect = self.try_detect(input=processing, output=output, post_detect_fn=self.post_detect_draw) if not success_detect: # TODO: image_processing_template_two pass # TODO: Get 4-contours square counts If zero # TODO: [For 3D] Wrapping & Transformations # TODO: to be continued return output def image_processing_template_one(self, src): # TODO: Color space: GRAYSCALE, HSV, ... gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # TODO: Convolution, Blurring, ... # filtering = cv2.bilateralFilter(gray, 1, 10, 120) filtering = self.image_filtering(gray) # TODO: Edge detection # edges = cv2.Canny(gray, 10, 250) edges = self.edge_detection(filtering) # TODO: Morphological operations # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) # closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel) closed = self.morphological_transformations(edges) return closed def image_filtering(self, src): diameter = self._windowManager.get_trackbar_value('diameter(for bilateralFilter)') sigma_color = self._windowManager.get_trackbar_value('sigmaColor(for bilateralFilter)') sigma_space = self._windowManager.get_trackbar_value('sigmaSpace(for bilateralFilter)') filtering = cv2.bilateralFilter(src, diameter, sigma_color, sigma_space) return filtering def edge_detection(self, src): threshold_min = self._windowManager.get_trackbar_value('threshold min(for Canny edge detection)') threshold_max = self._windowManager.get_trackbar_value('threshold max(for Canny edge detection)') edges = cv2.Canny(src, threshold_min, threshold_max) return edges def morphological_transformations(self, edges): kernel_size = self._windowManager.get_trackbar_value('kernel size(morphological structuring element)') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size)) closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel) return closed def try_detect(self, input, output, post_detect_fn): success_standard = self.detect_standard_rects(input, output, post_detect_fn) if not success_standard: # TODO: detect_rects_by_lines pass return success_standard def detect_standard_rects(self, input, output, post_detect_fn): contour_area_points = self._windowManager.get_trackbar_value('Contour area min amount points (*100)') approx_edges_amount = self._windowManager.get_trackbar_value('Approx edges amount') _, contours, h = cv2.findContours(input, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rects_count = 0 for cont in contours: if cv2.contourArea(cont) > contour_area_points * 100: arc_len = cv2.arcLength(cont, True) approx = cv2.approxPolyDP(cont, 0.1 * arc_len, True) if len(approx) == approx_edges_amount: post_detect_fn(output, approx) rects_count += 1 if rects_count > 0: self._success_finding_contours += 1 color_yellow = (0, 255, 255) percent_success_finding = round((self._success_finding_contours / self._amount_frames) * 100, 2) cv2.putText(output, str(percent_success_finding) + "%", (15, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2) return rects_count > 0 @staticmethod def post_detect_draw(output, approx): cv2.drawContours(output, [approx], -1, (255, 0, 0), 2) def on_keypress(self, keycode): """Handle a keypress. space -> Take a screenshot. tab -> Start/stop recording a screencast. escape -> Quit. """ if keycode == 32: # space # self._captureManager.write_image('screenshot.png') self._thread_mode = not self._thread_mode elif keycode == 9: # tab if not self._captureManager.is_writing_video: self._captureManager.start_writing_video( 'screencast.avi') else: self._captureManager.stop_writing_video() elif keycode == 27: # escape self._windowManager.destroy_window()