استكشف أساسيات التدفق البصري في الرؤية الحاسوبية. تعرف على كيفية قيام متجهات الحركة بتحسين فهم الفيديو وتعزيز التتبع في Ultralytics .
التدفق البصري هو نمط الحركة الظاهرة للأجسام والأسطح والحواف في مشهد بصري ناتج عن الحركة النسبية بين المراقب والمشهد. في مجال الرؤية الحاسوبية، يعتبر هذا المفهوم أساسيًا لفهم الديناميكيات الزمنية في تسلسلات الفيديو. من خلال تحليل إزاحة البكسلات بين إطارين متتاليين، تولد خوارزميات التدفق البصري مجالًا متجهًا حيث يمثل كل متجه اتجاه وحجم الحركة لنقطة معينة. تتيح هذه الإشارة البصرية منخفضة المستوى لأنظمة الذكاء الاصطناعي إدراك ليس فقط ما يوجد في الصورة، ولكن أيضًا كيفية حركتها، مما يسد الفجوة بين تحليل الصور الثابتة و فهم الفيديو الديناميكي.
يعتمد حساب التدفق البصري عمومًا على افتراض ثبات السطوع، الذي يفترض أن كثافة البكسل على كائن ما تظل ثابتة من إطار إلى آخر، حتى أثناء حركته. تستخدم الخوارزميات هذا المبدأ لحل متجهات الحركة باستخدام نهجين أساسيين:
على الرغم من استخدامهما معًا في كثير من الأحيان، من الضروري التمييز بين التدفق البصري وتتبع الكائنات. التدفق البصري هو عملية منخفضة المستوى تصف حركة البكسل الفورية؛ ولا يفهم بطبيعته هوية الكائن أو استمراريته.
في المقابل، يعد تتبع الكائنات مهمة عالية المستوى تحدد مواقع كيانات معينة وتخصص لها معرفًا ثابتًا على مدار الوقت. عادةً ما تقوم أجهزة التتبع المتقدمة، مثل تلك المدمجة في Ultralytics بالكشف عن الكائنات للعثور عليها ثم تستخدم إشارات الحركة — التي تُستمد أحيانًا من التدفق البصري — لربط عمليات الكشف عبر الإطارات. يُجيب التدفق البصري على سؤال "ما مدى سرعة حركة هذه البكسلات في الوقت الحالي"، بينما يُجيب التتبع على سؤال "أين ذهبت السيارة رقم 5؟"
تتيح القدرة على تقدير الحركة على مستوى البكسل استخدام مجموعة واسعة من التقنيات المتطورة:
يوضح المثال التالي كيفية حساب التدفق البصري الكثيف باستخدام OpenCV ، وهي أداة قياسية في نظام الرؤية الحاسوبية . يستخدم هذا المقتطف خوارزمية Farneback لإنشاء خريطة تدفق بين إطارين متتاليين.
import cv2
import numpy as np
# Simulate two consecutive frames (replace with actual image paths)
frame1 = np.zeros((100, 100, 3), dtype=np.uint8)
frame2 = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(frame1, (20, 20), (40, 40), (255, 255, 255), -1) # Object at pos 1
cv2.rectangle(frame2, (25, 25), (45, 45), (255, 255, 255), -1) # Object moved
# Convert to grayscale for flow calculation
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Compute magnitude and angle of 2D vectors
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
print(f"Max motion detected: {np.max(mag):.2f} pixels")
بالنسبة للتطبيقات عالية المستوى التي تتطلب استمرارية الكائنات بدلاً من حركة البكسل الخام، يجب على المستخدمين النظر في أوضاع التتبع المتاحة في Ultralytics YOLO11 و YOLO26. تعمل هذه النماذج على تجريد تعقيد تحليل الحركة ، وتوفر معرفات كائنات قوية ومسارات جاهزة للاستخدام لمهام تتراوح من مراقبة حركة المرور إلى تحليلات البيع بالتجزئة.