معاينة مختبر آمنة
Movement Detection
هذي معاينة منقّحة للقراءة فقط؛ ما فيه أي شيء يشتغل داخل الصفحة.
قراءة فقط
معاينة الدفتر
Movement Detection
> **ملاحظة بيئة التشغيل المدمجة:** هالمعاينة تستخدم عيّنة صغيرة وثابتة وآمنة من ناحية الحقوق عشان تكون النتايج قابلة للتكرار. النتايج بالحجم الكامل تحتاج مجموعة البيانات أو النموذج الموثّق بالدرس داخل بيئة خارجية معتمدة.
## اكتشاف حركة الكف بالتدفق البصري
---
هذا الدفتر جزء من منهج «الذكاء الاصطناعي للمبتدئين».
شوفوا هالفيديو، وفيه تتحرك كف شخص يمين ويسار وفوق وتحت قدام خلفية ثابتة.
> **وصف الشكل:** إطار يوضح حركة الكف
**هدفكم** إنكم تستخدمون التدفق البصري عشان تحددون أي أجزاء من الفيديو فيها حركة لفوق أو تحت أو يمين أو يسار.
ابدؤوا باستخراج إطارات الفيديو بالطريقة المشروحة في الدرس:
import matplotlib.pyplot as plt
import numpy as np
frames = []
for frame_index in range(80):
frame = np.zeros((96, 128), dtype=np.float32)
if 12 <= frame_index < 68:
start = 8 + frame_index
frame[38:54, start:start + 16] = 1.0
frames.append(frame)
fig, axes = plt.subplots(1, 3, figsize=(9, 3))
for axis, index in zip(axes, (0, 30, 70)):
axis.imshow(frames[index], cmap="gray", vmin=0, vmax=1)
axis.set_title(f"Frame {index}")
axis.axis("off")
plt.tight_layout()الحين احسبوا إطارات التدفق البصري الكثيف بالطريقة المشروحة في الدرس، ثم حوّلوا التدفق إلى إحداثيات قطبية:
frame_differences = [np.abs(current - previous) for previous, current in zip(frames[:-1], frames[1:])]
motion_energy = np.asarray([difference.sum() for difference in frame_differences])
plt.plot(motion_energy)
plt.title("Frame-to-frame motion energy")
plt.xlabel("Frame")ابنوا مدرجًا تكراريًا للاتجاهات في كل إطار من إطارات التدفق البصري. يوضّح المدرج عدد المتجهات الواقعة داخل كل نطاق، والمفروض يساعدنا نفصل اتجاهات الحركة المختلفة في الإطار.
> تقدرون بعد تصفّرون كل متجه مقداره أقل من عتبة معيّنة. بهالطريقة نتخلّص من الحركات الصغيرة الزايدة في الفيديو، مثل حركة العين أو الرأس.
ارسموا المدرجات التكرارية لبعض الإطارات.
threshold = max(1.0, float(motion_energy.max()) * 0.25)
active_frames = np.flatnonzero(motion_energy > threshold)
segments = []
if len(active_frames):
start = previous = int(active_frames[0])
for frame_index in active_frames[1:]:
frame_index = int(frame_index)
if frame_index != previous + 1:
segments.append((start, previous + 1))
start = frame_index
previous = frame_index
segments.append((start, previous + 1))
print(f"Detected motion segments: {segments}")إذا طالعنا المدرجات التكرارية، بيكون تحديد اتجاه الحركة واضحًا إلى حد كبير. اختاروا النطاقات اللي تقابل فوق وتحت ويمين ويسار، بشرط تتجاوز العتبة المحددة.
if not segments:
raise RuntimeError("The generated motion fixture should contain one active segment")
segment_start, segment_stop = segments[0]
representative = (segment_start + segment_stop) // 2
plt.imshow(frames[representative], cmap="gray", vmin=0, vmax=1)
plt.title(f"Representative active frame {representative}")
plt.axis("off")مبروك! إذا خلصتوا كل الخطوات اللي فوق، فقد أنهيتوا المختبر.
حذفنا المخرجات وعدّادات التشغيل والودجات والمحتوى النشط وقت الاستيراد. شغّل الدفاتر بس في بيئة خارجية تثق فيها.
سجّل تطبيقك
التسجيل اختياري، يفيدك تتذكر وش طبّقت، ولا يمنع إكمال الدورة.