Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Trafik · Piksel işleme (OpenCV tarzı)

🚗 Trafik sayacı ve hız tahmini

Yukarıdan bakan kamerayla araç say, yönünü ve hızını ölç.

Belediyelerin trafik kameraları, otopark girişleri ve kavşak sayımları için klasik boru hattı: derin öğrenme bile gerekmez. Sabit kamerada yol değişmez, araçlar değişir; arka planı öğrenip çıkarırsak geriye hareket eden lekeler kalır. Lekeleri kareden kareye eşleyip bir çizgiyi geçenleri sayarız; piksel/metre kalibrasyonuyla hız da çıkar.

Durum: …

Eşikler

Örnek sahne: yukarıdan görülen dört şeritli yol; araçlar farklı hızlarla iki yönde akar. Arka plan çıkarma, lekeler ve izleme çizilen piksellerden gerçekten hesaplanır.

Nasıl çalışıyor?

  1. Küçültme ve gri ton: kare 320×240'a küçültülür ve gri tona çevrilir (hız için).
  2. Arka plan modeli: seçici koşan ortalama. Araç olmayan piksellerde arka plan += 0,05 × (kare − arka plan); araç üstündeki piksellerde 0,002 ile (araçlar arka plana karışmasın).
  3. Ön plan maskesi: |kare − arka plan| > 28 olan pikseller beyaz. 4-komşulu bağlı bileşenler; 25 pikselden küçük lekeler gürültü sayılır.
  4. İzleme: her iz, önceki karedeki konumuna 30 px içindeki en yakın lekeyle eşlenir; 8 kare görünmeyen iz silinir.
  5. Sayma ve hız: iz merkezi sayma çizgisini geçince yönüne göre sayılır. Hız = son ~1 sn'deki yer değiştirme (px) × kalibrasyon (m/px) ÷ süre × 3,6 → km/sa. Sınırı aşan araç kırmızı işaretlenir.

Kendin dene

Örnek sahnede her aracın gerçek hızı yanında yazar: kalibrasyonu 0,08 ya da 0,12 m/px yaparak ölçülen hızın nasıl kaydığını gör (sahne 0,10 m/px ile çizildi: kesik çizgiler 3 m, aralar 6 m). Sayma çizgisini taşı. Kamera modunda kamerayı sabit tut ve önünden bir nesne geçir: hareket eden her şey leke olur.

Python karşılığı (OpenCV / MediaPipe)

trafik_sayaci.py
  1. import cv2, numpy as np
  2. cap = cv2.VideoCapture("yol.mp4") # sabit kamera
  3. MPP, LINE_Y, FPS = 0.10, 144, cap.get(cv2.CAP_PROP_FPS) or 30
  4. bg, tracks, next_id, count = None, {}, 1, {"asagi": 0, "yukari": 0} # down / up
  5. while cap.isOpened():
  6. ok, frame = cap.read()
  7. if not ok: break
  8. g = cv2.cvtColor(cv2.resize(frame, (320, 240)), cv2.COLOR_BGR2GRAY).astype(np.float32)
  9. if bg is None: bg = g.copy()
  10. mask = (np.abs(g - bg) > 28).astype(np.uint8)
  11. bg += np.where(mask, 0.002, 0.05) * (g - bg) # seçici koşan ortalama
  12. n, labels, stats, cents = cv2.connectedComponentsWithStats(mask, connectivity=4)
  13. blobs = [tuple(cents[i]) for i in range(1, n) if stats[i, cv2.CC_STAT_AREA] >= 25]
  14. new = {}
  15. for (cx, cy) in blobs: # en yakın iz
  16. tid = min(tracks, key=lambda k: np.hypot(*np.subtract(tracks[k][-1], (cx, cy))), default=None)
  17. if tid is None or np.hypot(*np.subtract(tracks[tid][-1], (cx, cy))) > 30 or tid in new:
  18. tid, next_id = next_id, next_id + 1
  19. hist = tracks.get(tid, []) + [(cx, cy)]
  20. if len(hist) > 1 and (hist[-2][1] < LINE_Y) != (hist[-1][1] < LINE_Y):
  21. count["asagi" if hist[-1][1] > hist[-2][1] else "yukari"] += 1
  22. k = hist[-min(len(hist), int(FPS)):]
  23. kmh = abs(k[-1][1] - k[0][1]) * MPP / (len(k) / FPS) * 3.6
  24. print(f"arac {tid}: {kmh:.0f} km/sa")
  25. new[tid] = hist[-60:]
  26. tracks = new

🔒 Kamera görüntüsü yalnız bu cihazda işlenir; hiçbir yere gönderilmez ve kaydedilmez. Sekmeden ya da sayfadan çıkınca kamera kapanır.

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç