Okullar için Robotik ve Mühendislik · anaokulundan liseye

Tarım · Piksel işleme (OpenCV tarzı)

🍅 Meyve olgunluğu (renk ayrıştırma)

Hasat ve paketleme bandında domatesleri renginden sınıflandır.

Paketleme tesislerindeki ayıklama makineleri ve hasat robotları için en eski ve hâlâ en çok kullanılan yöntem: RGB yerine HSV renk uzayına geçmek. HSV'de "ton" (H) rengin kendisidir, ışık değişse de pek değişmez; böylece kırmızı, turuncu ve yeşil pikselleri basit aralıklarla ayırabiliriz.

Durum: …

Eşikler

Örnek sahne: konveyör bandında farklı olgunlukta, programla çizilmiş domatesler. HSV ayrıştırma çizilen piksellerde gerçekten yapılır.

Nasıl çalışıyor?

  1. Renk uzayı: her piksel RGB'den HSV'ye çevrilir: H ton (0–360°), S doygunluk, V parlaklık.
  2. Arka planı atma: S < 0,35 (gri bant) ya da V < 0,2 (gölge) olan pikseller meyve değildir.
  3. Ton sınıfları: H < 20° ya da ≥ 340° → kırmızı; 20–65° → sarı/turuncu; 65–170° → yeşil.
  4. Nesneler: meyve maskesinde bağlı bileşenler (her leke bir meyve), her leke için kırmızı/sarı/yeşil piksel sayımı.
  5. Kural: olgunluk oranı = kırmızı / (kırmızı + sarı + yeşil). ≥ 0,6 → olgun, ≥ 0,25 → yarı olgun, değilse ham. Banttaki kapıyı geçen meyveler sınıfına göre sayılır.

Kendin dene

Olgun eşiğini 0,9 yap: hangi domatesler "yarı olgun"a düştü? Kırmızı ton sınırını 35°'ye çıkar: turuncular da kırmızı sayılmaya başlar. Kamera modunda ortadaki kutuya kırmızı, turuncu ya da yeşil bir nesne tut.

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

meyve_olgunlugu.py
  1. import cv2, numpy as np
  2. img = cv2.imread("bant.jpg") # konveyör görüntüsü
  3. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # OpenCV'de H 0–180
  4. H, S, V = hsv[..., 0] * 2, hsv[..., 1] / 255, hsv[..., 2] / 255
  5. fruit = (S >= 0.35) & (V >= 0.2) # gri bant ve gölge dışarıda
  6. red = fruit & ((H < 20) | (H >= 340))
  7. yellow = fruit & (H >= 20) & (H < 65)
  8. green = fruit & (H >= 65) & (H < 170)
  9. mask = (red | yellow | green).astype(np.uint8)
  10. n, labels, stats, _ = cv2.connectedComponentsWithStats(mask)
  11. for i in range(1, n):
  12. if stats[i, cv2.CC_STAT_AREA] < 200: continue
  13. blob = labels == i
  14. r, y, g = red[blob].sum(), yellow[blob].sum(), green[blob].sum()
  15. ratio = r / (r + y + g)
  16. label = "olgun" if ratio >= 0.6 else "yari olgun" if ratio >= 0.25 else "ham" # ripe / half / unripe
  17. x, y0, w, h = stats[i, :4]
  18. cv2.rectangle(img, (x, y0), (x + w, y0 + h), (255, 255, 255), 2)
  19. cv2.putText(img, f"{label} {ratio:.0%}", (x, y0 - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
  20. cv2.imwrite("sonuc.jpg", img)

🔒 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ç