From 94f56a0f7c3d1d68964bb752d0cdd7883ccbf4d9 Mon Sep 17 00:00:00 2001 From: ori Date: Sat, 25 May 2019 06:20:25 -0700 Subject: [PATCH] playing with pipe send and recive and async task --- backend/app/classes/SettingsManager.py | 6 +-- backend/app/handlers/VisionHandler.py | 66 +++++++++----------------- 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/backend/app/classes/SettingsManager.py b/backend/app/classes/SettingsManager.py index bb2bde79a..d2d8e9ca0 100644 --- a/backend/app/classes/SettingsManager.py +++ b/backend/app/classes/SettingsManager.py @@ -81,12 +81,12 @@ class SettingsManager(metaclass=Singleton): true_cameras = [] usb_devices = cscore.UsbCamera.enumerateUsbCameras() - for index in range(len(usb_devices)): - cap = cv2.VideoCapture(index) + for index, device in enumerate(usb_devices): + cap = cv2.VideoCapture(device.dev) if cap.isOpened(): true_cameras.append(index) cap.release() - index += 1 + for i in true_cameras: self.usb_cameras_info[usb_devices[i].name] = usb_devices[i] diff --git a/backend/app/handlers/VisionHandler.py b/backend/app/handlers/VisionHandler.py index f18d762fd..9bb270cef 100644 --- a/backend/app/handlers/VisionHandler.py +++ b/backend/app/handlers/VisionHandler.py @@ -8,9 +8,9 @@ from app.classes.SettingsManager import SettingsManager from ..classes.Singleton import Singleton import time from multiprocessing import Process, Pipe +import multiprocessing import threading - class VisionHandler(metaclass=Singleton): def __init__(self): self.kernel = numpy.ones((5, 5), numpy.uint8) @@ -82,49 +82,31 @@ class VisionHandler(metaclass=Singleton): threading.Thread(target=self.thred_proc, args=(cs,cam_name)).start() - - # parent, child = Pipe() - # cv_sink = cs.getVideo(camera=SettingsManager.usb_cameras[cam_name]) - # image = numpy.zeros(shape=(SettingsManager().cams[cam_name]["video_mode"]["width"], - # SettingsManager().cams[cam_name]["video_mode"]["height"], 3), dtype=numpy.uint8) - # cv_publish = cs.putVideo(name=cam_name, width=SettingsManager().cams[cam_name]["video_mode"]["width"], - # height=SettingsManager().cams[cam_name]["video_mode"]["height"]) - # - # proc = Process(target=self.camera_process, - # args=(SettingsManager.usb_cameras[cam_name], cam_name, child)) - # proc.start() - # pipes.append( - # { - # "cam": SettingsManager.usb_cameras[cam_name], - # "cv_sink": cv_sink, - # "pipe": parent, - # "image": image, - # "publish":cv_publish - # } - # ) - # - # while True: - # for dic in pipes: - # a,b = dic["cv_sink"].grabFrame(dic["image"]) - # dic["pipe"].send(a) - # dic["publish"].putFrame(b) - - def thred_proc(self,cs,cam_name): + async def pipe_send(pipe, data): + pipe.send(data) + + async def pipe_recive(pipe): + return pipe.recv() cv_sink = cs.getVideo(camera=SettingsManager.usb_cameras[cam_name]) image = numpy.zeros(shape=(SettingsManager().cams[cam_name]["video_mode"]["width"], SettingsManager().cams[cam_name]["video_mode"]["height"], 3), dtype=numpy.uint8) cv_publish = cs.putVideo(name=cam_name, width=SettingsManager().cams[cam_name]["video_mode"]["width"], height=SettingsManager().cams[cam_name]["video_mode"]["height"]) parent,child = Pipe() - proc = Process(target=self.camera_process, args=(SettingsManager.usb_cameras[cam_name], cam_name, child)).start() + Process(target=self.camera_process, args=(SettingsManager.usb_cameras[cam_name], cam_name, child)).start() while True: + start = time.time() _, image = cv_sink.grabFrame(image) parent.send(image) + # pipe_send(parent,image) + image = parent.recv() cv_publish.putFrame(image) + end = time.time() + print(cam_name + " " + str(1 / (end - start))) - def camera_process(self, camera, cam_name, pipe): + def camera_process(self, camera, cam_name, child_pipe): curr_pipline = list(SettingsManager.cams[cam_name]["pipelines"].values())[0] @@ -149,17 +131,13 @@ class VisionHandler(metaclass=Singleton): # change_camera_values() cam_area = SettingsManager().cams[cam_name]["video_mode"]["width"] * \ SettingsManager().cams[cam_name]["video_mode"]["height"] - while True: - start = time.time() - image = pipe.recv() - # hsv_image = self._hsv_threshold(curr_pipline["hue"], - # curr_pipline["saturation"], curr_pipline["value"], - # image, curr_pipline["erode"], curr_pipline["dilate"]) - # # if table.getBoolean("Driver_Mode", False): - # contours = self.find_contours(hsv_image) - # filtered_contours = self.filter_contours(contours, cam_area, curr_pipline["area"], curr_pipline["ratio"], curr_pipline["extent"]) - # image = self.draw_image(input_image=image, is_binary=False, rectangles=filtered_contours) - - end = time.time() - print(1 / (end - start)) \ No newline at end of file + image = child_pipe.recv() + hsv_image = self._hsv_threshold(curr_pipline["hue"], + curr_pipline["saturation"], curr_pipline["value"], + image, curr_pipline["erode"], curr_pipline["dilate"]) + # if table.getBoolean("Driver_Mode", False): + contours = self.find_contours(hsv_image) + filtered_contours = self.filter_contours(contours, cam_area, curr_pipline["area"], curr_pipline["ratio"], curr_pipline["extent"]) + image = self.draw_image(input_image=image, is_binary=False, rectangles=filtered_contours) + child_pipe.send(image)