From 05dbf15213dfd8ba4e0ef8b5ea82ee3821497d6f Mon Sep 17 00:00:00 2001
From: Umair Bin Ahmad <60266900+UmairBinAhmad@users.noreply.github.com>
Date: Sun, 17 Nov 2024 21:41:26 +0500
Subject: [PATCH] Create object_tracking_yolov10_rtsp_stream.py

---
 .../object_tracking_yolov10_rtsp_stream.py    | 81 +++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100644 examples/object_tracking_yolov10_rtsp_stream.py

diff --git a/examples/object_tracking_yolov10_rtsp_stream.py b/examples/object_tracking_yolov10_rtsp_stream.py
new file mode 100644
index 00000000..00f0f57a
--- /dev/null
+++ b/examples/object_tracking_yolov10_rtsp_stream.py
@@ -0,0 +1,81 @@
+import cv2
+import numpy as np
+import os
+from ultralytics import YOLO
+from ultralytics.utils.checks import check_imshow
+from ultralytics.utils.plotting import Annotator, colors
+from collections import defaultdict
+
+# Replace with your RTSP URL
+rtsp_url = "rtsp://192.168.100.10/live/1"
+
+# Open a connection to the RTSP stream
+cap = cv2.VideoCapture(rtsp_url)
+
+
+track_history = defaultdict(lambda: [])
+model = YOLO("yolov10s.pt")
+names = model.model.names
+
+if not cap.isOpened():
+    print("Error: Could not open RTSP stream.")
+else:
+    print("RTSP stream opened successfully.")
+
+# Read the first frame to initialize background
+ret, frame1 = cap.read()
+
+w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
+
+if not ret:
+    print("Failed to retrieve frame. Exiting...")
+    cap.release()
+    cv2.destroyAllWindows()
+    exit()
+
+
+while cap.isOpened():
+    success, frame = cap.read()
+    if not success:
+        print("Failed to retrieve frame. Exiting...")
+        break
+
+    if success:
+        results = model.track(frame, persist=True, verbose=False)
+        boxes = results[0].boxes.xyxy.cpu()
+
+        if results[0].boxes.id is not None:
+            # Extract prediction results
+            clss = results[0].boxes.cls.cpu().tolist()
+            track_ids = results[0].boxes.id.int().cpu().tolist()
+            confs = results[0].boxes.conf.float().cpu().tolist()
+             
+            # Annotator Init
+            annotator = Annotator(frame, line_width=2)
+            
+            for box, cls, track_id in zip(boxes, clss, track_ids):
+                annotator.box_label(box, color=colors(int(cls), True), label=names[int(cls)])
+
+                # Store tracking history
+                track = track_history[track_id]
+                track.append((int((box[0] + box[2]) / 2), int((box[1] + box[3]) / 2)))
+                if len(track) > 30:
+                    track.pop(0)
+                
+                # Plot tracks
+                points = np.array(track, dtype=np.int32).reshape((-1, 1, 2))
+                cv2.circle(frame, (track[-1]), 7, colors(int(cls), True), -1)
+                cv2.polylines(frame, [points], isClosed=False, color=colors(int(cls), True), thickness=2)
+
+
+    # Display the frames
+    cv2.imshow("Original Frame", frame)
+    # Break the loop on 'q' key press
+    if cv2.waitKey(1) & 0xFF == ord('q'):
+        print("Exiting...")
+        break
+
+
+# Release resources
+cap.release()
+cv2.destroyAllWindows()