diff --git a/build.sh b/build.sh new file mode 100644 index 0000000000000000000000000000000000000000..2f14c0347020f0bbea475914301317f8e41ee49b --- /dev/null +++ b/build.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Step 2: Build Docker images locally +echo "Building Docker images for services..." + +# Build images for camera, motion_detector, and object_recognizer +docker build -t camera:latest ./services/camera +docker build -t motion_detector:latest ./services/motion_detector +docker build -t object_recognizer:latest ./services/object_recognizer + +# Step 4: Set up docker-compose for deployment +echo "Navigating to deployment directory..." +cd deploy/docker-compose || exit + +# Optional: Stop and remove existing containers and volumes (if any) +echo "Stopping and removing existing containers..." +docker-compose down --volumes --remove-orphans diff --git a/services/camera/src/camera.py b/services/camera/src/camera.py index 912044f579d3914a8e04e0098493ab806f204289..2c53c4d9f9feb2831837e26e22894022eeac0177 100644 --- a/services/camera/src/camera.py +++ b/services/camera/src/camera.py @@ -1,5 +1,7 @@ import random import socket +from contextlib import contextmanager + import cv2 import pickle import struct @@ -13,6 +15,15 @@ import imutils # pip install imutils import logging from opentelemetry.propagate import inject +@contextmanager +def videocapture(*args, **kwargs): + cap = cv2.VideoCapture(*args, **kwargs) + try: + yield cap + finally: + cap.release() + + # Configure logging logging.basicConfig( format='%(asctime)s - %(levelname)s - %(message)s', @@ -23,14 +34,14 @@ logging.basicConfig( ] ) -frametime_histogram = meter.create_histogram( +frametime_histogram = meter.create_gauge( name="camera_frame_time", description="Frames time", unit="ms" ) -sleep_time_between_frame = meter.create_histogram( - name="sleep_time_between_frame", +sleep_time_between_frame = meter.create_gauge( + name="camera_sleep_time_between_frame", description="sleep_time_between_frame", unit="ms" ) @@ -79,9 +90,6 @@ def generate_random_intervals(events_per_hour): def main(): - - - #Connect to motion detector and stream video while True: client_socket = create_socket_and_connect(host_ip, port) @@ -125,7 +133,7 @@ def stream_video_clip(client_socket: socket): # Open the appropriate video file video_path = with_animal_video if motion else no_animal_video - with cv2.VideoCapture(video_path) as video_capture: + with videocapture(video_path) as video_capture: # Determine the number of frames to process according to the clip length if motion: @@ -148,7 +156,7 @@ def stream_video_clip(client_socket: socket): video_capture.set(cv2.CAP_PROP_POS_FRAMES, 0) # Reload video continue else: - logging.info(f"Motion frames processed: {frame_number}") + logging.info(f"Frames read: {frame_number}") break # Resize frame for consistent processing @@ -169,12 +177,12 @@ def stream_video_clip(client_socket: socket): #Metric logging frametime = time.time() - app_start_time - frametime_histogram.record(frametime) + frametime_histogram.set(frametime) #Sleep if needed to maintain frame rate elapsed_time = time.time() - frame_beginning_time sleep_time = MIN_FRAME_TIME - elapsed_time - sleep_time_between_frame.record(sleep_time) + sleep_time_between_frame.set(sleep_time) time.sleep(max(0.0, sleep_time)) except Exception as error: logging.error(f"Error sending frame: {error}")