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.
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
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
Renk eşiklemede HSV neden RGB'ye tercih edilir?
OpenCV'de H kanalının aralığı nedir?
Açma (opening) işlemi ne yapar?
320 piksel genişliğinde karede top cx = 240'ta. Normalize sapma nedir?
