diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..3e99ede35449c19657050b5668845a4690f035b3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "." + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/Code_objets/__pycache__/Display.cpython-310.pyc b/Code_objets/__pycache__/Display.cpython-310.pyc index b2170e9591314447e8a13d70e170b9cae774f34b..ce8f04f19664a039fe127ec94b25b6607f4ace33 100644 Binary files a/Code_objets/__pycache__/Display.cpython-310.pyc and b/Code_objets/__pycache__/Display.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/ImageProcessing.cpython-310.pyc b/Code_objets/__pycache__/ImageProcessing.cpython-310.pyc index 08735fde6bd45504c90013cab1f8dcb071789803..c99760e2bcecd0066e7f4f9d7b9ae4529e83bce2 100644 Binary files a/Code_objets/__pycache__/ImageProcessing.cpython-310.pyc and b/Code_objets/__pycache__/ImageProcessing.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/Main.cpython-310.pyc b/Code_objets/__pycache__/Main.cpython-310.pyc index 68af849b8fc70a0c48ed4b41d9d702408da65197..a0b1bc93be8307a1b2f8d23e2810a75c30885253 100644 Binary files a/Code_objets/__pycache__/Main.cpython-310.pyc and b/Code_objets/__pycache__/Main.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/Menu.cpython-310.pyc b/Code_objets/__pycache__/Menu.cpython-310.pyc index d58ad8dfad2736a4aa7de1d20331852235f347a7..ce9d7b57e75225fab452216fc37fa6b650f79b01 100644 Binary files a/Code_objets/__pycache__/Menu.cpython-310.pyc and b/Code_objets/__pycache__/Menu.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/Parameters.cpython-310.pyc b/Code_objets/__pycache__/Parameters.cpython-310.pyc index a1fef98059f7080b27dd78b68da050f302d94867..b0b5de2665bbbec468cb0efca8cf3ece29f80928 100644 Binary files a/Code_objets/__pycache__/Parameters.cpython-310.pyc and b/Code_objets/__pycache__/Parameters.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/Point.cpython-310.pyc b/Code_objets/__pycache__/Point.cpython-310.pyc index 9439b4b96538d8fb0358552264e1412cc94e2503..8bddbd546715215a73f05cd2f67bd9f319f53228 100644 Binary files a/Code_objets/__pycache__/Point.cpython-310.pyc and b/Code_objets/__pycache__/Point.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/Trajectory.cpython-310.pyc b/Code_objets/__pycache__/Trajectory.cpython-310.pyc index 074bc8f3824d01f6628aa6e2931e66119f1012d4..6e420dad93b877411490387262f423ac887e6b80 100644 Binary files a/Code_objets/__pycache__/Trajectory.cpython-310.pyc and b/Code_objets/__pycache__/Trajectory.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/UI.cpython-310.pyc b/Code_objets/__pycache__/UI.cpython-310.pyc index d24001918bbdac43b390957180891882d316a121..d26ef227592781f64a23482cc23af63b687e5f37 100644 Binary files a/Code_objets/__pycache__/UI.cpython-310.pyc and b/Code_objets/__pycache__/UI.cpython-310.pyc differ diff --git a/Code_objets/__pycache__/VideoManager.cpython-310.pyc b/Code_objets/__pycache__/VideoManager.cpython-310.pyc index 96cd74133fa8fe645feb42105a8e077505bfff2f..5d76ee88c89b7894e9d867b2fa10899bd4c1b2e7 100644 Binary files a/Code_objets/__pycache__/VideoManager.cpython-310.pyc and b/Code_objets/__pycache__/VideoManager.cpython-310.pyc differ diff --git a/Objet/__pycache__/Main.cpython-311.pyc b/Objet/__pycache__/Main.cpython-311.pyc index 6c36253f77e5d7c3c77b1afea31dfd4593f3c8ea..9650b6d6c710b4caf08a34c7840b5ab85e5d5f0e 100644 Binary files a/Objet/__pycache__/Main.cpython-311.pyc and b/Objet/__pycache__/Main.cpython-311.pyc differ diff --git a/Objet/__pycache__/display.cpython-311.pyc b/Objet/__pycache__/display.cpython-311.pyc index 696fe0c14ae595903f24b7cb38ee0af0fa6dd156..7e6753e1edd62c86d99ae01c911a78f5c095fb43 100644 Binary files a/Objet/__pycache__/display.cpython-311.pyc and b/Objet/__pycache__/display.cpython-311.pyc differ diff --git a/Objet/__pycache__/gestion_clavier.cpython-311.pyc b/Objet/__pycache__/gestion_clavier.cpython-311.pyc index 590ba738b72bff5a20dfc6be07e690c9bd60c3d6..279d5910c609a4f128b26975390f670ec592c273 100644 Binary files a/Objet/__pycache__/gestion_clavier.cpython-311.pyc and b/Objet/__pycache__/gestion_clavier.cpython-311.pyc differ diff --git a/Objet/__pycache__/main.cpython-310.pyc b/Objet/__pycache__/main.cpython-310.pyc index 5cc024724307d9d45be4574c2b3f472aaa136ee6..d0b4158647e682823c630cad49ac967424325081 100644 Binary files a/Objet/__pycache__/main.cpython-310.pyc and b/Objet/__pycache__/main.cpython-310.pyc differ diff --git a/Objet/__pycache__/menu.cpython-310.pyc b/Objet/__pycache__/menu.cpython-310.pyc index 995153ef28663e9975adb7abe4c3546fa8d2f720..83015087dea9d2d6546eccdd7ddb7b9648a3198e 100644 Binary files a/Objet/__pycache__/menu.cpython-310.pyc and b/Objet/__pycache__/menu.cpython-310.pyc differ diff --git a/Objet/__pycache__/menu.cpython-311.pyc b/Objet/__pycache__/menu.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dd123c2ab29bb7189def5dfb08111f7f71deb3c Binary files /dev/null and b/Objet/__pycache__/menu.cpython-311.pyc differ diff --git a/Objet/__pycache__/parameters.cpython-311.pyc b/Objet/__pycache__/parameters.cpython-311.pyc index 8f49743d82bc9d6ff302d10b690c7442891f5810..89ec17d9176eee6fa9295a78af3d991641e27c0b 100644 Binary files a/Objet/__pycache__/parameters.cpython-311.pyc and b/Objet/__pycache__/parameters.cpython-311.pyc differ diff --git a/Objet/__pycache__/trajectory.cpython-310.pyc b/Objet/__pycache__/trajectory.cpython-310.pyc index 35ca0cd65d6446c011005698b7cdd58aba4f8d3a..4f22c7283a097c3f0f0c0ab9fec80bb9bac23711 100644 Binary files a/Objet/__pycache__/trajectory.cpython-310.pyc and b/Objet/__pycache__/trajectory.cpython-310.pyc differ diff --git a/Objet/__pycache__/trajectory.cpython-311.pyc b/Objet/__pycache__/trajectory.cpython-311.pyc index dae8102cea7d3b9d680bb05a54abb5395c77fd60..8fc4ff91f7e611711af5beaacce3da6e0d51c389 100644 Binary files a/Objet/__pycache__/trajectory.cpython-311.pyc and b/Objet/__pycache__/trajectory.cpython-311.pyc differ diff --git a/Objet/__pycache__/ui.cpython-310.pyc b/Objet/__pycache__/ui.cpython-310.pyc index 403d169a1c35e1a378410a8362e2153cfbedd86a..64e48af625d2e8ce57e84cb50d9d8a511d05fcf1 100644 Binary files a/Objet/__pycache__/ui.cpython-310.pyc and b/Objet/__pycache__/ui.cpython-310.pyc differ diff --git a/Objet/__pycache__/ui.cpython-311.pyc b/Objet/__pycache__/ui.cpython-311.pyc index 917d891e9647dcbe9f5873614db6496327244255..d44d5867c48f7b92671def24eacf9b6e41e1e523 100644 Binary files a/Objet/__pycache__/ui.cpython-311.pyc and b/Objet/__pycache__/ui.cpython-311.pyc differ diff --git a/Objet/__pycache__/video_manager.cpython-311.pyc b/Objet/__pycache__/video_manager.cpython-311.pyc index d585046aec8b7ecf4085b94f5440c4c0a638c932..5515052c6d606809864a20f978a948770d110a55 100644 Binary files a/Objet/__pycache__/video_manager.cpython-311.pyc and b/Objet/__pycache__/video_manager.cpython-311.pyc differ diff --git a/Objet/display.py b/Objet/display.py index f733da11f820b58551cdceb8ee738cc39a8c445e..734479a713556417b263f6f96305940074c22cdb 100644 --- a/Objet/display.py +++ b/Objet/display.py @@ -32,18 +32,23 @@ class Display(): def unprocessed_frame_copy(self): return self.unprocessed_frame.copy() - def draw_all_points(self): + def draw_all_points(self, brightness = 1): + background = self.frame.copy() for point in self.param.interesting_points: if point.name != "curs" and point.name != "bar_point_left" and point.name != "bar_point_right": self.draw_point(point) + self.frame = cv2.addWeighted(background, 1 - brightness, self.frame, brightness, 0) + + def draw_point(self, point): cv2.circle(self.frame, point.pos_int(), 3, point.color, 3) - def draw_shape(self, param_list = ["net", "ant", "wind", "height", "bar"]): + def draw_shape(self, brightness = 1, param_list = ["net", "ant", "wind", "height", "bar"]): def get_point(name): return self.param.get_point(name) - + + background = self.frame.copy() for shape in param_list: if shape == "net": self.draw_line(get_point("ant_bl"), get_point("ant_br"), (255, 255, 0)) @@ -61,8 +66,7 @@ class Display(): self.draw_line(get_point("bar_point_left"), get_point("bar_point"), (0, 0, 0), 5) self.draw_line(get_point("bar_point_right"), get_point("bar_point"), (100, 100, 100), 5) - - + self.frame = cv2.addWeighted(background, 1 - brightness, self.frame, brightness, 0) '''cv2.line(display.frame, (0, int(info[5])), (s_w, int(info[5])), (255, 255, 255), 2) cv2.putText(display.frame, "Hauteur de mire : " + str(round(hau_mire, 1)),(0, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) @@ -88,7 +92,11 @@ class Display(): self.draw_line(point3, point4, color) self.draw_line(point4, point1, color) - + def display(self, brightness): + self.draw_shape(brightness) + self.draw_all_points(brightness) + self.draw_traj() + cv2.imshow('main', self.frame) if __name__ == "__main__": diff --git a/Objet/gestion_clavier.py b/Objet/gestion_clavier.py index c2d0df567f4a09d6bd350687ceb91d4aa0c6b828..5de197301b1184147a28c265814e97c9811662f0 100644 --- a/Objet/gestion_clavier.py +++ b/Objet/gestion_clavier.py @@ -1,6 +1,6 @@ import subprocess -def update(key, vid_mana, session, ui, prev_mode, mode): +def update(key, vid_mana, session, ui, param, prev_mode, mode): if key == ord('q'): return "over", "over" if key == ord('s'): @@ -23,7 +23,11 @@ def update(key, vid_mana, session, ui, prev_mode, mode): mode = prev_mode if key == 13: - ui.linked = not ui.linked + ui.change_setting_mode() + + if key == 27: + param.change_window_mode() + return prev_mode, mode diff --git a/Objet/main.py b/Objet/main.py index 8d3ca4b55d890a0912efd986317edd8e516e72f4..c740e869ff59a0d63db0166d078e291663f2d16a 100644 --- a/Objet/main.py +++ b/Objet/main.py @@ -1,3 +1,4 @@ +ready = False import time import cv2 import numpy as np @@ -34,11 +35,14 @@ class Main: self.mode = "video" self.prev_mode = "video" + def run(self): + global ready + ready = True while self.mode != "over": self.display.load_frame(self.vid_mana.frame) key = cv2.waitKey(1) & 0xFF - self.prev_mode, self.mode = gc.update(key, self.vid_mana, self.session, self.ui, self.prev_mode, self.mode) + self.prev_mode, self.mode = gc.update(key, self.vid_mana, self.session, self.ui, self.param, self.prev_mode, self.mode) self.ui.move_parameters() if self.mode == "video": @@ -47,29 +51,25 @@ class Main: break all_ball = self.im_proc.get_all_ball(self.vid_mana.frame) self.traj.update(all_ball) - if self.traj.is_over: self.session.load_traj(self.traj) self.traj = Trajectory(self.param) self.display.load_traj(self.traj) self.session.next_video() - - self.display.draw_shape() - self.display.draw_traj() - - if self.mode == "parameters": + elif self.mode == "parameters": darken_factor = 0.5 self.display.frame = (self.display.frame * darken_factor).astype(np.uint8) - if self.ui.is_mouse_moving(): - self.display.draw_all_points() - - cv2.imshow('main', self.display.frame) - self.session.load(self.display.frame) + + self.display.display(self.ui.brightness) + #self.session.load(self.display.frame) #cv2.imshow('main', im_proc.processed_frame_difference) cv2.destroyAllWindows() if __name__ == "__main__": - main = Main("vid4.mp4", "video") - main.run() \ No newline at end of file + main = Main("vid3.mp4", "video") + main.run() + +def is_ready(): + return ready \ No newline at end of file diff --git a/Objet/parameters.py b/Objet/parameters.py index 5d0c43bdcb61d8a77aa8c7b0e5eedfb13da2acdc..3d7fe79f5ea77557574d6c9a9c4f05f02715142e 100644 --- a/Objet/parameters.py +++ b/Objet/parameters.py @@ -13,14 +13,15 @@ class Parameters: screen = screeninfo.get_monitors()[0] self.width = screen.width self.height = screen.height + self.mode = "full" # Liste des points intéressants self.interesting_points = [ Point_param("ant_tl", self.width / 5, 2 * self.height / 5, (0, 0, 255)), Point_param("wind_l_tl", self.width * 3 / 10, 2 * self.height / 5, (0, 255, 0)), Point_param("wind_l_br", self.width * 4 / 10, self.height * 12 / 25, (0, 255, 0)), - Point_param("wind_r_tl", self.width * 7 / 10, 2 * self.height / 5, (0, 255, 0)), - Point_param("wind_r_br", self.width * 6 / 10, self.height * 12 / 25, (0, 255, 0)), + Point_param("wind_r_tl", self.width * 6 / 10, 2 * self.height / 5, (0, 255, 0)), + Point_param("wind_r_br", self.width * 7 / 10, self.height * 12 / 25, (0, 255, 0)), Point_param("set_height", self.width/2, self.height / 4,(255, 255, 255)), Point_param("set_margin_over", self.width/2, self.height * 3 / 16, (200, 200, 200)), Point_param("set_margin_under", self.width/2, self.height * 5 / 16, (200, 200, 200)) @@ -39,6 +40,13 @@ class Parameters: self.ant_height = self.get_point("net").y - self.get_point("ant_tl").y + def change_window_mode(self): + if self.mode == "full": + cv2.setWindowProperty('main', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_NORMAL) + self.mode = "normal" + else: + cv2.setWindowProperty('main', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) + self.mode = "full" def get_point(self, name): for point in self.interesting_points: diff --git a/Objet/ui.py b/Objet/ui.py index 9b67f420d80bca2147b23193592a39804308a2b4..f79a3ae531720c067f1bac5c2643335c7a0c7c14 100644 --- a/Objet/ui.py +++ b/Objet/ui.py @@ -30,10 +30,15 @@ class UI: self.param.interesting_points.append(self.bar_point) self.touch_bar = False self.last_mouse_move = time.time() + self.flag_mouse_moving = False + self.flag_mouse_freeze = False + self.phase = 'imm' + self.brightness = 0 + self.time_phase = 0 self.point_pp = copy.copy(self.point_defaut) - self.linked = False + self.setting_locked = False def update_bar(self): @@ -42,7 +47,10 @@ class UI: def move_parameters(self): cv2.setMouseCallback('main', self.mouse_event) + self.update_phase() self.update_bar() + if self.setting_locked: + self.update_linked() if self.dragging and self.point_near: self.actu_para() else : @@ -52,9 +60,54 @@ class UI: self.point_sel.y = self.point_pp.y def is_mouse_moving(self): - return time.time() - self.last_mouse_move < 0.5 or self.point_near - + return time.time() - self.last_mouse_move < 0.6 or self.point_near + + def update_phase(self): + if self.phase == 'imm': + if time.time() - self.last_mouse_move <= 0.1: + self.phase = 'up' + self.time_phase = time.time() + self.brightness = 0 + elif self.phase == 'up': + if time.time() - self.time_phase <= 0.2: + self.brightness = (time.time() - self.time_phase)*5 + else: + self.phase = 'mov' + self.brightness = 1 + self.time_phase = time.time() + elif self.phase == 'mov': + if self.point_near: + self.last_mouse_move = time.time() + if time.time() - self.last_mouse_move >= 1: + self.phase = 'down' + self.time_phase = time.time() + self.brightness = 1 + elif self.phase == 'down': + if time.time() - self.last_mouse_move <= 0.1: + self.phase = 'mov' + self.time_phase = time.time() + self.brightness = 1 - (time.time() - self.time_phase)*5 + if time.time() - self.time_phase >= 0.2: + self.phase = 'imm' + self.brightness = 0 + + def get_brightness(self): + if not self.flag_mouse_moving: + self.mouse_begin_move = self.last_mouse_move + self.flag_mouse_moving = True + if 0 <= time.time() - self.mouse_begin_move <= 0.2: + return (time.time() - self.mouse_begin_move)*5 + elif time.time() - self.last_mouse_move <= 0.4: + return 1 + elif 0.6 >= time.time() - self.last_mouse_move >= 0.4 and not self.point_near: + return (0.6 - (time.time() - self.last_mouse_move))*5 + self.flag_mouse_moving = False + if self.point_near: + self.flag_mouse_moving = False + return 1 + + def set_bar(self, x): self.vid_mana.current_frame = int((x - self.bar_left) * self.vid_mana.total_frames / (self.bar_right - self.bar_left)) self.vid_mana.start_time = time.time() - self.vid_mana.current_frame / self.vid_mana.fps @@ -88,24 +141,24 @@ class UI: self.point_pp = copy.copy(self.point_defaut) def change_setting_mode(self): - if not self.linked: + if not self.setting_locked: self.update_user_info() - self.linked = not self.linked + self.setting_locked = not self.setting_locked def update_user_info(self): def get_point(name): return self.param.get_point(name) - self.set_heigth = (get_point("net").y - get_point("set_height").y) / (get_point("ant_bl").y - get_point("ant_tl").y) - self.set_margin_over = (get_point("set_height").y - get_point("set_margin_over").y) / (get_point("ant_bl").y - get_point("ant_tl").y) - self.set_margin_under = (get_point("set_margin_under").y - get_point("set_height").y) / (get_point("ant_bl").y - get_point("ant_tl").y) + self.set_height = (get_point("net").y - get_point("set_height").y) / (get_point("net").y - get_point("ant_tl").y) + self.set_margin_over = (get_point("net").y - get_point("set_margin_over").y) / (get_point("net").y - get_point("ant_tl").y) + self.set_margin_under = (get_point("net").y - get_point("set_margin_under").y) / (get_point("net").y - get_point("ant_tl").y) self.wind_l_l = (get_point("wind_l_tl").x - get_point("ant_tl").x) / (get_point("ant_tr").x - get_point("ant_tl").x) self.wind_l_r = (get_point("wind_l_tr").x - get_point("ant_tl").x) / (get_point("ant_tr").x - get_point("ant_tl").x) - self.wind_l_t = (get_point("net").y - get_point("wind_l_tl").y) / (get_point("ant_bl").y - get_point("ant_tl").y) - self.wind_l_b = (get_point("net").y - get_point("wind_l_bl").y) / (get_point("ant_bl").y - get_point("ant_tl").y) + self.wind_l_t = (get_point("net").y - get_point("wind_l_tl").y) / (get_point("net").y - get_point("ant_tl").y) + self.wind_l_b = (get_point("net").y - get_point("wind_l_bl").y) / (get_point("net").y - get_point("ant_tl").y) self.wind_r_l = (get_point("ant_tr").x - get_point("wind_r_tl").x) / (get_point("ant_tr").x - get_point("ant_tl").x) self.wind_r_r = (get_point("ant_tr").x - get_point("wind_r_tr").x) / (get_point("ant_tr").x - get_point("ant_tl").x) - self.wind_r_t = (get_point("net").y - get_point("wind_r_tr").y) / (get_point("ant_br").y - get_point("ant_tr").y) - self.wind_r_b = (get_point("net").y - get_point("wind_r_br").y) / (get_point("ant_br").y - get_point("ant_tr").y) + self.wind_r_t = (get_point("net").y - get_point("wind_r_tr").y) / (get_point("net").y - get_point("ant_tr").y) + self.wind_r_b = (get_point("net").y - get_point("wind_r_br").y) / (get_point("net").y - get_point("ant_tr").y) def actu_para(self): def get_point(name): @@ -169,9 +222,10 @@ class UI: if is_under("curs", name): put_over("curs", name) + point = self.point_pp name = point.name - if not self.linked: + if not self.setting_locked: if name == "net": update_ref("ant_tl") update_ref("ant_bl") @@ -183,13 +237,13 @@ class UI: valid_to_right("ant_br") update_ref_x("ant_tl") update_x() - update_center_x("net", "ant_bl", "ant_br") + update_center("net", "ant_bl", "ant_br") if name == "ant_br": valid_to_left("ant_bl") update_ref_x("ant_tr") update_x() - update_center_x("net", "ant_bl", "ant_br") + update_center("net", "ant_bl", "ant_br") if name == "ant_tl": valid_to_down("ant_bl") @@ -302,11 +356,64 @@ class UI: if name == "ant_tl": valid_to_down("ant_bl") valid_to_right("ant_tr") - update_ref_x_list(["ant_bl"]) - update_ref_x("ant_br") - update_ref_y_list("ant_tr") update() - update_center_x(["net", "ant_bl", "ant_br"]) + get_point("ant_bl").x = get_point("ant_tl").x + get_point("ant_tr").y = get_point("ant_tl").y + if name == "ant_tr": + valid_to_down("ant_br") + valid_to_left("ant_tl") + update() + get_point("ant_br").x = get_point("ant_tr").x + get_point("ant_tl").y = get_point("ant_tr").y + if name == "ant_bl": + valid_to_up("ant_tl") + valid_to_right("ant_br") + update() + get_point("ant_tl").x = get_point("ant_bl").x + get_point("ant_br").y = get_point("ant_bl").y + if name == "ant_br": + valid_to_up("ant_tr") + valid_to_left("ant_bl") + update() + get_point("ant_tr").x = get_point("ant_br").x + get_point("ant_bl").y = get_point("ant_br").y + + def update_linked(self): + def get_point(name): + return self.param.get_point(name) + def update_center(name1, name2, name3): + get_point(name1).x = self.param.get_center_x(name2, name3) + get_point(name1).y = self.param.get_center_y(name2, name3) + + net = get_point("net") + ant_height = net.y - get_point("ant_tl").y + ant_witdh = get_point("ant_tr").x - get_point("ant_tl").x + + get_point("set_height").y = net.y - self.set_height * ant_height + get_point("set_margin_over").y = net.y - self.set_margin_over * ant_height + get_point("set_margin_under").y = net.y - self.set_margin_under * ant_height + get_point("wind_l_tl").y = net.y - self.wind_l_t * ant_height + get_point("wind_l_bl").y = net.y - self.wind_l_b * ant_height + get_point("wind_l_tr").y = net.y - self.wind_l_t * ant_height + get_point("wind_l_br").y = net.y - self.wind_l_b * ant_height + + get_point("wind_r_tl").y = net.y - self.wind_r_t * ant_height + get_point("wind_r_bl").y = net.y - self.wind_r_b * ant_height + get_point("wind_r_tr").y = net.y - self.wind_r_t * ant_height + get_point("wind_r_br").y = net.y - self.wind_r_b * ant_height + + get_point("wind_l_tl").x = get_point("ant_tl").x + self.wind_l_l * ant_witdh + get_point("wind_l_bl").x = get_point("ant_tl").x + self.wind_l_l * ant_witdh + get_point("wind_l_tr").x = get_point("ant_tl").x + self.wind_l_r * ant_witdh + get_point("wind_l_br").x = get_point("ant_tl").x + self.wind_l_r * ant_witdh + get_point("wind_r_tl").x = get_point("ant_tr").x - self.wind_r_l * ant_witdh + get_point("wind_r_bl").x = get_point("ant_tr").x - self.wind_r_l * ant_witdh + get_point("wind_r_tr").x = get_point("ant_tr").x - self.wind_r_r * ant_witdh + get_point("wind_r_br").x = get_point("ant_tr").x - self.wind_r_r * ant_witdh + + update_center("wind_l_m", "wind_l_tl", "wind_l_br") + update_center("wind_r_m", "wind_r_tl", "wind_r_br") + update_center("net", "ant_bl", "ant_br") if __name__ == "__main__": diff --git a/Objet/video_manager.py b/Objet/video_manager.py index 5941a34ad034ee5e6faa1b2d1b5e0431968e467f..91aec94570df2d213b8ad77c800b97828187d379 100644 --- a/Objet/video_manager.py +++ b/Objet/video_manager.py @@ -19,10 +19,19 @@ class VideoManager: self.video_type = video_type if self.video_type == "video": self.cap = cv2.VideoCapture(self.video_file) - elif self.video_type == "camera": - self.cam_index = self.select_camera() - self.cam_index = 0 - self.cap = cv2.VideoCapture(self.cam_index) + elif self.video_type == "direct": + max_cameras=10 + backend=cv2.CAP_DSHOW + available_cameras = [] + for i in range(max_cameras): + cap = cv2.VideoCapture(i, backend) + if cap.isOpened(): + ret, frame = cap.read() + if ret: + available_cameras.append(i) + cap.release() + print(available_cameras) + self.cap = cv2.VideoCapture(0) self.fps = int(self.cap.get(cv2.CAP_PROP_FPS)) self.total_frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT)) self.over = False @@ -68,20 +77,24 @@ class VideoManager: def update_frame(self): - frame_time = time.time() - self.current_time - self.current_time = time.time() - self.time = self.current_time - self.start_time - self.current_frame = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES)) - frame_targeted = int(self.time * self.fps) - jump_frame = frame_targeted - self.current_frame - - for _ in range(jump_frame): - ret, self.frame = self.cap.read() - if not ret: - self.over = True - break - self.frame = cv2.resize(self.frame, (self.parameters.width, self.parameters.height)) - self.current_frame += 1 + if self.video_type == "video": + self.current_time = time.time() + self.time = self.current_time - self.start_time + self.current_frame = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES)) + frame_targeted = int(self.time * self.fps) + jump_frame = frame_targeted - self.current_frame + + for _ in range(jump_frame): + ret, self.frame = self.cap.read() + if not ret: + self.over = True + break + self.frame = cv2.resize(self.frame, (self.parameters.width, self.parameters.height)) + self.current_frame += 1 + + elif self.video_type == "direct": + self.update_frame_easy() + self.current_frame += 1 def update_frame_easy(self): _, self.frame = self.cap.read() diff --git "a/__pycache__/chercher_cam\303\251ra.cpython-311.pyc" "b/__pycache__/chercher_cam\303\251ra.cpython-311.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..8ffd2f7914e490cd758c2c24ba0cdcea184b31bd Binary files /dev/null and "b/__pycache__/chercher_cam\303\251ra.cpython-311.pyc" differ diff --git a/__pycache__/test_chargement.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_chargement.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bed2af3036449cfaded3317402fe03f409368ef1 Binary files /dev/null and b/__pycache__/test_chargement.cpython-310-pytest-8.3.5.pyc differ diff --git a/__pycache__/test_chargementlogo.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_chargementlogo.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d86cdf7ed8ae115c53013759543d938d3abcd92e Binary files /dev/null and b/__pycache__/test_chargementlogo.cpython-310-pytest-8.3.5.pyc differ diff --git a/__pycache__/test_chercherdossier.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_chercherdossier.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25417afddbde93e39f88d3e1f99cdcb58df095c4 Binary files /dev/null and b/__pycache__/test_chercherdossier.cpython-310-pytest-8.3.5.pyc differ diff --git a/__pycache__/test_multithrading_logo.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_multithrading_logo.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c0355b28dae0907d99d34d4ef2e093187125f88 Binary files /dev/null and b/__pycache__/test_multithrading_logo.cpython-310-pytest-8.3.5.pyc differ diff --git a/__pycache__/test_nouveautestthreding.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_nouveautestthreding.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7db4f230e6cee64220aa083eded1e5add967254 Binary files /dev/null and b/__pycache__/test_nouveautestthreding.cpython-310-pytest-8.3.5.pyc differ diff --git a/__pycache__/test_recup_info.cpython-310-pytest-8.3.5.pyc b/__pycache__/test_recup_info.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4fa344dffe4931e1f8c95f4a81c7dc0ed4dd8bb Binary files /dev/null and b/__pycache__/test_recup_info.cpython-310-pytest-8.3.5.pyc differ diff --git a/chargement.py b/chargement.py new file mode 100644 index 0000000000000000000000000000000000000000..36a2f01e5c3f76a1fe0116ee5f5ac5cc9966c04a --- /dev/null +++ b/chargement.py @@ -0,0 +1,51 @@ +import inspect +import time + +def count_function_lines(func): + """Counts the number of lines in a function.""" + source_lines = inspect.getsourcelines(func)[0] + return len(source_lines) + +def progress_percentage(func, lines_done): + """Calculates the percentage of lines completed in a function.""" + total_lines = count_function_lines(func) + if total_lines == 0: + return 0 + return (lines_done / total_lines) * 100 +def current_line(): + """Returns the current line number being executed in a function.""" + return inspect.currentframe().f_back.f_lineno +def fonction_longue(): +# Simulate a long function + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + time.sleep(2) + +if __name__ == '__main__': + while progress_percentage(fonction_longue, current_line) < 100: + print(f"Line {current_line}: {progress_percentage(fonction_longue, current_line):.2f}%") + time.sleep(0.5) + + diff --git "a/chercher_cam\303\251ra.py" "b/chercher_cam\303\251ra.py" new file mode 100644 index 0000000000000000000000000000000000000000..0dbb4d793b333212f10a9662f3f281a07cbe3718 --- /dev/null +++ "b/chercher_cam\303\251ra.py" @@ -0,0 +1,98 @@ +import cv2 +import tkinter as tk +from tkinter import ttk +from PIL import Image, ImageTk +import threading + +class CameraSelector: + def __init__(self, root): + self.root = root + self.root.title("Sélection de caméra") + self.cameras = [] + self.current_camera = None + self.video_source = None + + # Détection des caméras disponibles + self.detect_cameras() + + # Interface graphique + self.create_widgets() + + def detect_cameras(self): + """Détecte toutes les caméras disponibles jusqu'à l'index 10""" + self.cameras = [] + for i in range(10): # Vous pouvez augmenter ce nombre si nécessaire + cap = cv2.VideoCapture(i) + if cap.isOpened(): + self.cameras.append(i) + cap.release() + + def create_widgets(self): + """Crée l'interface utilisateur""" + # Cadre principal + main_frame = ttk.Frame(self.root, padding=10) + main_frame.pack() + + # Sélection de caméra + ttk.Label(main_frame, text="Caméras détectées:").pack() + self.camera_var = tk.StringVar() + self.cam_selector = ttk.Combobox(main_frame, textvariable=self.camera_var) + self.cam_selector['values'] = [f"Caméra {i}" for i in self.cameras] + self.cam_selector.pack(pady=5) + + # Bouton de confirmation + ttk.Button(main_frame, text="Ouvrir", command=self.start_camera).pack(pady=5) + + # Zone d'affichage vidéo + self.video_label = ttk.Label(main_frame) + self.video_label.pack() + + def start_camera(self): + """Démarre le flux vidéo de la caméra sélectionnée""" + if self.current_camera is not None: + self.stop_camera() + + selected = self.cam_selector.current() + if selected == -1: + return + + self.video_source = self.cameras[selected] + self.current_camera = cv2.VideoCapture(self.video_source) + + # Démarrer l'affichage vidéo dans un thread séparé + self.thread = threading.Thread(target=self.show_video) + self.thread.daemon = True + self.thread.start() + + def show_video(self): + """Affiche le flux vidéo dans le label""" + while self.current_camera.isOpened(): + ret, frame = self.current_camera.read() + if ret: + # Conversion de l'image pour Tkinter + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + img = Image.fromarray(frame) + imgtk = ImageTk.PhotoImage(image=img) + + # Mise à jour de l'interface + self.video_label.configure(image=imgtk) + self.video_label.image = imgtk + else: + break + + def stop_camera(self): + """Arrête le flux vidéo""" + if self.current_camera is not None: + self.current_camera.release() + self.video_label.configure(image='') + self.video_label.image = None + + def on_close(self): + self.stop_camera() + self.root.destroy() + +if __name__ == "__main__": + root = tk.Tk() + app = CameraSelector(root) + root.protocol("WM_DELETE_WINDOW", app.on_close) + root.mainloop() \ No newline at end of file diff --git a/gopro.py b/gopro.py new file mode 100644 index 0000000000000000000000000000000000000000..eb8ad913f02f7c90c5fea6757e7c3452ce143e67 --- /dev/null +++ b/gopro.py @@ -0,0 +1,61 @@ +import cv2 +import numpy as np +import goprocam +from goprocam import GoProCamera, constants +#modif +def list_cameras(): + """ Liste les caméras disponibles et retourne leurs indices. """ + index = 0 + available_cameras = [] + while True: + cap = cv2.VideoCapture(index) + if not cap.read()[0]: + break + else: + available_cameras.append(index) + cap.release() + index += 1 + return available_cameras + +def select_camera(): + cameras = list_cameras() + if not cameras: + print("Aucune caméra détectée.") + return None + print("Caméras disponibles :", cameras) + selected = int(input("Sélectionnez l'indice de votre GoPro : ")) + return selected if selected in cameras else None + +def record_video(camera_index): + cap = cv2.VideoCapture(camera_index) + if not cap.isOpened(): + print("Impossible d'accéder à la caméra.") + return + + fourcc = cv2.VideoWriter_fourcc(*'XVID') + out = cv2.VideoWriter('gopro_output.avi', fourcc, 30.0, (640, 480)) + + while True: + ret, frame = cap.read() + if not ret: + break + cv2.imshow('GoPro Video', frame) + out.write(frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + cap.release() + out.release() + cv2.destroyAllWindows() + +if __name__ == "__main__": + print("Connexion à la GoPro...") + gopro = GoProCamera.GoPro() + gopro.webcamFOV("medium") + gopro.startWebcam() + cam_index = select_camera() + if cam_index is not None: + record_video(cam_index) + else: + print("Sélection invalide.") \ No newline at end of file diff --git a/gopro_output.avi b/gopro_output.avi new file mode 100644 index 0000000000000000000000000000000000000000..e4232cb70f1a5a007ac0f85097045558eed32a3e Binary files /dev/null and b/gopro_output.avi differ diff --git a/multithreading.py b/multithreading.py new file mode 100644 index 0000000000000000000000000000000000000000..5d2d61e3ca7f74ba0ac19c355be5cb3fbcdc78db --- /dev/null +++ b/multithreading.py @@ -0,0 +1,39 @@ +import time +import threading + +# Fonction qui effectue une partie du travail +def tache_lourde(part_debut, part_fin, resultat, index): + somme = 0 + for i in range(part_debut, part_fin): + somme += 1 + resultat[index] = somme # Stocker le résultat pour éviter la concurrence + +# Paramètres +N = 10**7 # Taille du travail total +THREADS = 4 # Nombre de threads à utiliser + +# Exécution sans multithreading +start = time.time() +somme_total = sum(range(N)) # Exécution en une seule fois +end = time.time() +print(f"Temps sans multithreading: {end - start:.2f} secondes") + +# Exécution avec multithreading +start = time.time() +threads = [] +resultats = [0] * THREADS # Stocker les résultats des threads +portion = N // THREADS # Taille de la charge par thread + +for i in range(THREADS): + debut = i * portion + fin = N if i == THREADS - 1 else (i + 1) * portion + thread = threading.Thread(target=tache_lourde, args=(debut, fin, resultats, i)) + threads.append(thread) + thread.start() + +for thread in threads: + thread.join() # Attendre la fin de tous les threads + +somme_total_thread = sum(resultats) # Fusionner les résultats +end = time.time() +print(f"Temps avec multithreading: {end - start:.2f} secondes") diff --git a/output_image.png b/output_image.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbdc6e565ee67601207b8f27bc8203717c1c713 Binary files /dev/null and b/output_image.png differ diff --git a/success_probability_vs_E.png b/success_probability_vs_E.png new file mode 100644 index 0000000000000000000000000000000000000000..79bd413b21f4d89c0ceaab57923b5ac49b0d7101 Binary files /dev/null and b/success_probability_vs_E.png differ diff --git a/test_chargement.py b/test_chargement.py index a7ed873ba88da90e8dc3376948511c0402c98810..3283d09869ec1fb332801927d1c906aa4f18eb7f 100644 --- a/test_chargement.py +++ b/test_chargement.py @@ -1,9 +1,11 @@ import time +import threading +import os +import sys from tkinter import Tk, Label from PIL import Image, ImageTk # Installer Pillow si nécessaire : pip install pillow -# Lancer ton programme principal ici - +# --- Création du Splash Screen --- splash = Tk() splash.overrideredirect(True) # Enlever la barre de titre @@ -22,30 +24,30 @@ splash.geometry(f"{img_width}x{img_height}+{x_pos}+{y_pos}") # Afficher l'image label = Label(splash, image=photo) label.pack() +splash.update() # Mise à jour de l'affichage -# Garder le splash pendant le chargement -splash.update() - -# Pour éviter que le programme ne se ferme instantanément - - - -import os -import sys +# --- Fonction pour charger le menu principal --- +def charger_menu(): + global splash + base_dir = os.path.dirname(os.path.abspath(__file__)) + dossier_path = os.path.join(base_dir, 'Objet') + sys.path.append(dossier_path) + import menu # Importer ici pour éviter les blocages + temps = time.time() + + a = menu.App() # Chargement du menu + splash.destroy() # Fermer le splash après le chargement -# Fermer le splash et ouvrir le menu principal -base_dir = os.path.dirname(os.path.abspath(__file__)) + tmp = time.time() + print(f"Temps d'exécution : {-(temps - tmp):.6f} secondes") -dossier_path = os.path.join(base_dir,'Objet') -sys.path.append(dossier_path) + a.mainloop() # Lancer l'application principale + -import menu -temps = time.time() -a = menu.App() -splash.destroy() -tmp = time.time() -a.mainloop() +# --- Lancer le chargement en arrière-plan --- +thread = threading.Thread(target=charger_menu) +thread.start() -tot = temps - tmp -print(f"Temps d'exécution : {-tot:.6f} secondes") \ No newline at end of file +# --- Affichage du splash screen pendant le chargement --- +splash.mainloop() diff --git a/test_chargementlogo.py b/test_chargementlogo.py new file mode 100644 index 0000000000000000000000000000000000000000..bc9a592a3b3956eb5d85184d356286f3cf7ca3b3 --- /dev/null +++ b/test_chargementlogo.py @@ -0,0 +1,54 @@ +import time +from PIL import Image, ImageEnhance, ImageTk +import tkinter as tk + +def adjust_transparency(image_path, charge_percentage): + # Open the image + image = Image.open(image_path).convert("RGBA") + # Split the image into channels + r, g, b, alpha = image.split() + # Adjust the alpha channel based on charge percentage + alpha = alpha.point(lambda p: p * (charge_percentage / 100)) + # Merge channels back + return Image.merge("RGBA", (r, g, b, alpha)) + +def fake_charging(image_path): + # Create a Tkinter window + root = tk.Tk() + root.title("Charging...") + + # Load the initial image + charge_percentage = 0 + image = adjust_transparency(image_path, charge_percentage) + tk_image = ImageTk.PhotoImage(image) + + # Create a label to display the image + label = tk.Label(root, image=tk_image) + label.pack() + + def update_image(): + nonlocal charge_percentage, tk_image + if charge_percentage < 100: + # Increment charge percentage smoothly + charge_percentage += 1 + # Adjust transparency and update the image + image = adjust_transparency(image_path, charge_percentage) + tk_image = ImageTk.PhotoImage(image) + label.config(image=tk_image) + label.image = tk_image + root.title(f"Charging... {charge_percentage}%") + root.after(50, update_image) # Update every 50ms for smoother transition + else: + root.title("Charging complete!") + + # Start updating the image + update_image() + root.mainloop() + +def main(): + # Use the specified image + image_path = "LogoSymbole_canard.png" + fake_charging(image_path) + +if __name__ == "__main__": + main() diff --git a/test_cherchercamera.py b/test_cherchercamera.py new file mode 100644 index 0000000000000000000000000000000000000000..6ae040fe2299985c25b17371d3d3d938bb1950b5 --- /dev/null +++ b/test_cherchercamera.py @@ -0,0 +1,32 @@ +import chercher_caméra as cc +import cv2 +import tkinter as tk + +def select_camera_lanceemnt(): + camera_index = cc.select_camera() + if camera_index is not None: + cap = cv2.VideoCapture(camera_index) + if not cap.isOpened(): + print("Erreur : Impossible d'ouvrir la caméra.") + return + + while True: + ret, frame = cap.read() + if not ret: + print("Erreur : Impossible de lire le flux vidéo.") + break + + cv2.imshow("Flux vidéo", frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): # Appuyez sur 'q' pour quitter + break + + cap.release() + cv2.destroyAllWindows() + if camera_index is not None: + print(f"Caméra sélectionnée : {camera_index}") + else: + print("Aucune caméra sélectionnée.") + +if __name__ == "__main__": + select_camera_lanceemnt() \ No newline at end of file diff --git a/test_chercherdossier.py b/test_chercherdossier.py index b38b9876adbd58be61ca6ca1d6d20b0e8377cddb..4b59e22711c326131b318c0f21a1f25c1bf584a0 100644 --- a/test_chercherdossier.py +++ b/test_chercherdossier.py @@ -1,11 +1,39 @@ import os import sys +import time +import threading +import os +import sys +from tkinter import Tk, Label +from PIL import Image, ImageTk # Installer Pillow si nécessaire : pip install pillow + +# --- Création du Splash Screen --- +splash = Tk() +splash.overrideredirect(True) # Enlever la barre de titre + +# Charger l'image +image = Image.open("LogoSymbole_canard.png") +photo = ImageTk.PhotoImage(image) + +# Définir la taille et centrer +screen_width = splash.winfo_screenwidth() +screen_height = splash.winfo_screenheight() +img_width, img_height = image.size +x_pos = (screen_width - img_width) // 2 +y_pos = (screen_height - img_height) // 2 +splash.geometry(f"{img_width}x{img_height}+{x_pos}+{y_pos}") + +# Afficher l'image +label = Label(splash, image=photo) +label.pack() +splash.update() # Mise à jour de l'affichage base_dir = os.path.dirname(os.path.abspath(__file__)) -dossier_path = os.path.join(base_dir,'Code_objets') +dossier_path = os.path.join(base_dir,'Objet') sys.path.append(dossier_path) -import Menu -a = Menu.App() +import menu +a = menu.App() +splash.destroy() a.mainloop() diff --git a/test_multithrading_logo.py b/test_multithrading_logo.py index f027b1417b66c1fb30e73dc3d471326e3914c591..6d58413ba07346e1310d55f1fb762aaff96aa435 100644 --- a/test_multithrading_logo.py +++ b/test_multithrading_logo.py @@ -3,20 +3,17 @@ from PIL import Image, ImageTk import threading import time - - -# Fonction pour afficher le splash screen def show_splash(): - global splash # Garder une référence à la fenêtre + global splash, photo splash = tk.Tk() - splash.overrideredirect(True) # Enlever la barre de titre + splash.overrideredirect(True) # Charger l'image - image = Image.open("LogoSymbole_canard.png") # Remplace par ton logo + image = Image.open("LogoSymbole_canard.png") photo = ImageTk.PhotoImage(image) - # Définir la taille et centrer + # Centrer la fenêtre screen_width = splash.winfo_screenwidth() screen_height = splash.winfo_screenheight() img_width, img_height = image.size @@ -24,40 +21,41 @@ def show_splash(): y_pos = (screen_height - img_height) // 2 splash.geometry(f"{img_width}x{img_height}+{x_pos}+{y_pos}") - # Afficher l'image label = tk.Label(splash, image=photo) + label.image = photo # Évite la suppression de l'image par le garbage collector label.pack() - splash.update() - splash.mainloop() # Garde la fenêtre active jusqu'à ce qu'on la ferme + # Lancer le thread du programme principal + global main_thread + main_thread = threading.Thread(target=load_main_program, daemon=True) + main_thread.start() -# Fonction pour charger le programme principal -def load_main_program(): - time.sleep(3) # Simule un chargement + # Vérifier périodiquement si le programme principal est chargé + splash.after(100, check_thread) - # Fermer l'écran de chargement - splash.destroy() + splash.mainloop() +def load_main_program(): + """Charge le programme principal (menu.App), sans interaction directe avec Tkinter.""" import os - import sys + import sys + base_dir = os.path.dirname(os.path.abspath(__file__)) - - dossier_path = os.path.join(base_dir,'Code_objets') + dossier_path = os.path.join(base_dir, 'Objet') sys.path.append(dossier_path) + import menu - import Menu - - - - # Lancer le programme principal ici - a = Menu.App() - a.mainloop() + global app + app = menu.App() # Instanciation de l'application -# Démarrer le splash screen dans un thread -splash_thread = threading.Thread(target=show_splash) -splash_thread.start() +def check_thread(): + """Vérifie si le thread principal a fini de charger le programme.""" + if not main_thread.is_alive(): + splash.destroy() # Fermer le splash + app.mainloop() # Lancer l'application principale dans le thread principal + else: + splash.after(100, check_thread) # Vérifier à nouveau après 100 ms -# Charger le programme principal dans un autre thread -main_thread = threading.Thread(target=load_main_program) -main_thread.start() +# Démarrer le splash screen dans le thread principal +show_splash() diff --git a/test_nouveautestthreding.py b/test_nouveautestthreding.py new file mode 100644 index 0000000000000000000000000000000000000000..dc2cc407c0e22b60121b8405bcafb907d53131e7 --- /dev/null +++ b/test_nouveautestthreding.py @@ -0,0 +1,53 @@ +import threading +import time + +# Function to perform a computational task +def compute_task(start, end): + total = 0 + for i in range(start, end): + total += i ** 2 + return total + +# Wrapper function for threading +def thread_wrapper(start, end, results, index): + results[index] = compute_task(start, end) + +# Single-threaded execution +def single_threaded(): + start_time = time.time() + compute_task(0, 100_000_000) + end_time = time.time() + return end_time - start_time + +# Multi-threaded execution +def multi_threaded(): + start_time = time.time() +<<<<<<< HEAD + num_threads = 2 + step = 10_000_000 // num_threads +======= + num_threads = 8 + step = 100_000_000 // num_threads +>>>>>>> 73f7a464704d2fa11671ba78a16771abe843918a + threads = [] + results = [0] * num_threads + + for i in range(num_threads): + t = threading.Thread(target=thread_wrapper, args=(i * step, (i + 1) * step, results, i)) + threads.append(t) + t.start() + + for t in threads: + t.join() + + end_time = time.time() + return end_time - start_time + +# Main function to compare performance +if __name__ == "__main__": + single_thread_time = single_threaded() + multi_thread_time = multi_threaded() + + print(f"Single-threaded execution time: {single_thread_time:.4f} seconds") + print(f"Multi-threaded execution time: {multi_thread_time:.4f} seconds") + print("Multi-threading is faster!" if multi_thread_time < single_thread_time else "Single-threading is faster!") \ No newline at end of file diff --git a/test_recup_info.py b/test_recup_info.py new file mode 100644 index 0000000000000000000000000000000000000000..339bbe015c3bd6a11e56da19eff6c821c1b8bb0e --- /dev/null +++ b/test_recup_info.py @@ -0,0 +1,3 @@ +import multiprocessing +print(f"Cœurs physiques : {multiprocessing.cpu_count() // 2}") +print(f"Cœurs logiques : {multiprocessing.cpu_count()}") diff --git a/vid3.mp4 b/vid3.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fdc50934648d989c26de3a8c4ac298b49ac8c3c4 Binary files /dev/null and b/vid3.mp4 differ diff --git a/volley_mire_detection/scripts/__pycache__/test_model.cpython-310-pytest-8.3.5.pyc b/volley_mire_detection/scripts/__pycache__/test_model.cpython-310-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc5e0a6d21db85a3c4a6ef9154bc067e9bda0a95 Binary files /dev/null and b/volley_mire_detection/scripts/__pycache__/test_model.cpython-310-pytest-8.3.5.pyc differ