Skip to content

تتبع الأجسام المتعددة باستخدام Ultralytics YOLO

أمثلة على تتبع أجسام متعددة

يُعد تتبع الأجسام في مجال تحليلات الفيديو مهمة بالغة الأهمية لا تقتصر على تحديد موقع الأجسام وفئتها داخل الإطار فحسب، بل تحافظ أيضًا على مُعرّف فريد لكل جسم يتم اكتشافه مع تقدم الفيديو. التطبيقات لا حدود لها — بدءًا من المراقبة والأمن وصولًا إلى تحليلات الرياضة في الوقت الفعلي.

لماذا تختار Ultralytics YOLO لتتبع الأجسام؟

يتوافق الناتج من متتبعات Ultralytics مع اكتشاف الأجسام القياسي ولكنه يتميز بقيمة مضافة تتمثل في مُعرّفات الأجسام. وهذا يجعل من السهل تتبع الأجسام في تدفقات الفيديو وإجراء التحليلات اللاحقة. إليك سبب وجوب التفكير في استخدام Ultralytics YOLO لتلبية احتياجاتك في تتبع الأجسام:

  • الكفاءة: معالجة تدفقات الفيديو في الوقت الفعلي دون المساس بالدقة.
  • المرونة: يدعم العديد من خوارزميات وتكوينات التتبع.
  • سهولة الاستخدام: واجهة برمجة تطبيقات python بسيطة وخيارات CLI للتكامل والنشر السريعين.
  • القابلية للتخصيص: سهولة الاستخدام مع نماذج YOLO المدربة خصيصًا، مما يسمح بالتكامل في التطبيقات الخاصة بالمجال.



شاهد: اكتشاف الأجسام وتتبعها باستخدام Ultralytics YOLO.

تطبيقات واقعية

المواصلات البيع بالتجزئة تربية الأحياء المائية
تتبع المركبات تتبع الأشخاص تتبع الأسماك
تتبع المركبات تتبع الأشخاص تتبع الأسماك

لمحة عن الميزات

تعمل Ultralytics YOLO على توسيع ميزات اكتشاف الأجسام الخاصة بها لتوفير تتبع قوي ومتعدد الاستخدامات للأجسام:

  • التتبع في الوقت الفعلي: تتبع الأجسام بسلاسة في مقاطع الفيديو ذات معدل الإطارات العالي.
  • دعم متعدد لأدوات التتبع: اختر من بين مجموعة متنوعة من خوارزميات التتبع المعمول بها.
  • تكوينات مخصصة لأدوات التتبع: صمم خوارزمية التتبع لتلبية متطلبات محددة عن طريق تعديل المعلمات المختلفة.

أدوات التتبع المتاحة

تدعم Ultralytics YOLO خوارزميات التتبع التالية. يمكن تفعيلها عن طريق تمرير ملف تكوين YAML ذي الصلة مثل tracker=tracker_type.yaml:

  • BoT-SORT - استخدم botsort.yaml لتمكين أداة التتبع هذه.
  • ByteTrack - استخدم bytetrack.yaml لتمكين أداة التتبع هذه.

أداة التتبع الافتراضية هي BoT-SORT.

تتبع

لتشغيل أداة التتبع على تدفقات الفيديو، استخدم نموذج Detect أو Segment أو Pose مُدرَّبًا مثل YOLO11n و YOLO11n-seg و YOLO11n-pose.

مثال

from ultralytics import YOLO

# Load an official or custom model
model = YOLO("yolo11n.pt")  # Load an official Detect model
model = YOLO("yolo11n-seg.pt")  # Load an official Segment model
model = YOLO("yolo11n-pose.pt")  # Load an official Pose model
model = YOLO("path/to/best.pt")  # Load a custom trained model

# Perform tracking with the model
results = model.track("https://youtu.be/LNwODJXcvt4", show=True)  # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # with ByteTrack
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4"      # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4"  # Official Segment model
yolo track model=yolo11n-pose.pt source="https://youtu.be/LNwODJXcvt4" # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # Custom trained model

# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"

كما هو موضح في الاستخدام أعلاه، يتوفر التتبع لجميع نماذج Detect و Segment و Pose التي يتم تشغيلها على مقاطع الفيديو أو مصادر البث.

التكوين

وسائط تتبع

تشارك تهيئة التتبع الخصائص مع وضع التوقع (Predict)، مثل conf, iou، و show. لمزيد من التكوينات، ارجع إلى توقع صفحة النموذج.

مثال

from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show

تحديد المتعقب

تتيح لك Ultralytics أيضًا استخدام ملف تكوين مُعدَّل لأداة التتبع. للقيام بذلك، ما عليك سوى عمل نسخة من ملف تكوين أداة التتبع (على سبيل المثال، custom_tracker.yaml) من ultralytics/cfg/trackers وقم بتعديل أي تكوينات (باستثناء tracker_type) حسب احتياجاتك.

مثال

from ultralytics import YOLO

# Load the model and run the tracker with a custom configuration file
model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

راجع قسم وسيطات التعقب للحصول على وصف تفصيلي لكل معلمة.

وسائط التتبع

يمكن ضبط بعض سلوكيات التتبع بدقة عن طريق تعديل ملفات تكوين YAML الخاصة بكل خوارزمية تتبع. تحدد هذه الملفات معلمات مثل العتبات والمخازن المؤقتة ومنطق المطابقة:

يوفر الجدول التالي وصفًا لكل معلمة:

معلومات حول عتبة أداة التتبع

إذا كانت درجة الثقة في الكائن منخفضة، أي أقل من track_high_thresh، فلن يتم إرجاع أي مسارات وتحديثها بنجاح.

المعلمة قيم أو نطاقات صالحة الوصف
tracker_type botsort, bytetrack يحدد نوع المتعقب. الخيارات هي botsort أو bytetrack.
track_high_thresh 0.0-1.0 يتم استخدام هذا الحد الأدنى لعملية الربط الأولى أثناء التتبع. يؤثر على مدى الثقة في مطابقة الكشف بمسار موجود.
track_low_thresh 0.0-1.0 يتم استخدام هذا الحد الأدنى لعملية الربط الثانية أثناء التتبع. يتم استخدامه عندما تفشل عملية الربط الأولى، بمعايير أكثر تساهلاً.
new_track_thresh 0.0-1.0 يتم استخدام هذا الحد الأدنى لتهيئة مسار جديد إذا لم يتطابق الكشف مع أي مسارات موجودة. يتحكم في الوقت الذي يعتبر فيه ظهور كائن جديد.
track_buffer >=0 يستخدم المخزن المؤقت للإشارة إلى عدد الإطارات التي يجب أن تظل المسارات المفقودة نشطة قبل إزالتها. تعني القيمة الأعلى مزيدًا من التسامح مع الانسداد.
match_thresh 0.0-1.0 عتبة لمطابقة المسارات. القيم الأعلى تجعل المطابقة أكثر تساهلاً.
fuse_score True, False يحدد ما إذا كان سيتم دمج درجات الثقة مع مسافات IoU قبل المطابقة. يساعد في موازنة المعلومات المكانية ومعلومات الثقة عند الربط.
gmc_method orb, sift, ecc, sparseOptFlow, None الطريقة المستخدمة لتعويض الحركة العالمية. يساعد في حساب حركة الكاميرا لتحسين التتبع.
proximity_thresh 0.0-1.0 الحد الأدنى لـ IoU المطلوب لمطابقة صحيحة مع ReID (إعادة التعريف). يضمن التقارب المكاني قبل استخدام إشارات المظهر.
appearance_thresh 0.0-1.0 الحد الأدنى من تشابه المظهر المطلوب لإعادة التعريف (ReID). يحدد مدى التشابه البصري بين عمليتي الكشف ليتم ربطهما.
with_reid True, False يشير إلى ما إذا كان سيتم استخدام ReID. يتيح المطابقة المستندة إلى المظهر لتحسين التتبع عبر الانسدادات. مدعوم فقط من قبل BoTSORT.
model auto, yolo11[nsmlx]-cls.pt يحدد النموذج المراد استخدامه. القيمة الافتراضية هي auto، والذي يستخدم الميزات الأصلية إذا كان الكاشف YOLO، وإلا فإنه يستخدم yolo11n-cls.pt.

تمكين إعادة التعريف (ReID)

بشكل افتراضي، يتم إيقاف تشغيل ReID لتقليل النفقات العامة للأداء. تمكينها بسيط - فقط قم بتعيين with_reid: True في تكوين المتعقب: يمكنك أيضًا تخصيص الـ model يستخدم لـ ReID، مما يسمح لك بالمفاضلة بين الدقة والسرعة اعتمادًا على حالة الاستخدام الخاصة بك:

  • الميزات الأصلية (model: auto): يستفيد هذا من الميزات مباشرة من كاشف YOLO لـ ReID، مما يضيف الحد الأدنى من الحمل. إنه مثالي عندما تحتاج إلى مستوى معين من ReID دون التأثير بشكل كبير على الأداء. إذا كان الكاشف لا يدعم الميزات الأصلية، فإنه يعود تلقائيًا إلى استخدام yolo11n-cls.pt.
  • نماذج تصنيف YOLO: يمكنك تعيين نموذج تصنيف بشكل صريح (على سبيل المثال. yolo11n-cls.pt) لاستخراج ميزات ReID. يوفر هذا تضمينات أكثر تمييزًا، ولكنه يقدم زمن انتقال إضافي بسبب خطوة الاستدلال الإضافية.

للحصول على أداء أفضل، خاصة عند استخدام نموذج تصنيف منفصل لـ ReID، يمكنك تصديره إلى واجهة خلفية أسرع مثل TensorRT:

تصدير نموذج ReID إلى TensorRT

from torch import nn

from ultralytics import YOLO

# Load the classification model
model = YOLO("yolo11n-cls.pt")

# Add average pooling layer
head = model.model.model[-1]
pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(start_dim=1))
pool.f, pool.i = head.f, head.i
model.model.model[-1] = pool

# Export to TensorRT
model.export(format="engine", half=True, dynamic=True, batch=32)

بمجرد التصدير، يمكنك الإشارة إلى مسار نموذج TensorRT في إعدادات المتعقب الخاص بك، وسيتم استخدامه لـ ReID أثناء التتبع.

أمثلة بايثون

حفظ مسار التتبع

إليك برنامج python نصي يستخدم OpenCV (cv2) و YOLO11 لتشغيل تتبع الكائنات على إطارات الفيديو. يفترض هذا البرنامج النصي أنك قمت بالفعل بتثبيت الحزم الضرورية (opencv-python و ultralytics). The persist=True تخبر الوسيطة المتعقب أن الصورة أو الإطار الحالي هو التالي في التسلسل، وتتوقع مسارات من الصورة السابقة في الصورة الحالية.

حلقة تكرار (for-loop) متدفقة مع التتبع

import cv2

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.pt")

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO11 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Display the annotated frame
        cv2.imshow("YOLO11 Tracking", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

يرجى ملاحظة التغيير من model(frame) إلى model.track(frame)، مما يتيح تتبع الكائنات بدلاً من الاكتشاف البسيط. سيقوم هذا البرنامج النصي المعدل بتشغيل المتعقب على كل إطار من الفيديو، وتصور النتائج، وعرضها في نافذة. يمكن الخروج من الحلقة بالضغط على 'q'.

رسم مسارات التتبع بمرور الوقت

يمكن أن يوفر تصور مسارات الكائنات عبر الإطارات المتتالية رؤى قيمة حول أنماط الحركة وسلوك الكائنات المكتشفة داخل الفيديو. مع Ultralytics YOLO11، يعد رسم هذه المسارات عملية سلسة وفعالة.

في المثال التالي، نوضح كيفية استخدام إمكانات التتبع في YOLO11 لرسم حركة الكائنات المكتشفة عبر إطارات فيديو متعددة. يتضمن هذا البرنامج النصي فتح ملف فيديو، وقراءته إطارًا تلو الآخر، واستخدام نموذج YOLO لتحديد وتتبع الكائنات المختلفة. من خلال الاحتفاظ بالنقاط المركزية للمربعات المحيطة المكتشفة وتوصيلها، يمكننا رسم خطوط تمثل المسارات التي تتبعها الكائنات التي يتم تعقبها.

رسم المسارات عبر إطارات فيديو متعددة

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.pt")

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Store the track history
track_history = defaultdict(lambda: [])

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLO11 tracking on the frame, persisting tracks between frames
        result = model.track(frame, persist=True)[0]

        # Get the boxes and track IDs
        if result.boxes and result.boxes.is_track:
            boxes = result.boxes.xywh.cpu()
            track_ids = result.boxes.id.int().cpu().tolist()

            # Visualize the result on the frame
            frame = result.plot()

            # Plot the tracks
            for box, track_id in zip(boxes, track_ids):
                x, y, w, h = box
                track = track_history[track_id]
                track.append((float(x), float(y)))  # x, y center point
                if len(track) > 30:  # retain 30 tracks for 30 frames
                    track.pop(0)

                # Draw the tracking lines
                points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                cv2.polylines(frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Display the annotated frame
        cv2.imshow("YOLO11 Tracking", frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

تتبع متعدد الخيوط

يوفر التتبع متعدد الخيوط القدرة على تشغيل تتبع الكائنات على تدفقات فيديو متعددة في وقت واحد. هذا مفيد بشكل خاص عند التعامل مع مدخلات فيديو متعددة، مثل من كاميرات مراقبة متعددة، حيث يمكن للمعالجة المتزامنة أن تعزز الكفاءة والأداء بشكل كبير.

في برنامج python النصي المتوفر، نستخدم وحدة python threading لتشغيل مثيلات متعددة من المتعقب في وقت واحد. كل مؤشر ترابط مسؤول عن تشغيل المتعقب على ملف فيديو واحد، وتعمل جميع مؤشرات الترابط في وقت واحد في الخلفية.

لضمان حصول كل مؤشر ترابط على المعلمات الصحيحة (ملف الفيديو، والنموذج المراد استخدامه وفهرس الملف)، فإننا نحدد دالة run_tracker_in_thread تقبل هذه المعلمات وتحتوي على حلقة التتبع الرئيسية. تقرأ هذه الدالة الفيديو إطارًا تلو الآخر، وتشغل المتعقب، وتعرض النتائج.

يتم استخدام نموذجين مختلفين في هذا المثال: yolo11n.pt و yolo11n-seg.pt، يتتبع كل منهما كائنات في ملف فيديو مختلف. يتم تحديد ملفات الفيديو في SOURCES.

في daemon=True المعلمة في threading.Thread يعني أن هذه الخيوط سيتم إغلاقها بمجرد انتهاء البرنامج الرئيسي. ثم نبدأ الخيوط بـ start() ونستخدم join() لجعل الخيط الرئيسي ينتظر حتى تنتهي خيوط المتعقب.

أخيرًا، بعد أن تكمل جميع الخيوط مهمتها، يتم إغلاق النوافذ التي تعرض النتائج باستخدام cv2.destroyAllWindows().

تنفيذ تتبع متعدد الخيوط

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam


def run_tracker_in_thread(model_name, filename):
    """
    Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO11 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass


# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

يمكن بسهولة توسيع هذا المثال للتعامل مع المزيد من ملفات الفيديو والنماذج عن طريق إنشاء المزيد من الخيوط وتطبيق نفس المنهجية.

المساهمة بمتتبعات جديدة

هل أنت ماهر في تتبع الأجسام المتعددة وهل قمت بتنفيذ أو تكييف خوارزمية تتبع بنجاح باستخدام Ultralytics YOLO؟ نحن ندعوك للمساهمة في قسم المتعقبات الخاص بنا في ultralytics/cfg/trackers! يمكن أن تكون تطبيقاتك وحلولك الواقعية لا تقدر بثمن للمستخدمين الذين يعملون على مهام التتبع.

من خلال المساهمة في هذا القسم، فإنك تساعد في توسيع نطاق حلول التتبع المتاحة داخل إطار عمل Ultralytics YOLO، مما يضيف طبقة أخرى من الوظائف والأدوات المساعدة للمجتمع.

لبدء مساهمتك، يرجى الرجوع إلى دليل المساهمة للحصول على إرشادات شاملة حول إرسال طلب سحب (PR) 🛠️. نحن متحمسون لرؤية ما تقدمه!

معًا، دعنا نعزز قدرات التتبع في النظام البيئي Ultralytics YOLO 🙏!

الأسئلة الشائعة

ما هو تتبع الأجسام المتعددة وكيف يدعمه Ultralytics YOLO؟

يتضمن تتبع الأجسام المتعددة في تحليلات الفيديو تحديد الأجسام والحفاظ على مُعرّف فريد لكل جسم يتم اكتشافه عبر إطارات الفيديو. يدعم Ultralytics YOLO ذلك من خلال توفير تتبع في الوقت الفعلي مع مُعرّفات الأجسام، مما يسهل مهام مثل المراقبة الأمنية والتحليلات الرياضية. يستخدم النظام أدوات تتبع مثل BoT-SORT و ByteTrack، والتي يمكن تهيئتها عبر ملفات YAML.

كيف يمكنني تكوين متتبع مخصص لـ Ultralytics YOLO؟

يمكنك تكوين متتبع مخصص عن طريق نسخ ملف تكوين متتبع موجود (على سبيل المثال، custom_tracker.yaml) من دليل تكوين متتبعات Ultralytics وتعديل المعلمات حسب الحاجة، باستثناء tracker_type. استخدم هذا الملف في نموذج التتبع الخاص بك كما يلي:

مثال

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

كيف يمكنني تشغيل تتبع الأجسام على عدة تدفقات فيديو في وقت واحد؟

لتشغيل تتبع الكائنات على عدة تدفقات فيديو في وقت واحد، يمكنك استخدام وحدة threading python. سيتعامل كل مؤشر ترابط مع دفق فيديو منفصل. إليك مثال على كيفية إعداد ذلك:

تتبع متعدد الخيوط

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam


def run_tracker_in_thread(model_name, filename):
    """
    Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO11 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass


# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

ما هي التطبيقات الواقعية لتتبع الأجسام المتعددة باستخدام Ultralytics YOLO؟

تتبع الأجسام المتعددة باستخدام Ultralytics YOLO له تطبيقات عديدة، بما في ذلك:

  • النقل: تتبع المركبات لإدارة حركة المرور و القيادة الذاتية.
  • البيع بالتجزئة: تتبع الأشخاص لتحليلات المتاجر والأمن.
  • تربية الأحياء المائية: تتبع الأسماك لمراقبة البيئات المائية.
  • تحليلات رياضية: تتبع اللاعبين والمعدات لتحليل الأداء.
  • أنظمة الأمان: مراقبة الأنشطة المشبوهة وإنشاء إنذارات الأمان.

تستفيد هذه التطبيقات من قدرة Ultralytics YOLO على معالجة مقاطع الفيديو ذات معدل الإطارات العالي في الوقت الفعلي بدقة استثنائية.

كيف يمكنني تصور مسارات الأجسام عبر إطارات فيديو متعددة باستخدام Ultralytics YOLO؟

لتصور مسارات الكائنات عبر إطارات فيديو متعددة، يمكنك استخدام ميزات تتبع نموذج YOLO جنبًا إلى جنب مع OpenCV لرسم مسارات الكائنات المكتشفة. إليك نموذج لبرنامج نصي يوضح ذلك:

رسم المسارات عبر إطارات فيديو متعددة

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()
        annotated_frame = results[0].plot()
        for box, track_id in zip(boxes, track_ids):
            x, y, w, h = box
            track = track_history[track_id]
            track.append((float(x), float(y)))
            if len(track) > 30:
                track.pop(0)
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
        cv2.imshow("YOLO11 Tracking", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

سيقوم هذا البرنامج النصي برسم خطوط التتبع التي تعرض مسارات حركة الكائنات التي يتم تتبعها بمرور الوقت، مما يوفر رؤى قيمة حول سلوك الكائن وأنماطه.



📅 أُنشئ منذ سنة واحدة ✏️ تم التحديث منذ 26 يومًا

تعليقات