Görüntü İşlemeYazar:

OpenCV ve Arduino ile Yüz Algılama ve Takip

Kamera görüntüsünde algılanan yüzü kadraj merkezinde tutmak için pan-tilt mekanizmasındaki iki servo motoru gerçek zamanlı yöneten sistem.

PythonOpenCVPySerialArduinoC++
OpenCV ve Arduino ile Yüz Algılama ve Takip

Proje Hakkında

Bu proje, kameranın gördüğü yüzü iki eksenli bir pan-tilt mekanizmasıyla takip ediyor. Bilgisayarda çalışan Python uygulaması yüzün görüntü içindeki konumunu buluyor; Arduino ise hesaplanan yatay ve dikey açıları iki servo motora uygulayarak kamerayı hedefe doğru çeviriyor.

Sistem kimlik belirleyen bir yüz tanıma modeli kullanmıyor. OpenCV’nin Haar cascade sınıflandırıcısıyla yüz algılama yapıyor ve algılanan yüzün geometrik merkezini takip ediyor.

Amaç

Görüntü koordinatları ile fiziksel hareket arasında çalışan bir kontrol zinciri kurmak: kameradaki hedef merkezden uzaklaştığında sapmayı ölçmek, bu sapmayı motor açılarına dönüştürmek ve kamerayı yeniden hedefe yöneltmek.

Nasıl Çalışıyor?

  1. Python uygulaması VideoCapture(1) ile USB kameradan kare alıyor ve görüntüyü gri tona çeviriyor.
  2. haarcascade_frontalface_default.xml, detectMultiScale(..., 1.3, 4) parametreleriyle karedeki yüz bölgelerini çıkarıyor.
  3. Algılanan dikdörtgenin merkezi ile görüntünün merkezi karşılaştırılıyor. Yatay piksel farkı 18’e, dikey fark 25’e bölünerek yaklaşık servo düzeltmesi hesaplanıyor.
  4. Yüzün merkezin hangi tarafında olduğuna göre X ve Y yönleri belirleniyor. İki piksel ölçekli düzeltmenin altındaki değişimler ölü bölge olarak bırakılıyor.
  5. Komutlar yaklaşık 0,4 saniyede bir güncelleniyor. X ekseni negatif tam sayı, Y ekseni pozitif tam sayı olarak 115200 baud seri bağlantıya yazılıyor.
  6. Arduino Serial.parseInt() ile gelen sayıyı okuyor. Negatif değerleri pin 9’daki yatay servoya, pozitif değerleri pin 10’daki dikey servoya gönderiyor.

Ekrandaki kırmızı çizgiler yüz merkezini, sarı çizgi ise yüz merkezi ile kare merkezi arasındaki hatayı görünür hâle getiriyor. q tuşu kamera döngüsünü sonlandırıyor.

Kullanılan Teknolojiler

  • Python: kamera döngüsü, koordinat hesabı ve kontrol komutlarının üretimi.
  • OpenCV: kamera erişimi, gri ton dönüşümü, Haar cascade yüz algılama ve takip katmanının çizilmesi.
  • PySerial: Python ile Arduino arasında 115200 baud seri haberleşme.
  • Arduino C++: seri protokolün ayrıştırılması ve servo hedeflerinin uygulanması.
  • Servo kütüphanesi: pin 9 ve 10’a bağlı pan/tilt motorlarının açı kontrolü.

Proje Yapısı

  • face_detection_tracking.py: görüntü alma, yüz algılama, merkez hatası hesabı ve seri komut üretimi.
  • x_y_servo/x_y_servo.ino: gelen eksen/açı bilgisini ayrıştırıp iki servoya uygulayan Arduino firmware’i.
  • Pan-Tilt.png: mekanik pan-tilt düzenini gösteren proje görseli.

Öne Çıkan Teknik Özellikler

  • Canlı kamera görüntüsünde Haar cascade tabanlı yüz algılama
  • Görüntü merkezi ile hedef merkezi arasında iki eksenli hata hesabı
  • Küçük hareketleri filtreleyen eşik ve 0,4 saniyelik komut periyodu
  • Ek bir protokol karakteri kullanmadan işaret üzerinden eksen ayrımı
  • Takip hatasını ve düzeltme yönünü gösteren gerçek zamanlı overlay

Donanım

  • Arduino
  • İki servo motor
  • USB kamera
  • Breadboard ve bağlantı kabloları
  • İki eksenli pan-tilt mekanizması

Kurulum ve Çalıştırma

Python tarafında kullanılan paketler:

pip install opencv-python pyserial

Arduino sketch’i karta yüklendikten sonra Python dosyasındaki COM3 portu ve VideoCapture(1) kamera indeksi kullanılan sisteme göre ayarlanmalı. OpenCV Haar cascade XML dosyası çalışma dizinine eklenerek uygulama başlatılabilir:

python face_detection_tracking.py

Teknik Notlar

Kod ilk algılanan yüz üzerinde çalışıyor ve for döngüsündeki break nedeniyle bir karede birden fazla hedefi takip etmiyor. Servo açıları için yazılımsal alt/üst sınır bulunmadığından uzun süreli kullanımda mekanik sınırlara göre açı kısıtlaması eklemek faydalı olur. Sabit bölme katsayıları ve gönderim periyodu ise sistemin hareket hızına göre yeniden ayarlanabilir.

Kaynak Kod

Projeyi GitHub’da inceleyin.