From 28e2204ce10b0705383cc20a2552806241eb509e Mon Sep 17 00:00:00 2001 From: BOTAlex Date: Fri, 7 Mar 2025 22:01:25 +0100 Subject: [PATCH] More stable version ig --- EyeTrackApp/Camera/UDP_Camera/UDP_Camera.py | 39 ++++++++++----------- EyeTrackApp/Camera/camera.py | 27 ++++++++------ 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/EyeTrackApp/Camera/UDP_Camera/UDP_Camera.py b/EyeTrackApp/Camera/UDP_Camera/UDP_Camera.py index 139c10b..392034c 100644 --- a/EyeTrackApp/Camera/UDP_Camera/UDP_Camera.py +++ b/EyeTrackApp/Camera/UDP_Camera/UDP_Camera.py @@ -19,7 +19,7 @@ from .DataPacket import PacketHeader # Python imports stupid. missed a single ". WAIT_TIME = 0.1 IMAGE_BUFFER_SIZE = 1024 -NUM_FRAGMENTS = 12 +NUM_MAX_FRAGMENTS = 12 HEADER_FORMAT = "iiii" RED = "\033[91m" @@ -50,10 +50,10 @@ class UDP_Camera(ICameraSource): self.host = "0.0.0.0" self.port = 3333 self.num_loaded = 0 - self.packets = [None] * NUM_FRAGMENTS + self.packets = [None] * NUM_MAX_FRAGMENTS self.headerSize = struct.calcsize(HEADER_FORMAT) self.rawDataBuffer = np.zeros(IMAGE_BUFFER_SIZE + self.headerSize, dtype=np.uint8) - self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8) + self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_MAX_FRAGMENTS, dtype=np.uint8) self.imageBuffView = memoryview(self.rawFullDataBuffer) self.currentFrameNum = 0 self.totalDataSize = 0 @@ -86,12 +86,12 @@ class UDP_Camera(ICameraSource): # print(f"Packet {packet.id}: {offset}->{offset + packet.image_buf_size}") def resetImageBuffer(self): - self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8) + self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_MAX_FRAGMENTS, dtype=np.uint8) def handle_packet(self, dataSize, senderAddr): bufferView = memoryview(self.rawDataBuffer) packet = PacketHeader(HEADER_FORMAT, bufferView, dataSize) - if packet.id < 0 or packet.id >= NUM_FRAGMENTS: + if packet.id < 0 or packet.id >= NUM_MAX_FRAGMENTS: return # Send acknowledgment @@ -102,35 +102,34 @@ class UDP_Camera(ICameraSource): # self.sock.sendto(f"ERR".encode(), senderAddr) if (packet.id == 0 or packet.frame_num != self.currentFrameNum): - self.packets: list[PacketHeader|None] = [None] * packet.totalPackets # Reset packets + self.packets: list[PacketHeader|None] = [None] * NUM_MAX_FRAGMENTS # Reset packets self.num_loaded = 0 self.currentFrameNum = packet.frame_num self.rawFullDataBuffer[:] = 0 # print(f"Reset frame capture. total packets: {packet.totalPackets}") + + # if self.packets[0] is not None: + # print(f"Got packet id: {packet.id} (total: {self.packets[0].totalPackets} loaded: {self.num_loaded})") - if (packet.id < len(self.packets) - and self.packets[packet.id] is None - and self.packets[0] is not None + if (self.packets is not None and self.currentFrameNum == packet.frame_num - or packet.id == 0 ): + and self.packets[0] is not None + and not packet in self.packets + or packet.id == 0): self.num_loaded += 1 self.packets[packet.id] = packet self.saveDataToBuff(bufferView, packet) - # if self.packets[0] is not None: - # print(f"Got packet id: {packet.id} (total: {self.packets[0].totalPackets} loaded: {self.num_loaded})") - # if self.packets[0] is not None: - # formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets[:self.packets[0].totalPackets]) + "]" - # print(formatted_list) - - - if (self.packets[0] is not None and self.num_loaded >= self.packets[0].totalPackets - or self.num_loaded >= NUM_FRAGMENTS): + if (packet.id < len(self.packets) and self.packets[0] is not None and self.num_loaded >= self.packets[0].totalPackets + or self.num_loaded >= NUM_MAX_FRAGMENTS): + # if self.packets[0] is not None: + # formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets[:self.packets[0].totalPackets]) + "]" + # print(formatted_list) self.process_and_push_image() self.num_loaded = 0 - self.packets: list[PacketHeader|None] = [None] * NUM_FRAGMENTS # Reset packets + self.packets: list[PacketHeader|None] = [None] * NUM_MAX_FRAGMENTS # Reset packets self.rawFullDataBuffer[:] = 0 diff --git a/EyeTrackApp/Camera/camera.py b/EyeTrackApp/Camera/camera.py index 802acab..e1ea4af 100644 --- a/EyeTrackApp/Camera/camera.py +++ b/EyeTrackApp/Camera/camera.py @@ -240,19 +240,26 @@ class Camera(ICameraSource): current_frame_time = time.time() delta_time = current_frame_time - self.last_frame_time self.last_frame_time = current_frame_time - self.fps = (self.fps + self.pf_fps) / 2 - self.newft = time.time() - self.fps = 1 / (self.newft - self.prevft) - self.prevft = self.newft - self.fps = int(self.fps) - if len(self.fl) < 60: - self.fl.append(self.fps) + + # Avoid division by zero + if delta_time > 0: + fps = 1.0 / delta_time else: - self.fl.pop(0) - self.fl.append(self.fps) + fps = 0 + + # Smooth the FPS using a moving average + self.fl.append(fps) + if len(self.fl) > 60: + self.fl.pop(0) # Keep the list length constant + + # Compute average FPS self.fps = sum(self.fl) / len(self.fl) + + # Compute bandwidth per second (bps) self.bps = image.nbytes * self.fps - self.frame_number = self.frame_number + 1 + + # Increment frame count + self.frame_number += 1 if should_push: self.push_image_to_queue(image, self.frame_number, self.fps) except Exception: