lokesh341 commited on
Commit
b379351
·
1 Parent(s): a592e90

Update services/video_service.py

Browse files
Files changed (1) hide show
  1. services/video_service.py +48 -67
services/video_service.py CHANGED
@@ -1,87 +1,68 @@
1
  import cv2
2
- import os
3
  import logging
 
4
 
5
- # Setup logging
6
  logging.basicConfig(
7
  filename="app.log",
8
  level=logging.INFO,
9
  format="%(asctime)s - %(levelname)s - %(message)s"
10
  )
11
 
12
- # Global video capture object
13
- video_cap = None
14
- current_frame_index = 0
15
-
16
- def preload_video(video_path):
17
  """
18
- Preload the video file.
 
19
  Args:
20
- video_path: Path to the video file
 
 
21
  Returns:
22
- str: Status message
23
  """
24
- global video_cap, current_frame_index
25
- try:
26
- if not os.path.exists(video_path):
27
- raise FileNotFoundError(f"Video file not found at {video_path}")
 
 
 
28
 
29
- video_cap = cv2.VideoCapture(video_path)
30
- if not video_cap.isOpened():
31
- raise RuntimeError("Failed to open video file.")
 
 
 
32
 
33
- current_frame_index = 0
34
- total_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
35
- logging.info(f"Preloaded video: {video_path} with {total_frames} frames.")
36
- return f"Successfully loaded video: {video_path} ({total_frames} frames)"
37
- except Exception as e:
38
- logging.error(f"Error preloading video: {str(e)}")
39
- return f"Error loading video: {str(e)}"
40
 
41
- def get_next_video_frame():
42
- """
43
- Get the next frame from the video.
44
- Returns:
45
- numpy array: Frame if successful, None otherwise
46
- """
47
- global video_cap, current_frame_index
48
- if video_cap is None or not video_cap.isOpened():
49
- logging.error("Video capture not initialized.")
50
- return None
51
 
52
- try:
53
- # Set frame position
54
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame_index)
55
- ret, frame = video_cap.read()
56
- if not ret:
57
- # Loop back to the start
58
- current_frame_index = 0
59
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame_index)
60
- ret, frame = video_cap.read()
61
- if not ret:
62
- raise RuntimeError("Failed to read frame from video.")
63
 
64
- current_frame_index += 1
65
- logging.debug(f"Retrieved frame {current_frame_index} from video.")
66
  return frame
67
  except Exception as e:
68
- logging.error(f"Error retrieving frame: {str(e)}")
69
- return None
70
-
71
- def reset_video_index():
72
- """
73
- Reset the frame index to the beginning.
74
- """
75
- global current_frame_index
76
- current_frame_index = 0
77
- logging.info("Reset video frame index to 0.")
78
-
79
- def release_video():
80
- """
81
- Release the video capture object.
82
- """
83
- global video_cap
84
- if video_cap is not None:
85
- video_cap.release()
86
- video_cap = None
87
- logging.info("Released video capture object.")
 
1
  import cv2
2
+ import numpy as np
3
  import logging
4
+ from typing import List, Dict, Any
5
 
6
+ # Configure logging
7
  logging.basicConfig(
8
  filename="app.log",
9
  level=logging.INFO,
10
  format="%(asctime)s - %(levelname)s - %(message)s"
11
  )
12
 
13
+ def overlay_boxes(frame: np.ndarray, detected_items: List[Dict[str, Any]]) -> np.ndarray:
 
 
 
 
14
  """
15
+ Overlay bounding boxes and labels on the frame for detected items.
16
+
17
  Args:
18
+ frame (np.ndarray): Input frame in BGR format.
19
+ detected_items (List[Dict[str, Any]]): List of detected items with coordinates and labels.
20
+
21
  Returns:
22
+ np.ndarray: Frame with overlaid bounding boxes and labels.
23
  """
24
+ # Validate inputs
25
+ if not isinstance(frame, np.ndarray) or frame.size == 0:
26
+ logging.error("Invalid input frame provided to overlay_service.")
27
+ return frame
28
+ if not isinstance(detected_items, list):
29
+ logging.error("Detected items must be a list.")
30
+ return frame
31
 
32
+ try:
33
+ for item in detected_items:
34
+ # Check for required keys
35
+ if "coordinates" not in item or "label" not in item:
36
+ logging.warning(f"Skipping item without coordinates or label: {item}")
37
+ continue
38
 
39
+ # Extract coordinates and label
40
+ x_min, y_min, x_max, y_max = item["coordinates"]
41
+ label = item["label"]
 
 
 
 
42
 
43
+ # Define colors based on detection type
44
+ type_colors = {
45
+ "crack": (147, 112, 219), # Light purple (green + pink mix)
46
+ "pothole": (255, 127, 80), # Coral (red + orange mix)
47
+ "signage": (0, 191, 255), # DeepSkyBlue
48
+ "default": (0, 255, 255) # Yellow
49
+ }
50
+ color = type_colors.get(item.get("type", "default"), type_colors["default"])
 
 
51
 
52
+ # Draw bounding box and label
53
+ cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), color, 2)
54
+ cv2.putText(
55
+ frame,
56
+ label,
57
+ (x_min, y_min - 10),
58
+ cv2.FONT_HERSHEY_SIMPLEX,
59
+ 0.6,
60
+ color,
61
+ 2
62
+ )
63
 
64
+ logging.info(f"Overlaid {len(detected_items)} items on frame.")
 
65
  return frame
66
  except Exception as e:
67
+ logging.error(f"Error overlaying boxes: {str(e)}")
68
+ return frame