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

6. ünite / 10 · yaklaşık 5 saat

Kamera ve OpenCV: renkli hedef bulma

picamera2 ile kare yakalama, HSV eşikleme, morfoloji, momentler ve hedefe dönüş komutu.

Bu ünitenin sonunda

  • picamera2 ile düşük çözünürlükte kare yakalamak ve kare hızını ölçmek
  • BGR → HSV dönüşümü ve inRange ile renk maskesi çıkarmak
  • Açma işlemiyle gürültüyü temizleyip momentlerle ağırlık merkezini bulmak
  • Hedefin yatay sapmasını robot için dönüş komutuna çevirmek

Ders notları

Pi kamera modülü (Camera Module 3 gibi) CSI kablosuyla bağlanır ve picamera2 kütüphanesiyle okunur. Robotta yüksek çözünürlük gereksizdir: 320 × 240 piksel, Pi 4'te bile saniyede onlarca kare işlemeye yeter.

Neden HSV?

RGB'de bir topun rengi ışıkla birlikte üç kanalda birden değişir. HSV'de H (ton) rengin kendisini, S doygunluğu, V parlaklığı tutar: gölgede yalnız V düşer. OpenCV'de H 0–179 (derece / 2), S ve V 0–255 aralığındadır. Kırmızı tonun iki ucunda (170–179 ve 0–10) olduğu için iki maske birleştirilir.

Boru hattı

  • Eşikleme: cv2.inRange(hsv, lo, hi) ikili maske verir.
  • Açma: önce aşındır (tek piksellik gürültü silinir), sonra genişlet (top eski boyuna döner).
  • Momentler: m00 alan, (m10/m00, m01/m00) ağırlık merkezi.
  • Karar: alan eşikten küçükse "hedef yok"; değilse sapma = (cx − W/2) / (W/2), dönüş = k · sapma.

Daha ağır işler (nesne tanıma) için Pi'nin AI HAT'i gibi hızlandırıcılar ya da sitenin Gerçek hayat demoları bölümündeki cihaz içi modeller kullanılır; ilkeler aynıdır: algıla, filtrele, karar ver.

Simülasyon

Kamera → OpenCV boru hattı: renkli top bulma

Yapay bir kamera karesinde HSV eşikleme, açma (aşındır + genişlet), momentlerle ağırlık merkezi ve dönüş komutu. Gürültüyü, ışığı ve eşikleri değiştir; boru hattının hangi adımda bozulduğunu gör.

Kamera (BGR → HSV)
Maske: beyaz = kalan, kırmızı = açmayla silinen
alan m00 = 193 px · cx = 56,0 · cy = 32,0 dönüş = +0,40 (sağa) açmanın sildiği gürültü: 4 px

HSV lo [170, 120, 70] hi [10, 255, 255]

Kendin dene

Benzetimde kırmızı topu sağa kaydır ve dönüş komutunun işaretini izle. Gürültüyü artır: açma kapalıyken maskede kaç piksel gürültü kalıyor, açınca ne oluyor? Işığı %40'a indir ve eşiğin V alt sınırını düşürmeden topun neden kaybolduğunu açıkla. Gerçek Pi'de: kodu çalıştırıp kare hızını yazdır.

Kod

picamera2 + OpenCV ile top izleme
from picamera2 import Picamera2
import cv2, numpy as np

cam = Picamera2()
cam.configure(cam.create_video_configuration(main={"size": (320, 240), "format": "RGB888"}))
cam.start()
LO, HI = np.array([40, 80, 60]), np.array([85, 255, 255])   # yeşil, OpenCV HSV (H 0-179)
kernel = np.ones((3, 3), np.uint8)

while True:
    frame = cam.capture_array()                    # RGB888 adı yanıltıcı: bellekte BGR sırası
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask = cv2.morphologyEx(cv2.inRange(hsv, LO, HI), cv2.MORPH_OPEN, kernel)
    m = cv2.moments(mask, binaryImage=True)
    if m["m00"] > 150:                             # yeterince büyük leke
        cx = m["m10"] / m["m00"]
        turn = (cx - 160) / 160                    # -1 sol ... +1 sağ
        print(f"target x={cx:.0f} turn={turn:+.2f}")
    else:
        print("no target")

Sık yapılan hatalar

  • picamera2'nin RGB888 biçiminin bellekte BGR sırası olduğunu unutmak: renkler yer değiştirir.
  • Eşikleri tek bir ışıkta ayarlamak: sınıfta çalışan eşik koridorda çalışmaz; S ve V alt sınırlarını geniş tut.
  • Tam çözünürlükte işlemek: kare hızı düşer, denetim gecikir.
  • Hedef yokken son komutu sürdürmek: robot kaybolan hedefin peşinden duvara gider.

Yazılım mühendisliği bağlantısı

Görüntü boru hattını kayıtlı karelerle test et: kamera yok, sonuç deterministik.

  • Birkaç örnek kare ve beklenen ağırlık merkezi bir test fikstürü olsun.
  • Eşikleri koddan çıkarıp YAML'a koy; sahada ayarlanır, kod değişmez.

Kendini sına

  1. Renk eşiklemede HSV neden RGB'ye tercih edilir?

  2. OpenCV'de H kanalının aralığı nedir?

  3. Açma (opening) işlemi ne yapar?

  4. 320 piksel genişliğinde karede top cx = 240'ta. Normalize sapma nedir?

Gerçek parçalar (Hyvex, 3B modelli)

ESOF 323, 10. hafta

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ç