Processing OpenCV ile Yüzünüzü Takip Eden PanTilt Kamera Projesi

18 1.885

Opencv kütüphanesi sayesinde, kamera sistemleri akıllı hale gelmektedir. Bu projede de processing opencv kullanarak yüz algılama yapıp, arduino üzerinden pantilt mekanizmasını hareketi ile kameranın yüzü takip etmesini sağlayacağız.

Malzemeler;

  1. Arduino
  2. Pan-tilt mekanizması
  3. 2 Adet Servo Motor
  4. Webcam

Devre Şeması:

Pan-Tilt mekanizmasını 3d yazıcıdan çıkarmak isterseniz thingiverse’de pantilt stl dosyası mevcut.

Arduino Kodu:

#include <Servo.h> 

char tilt_kimlik=0, pan_kimlik=1;
char val;
Servo panservo;
Servo tiltservo;
int pan_pin = 8,tilt_pin = 9;
char pan,tilt;
int pan_derece, tilt_derece;
void setup(){
Serial.begin(57600);
panservo.attach(pan_pin);
tiltservo.attach(tilt_pin);
panservo.write(90);
tiltservo.write(90);
}

void loop(){
 while(Serial.available() <=0); //Seri bağlantı noktasında bir karakter bekle.
 val = Serial.read(); //Seri bağlantı noktasından karakteri değişkene kopyala
 if(val == tilt_kimlik){ //Karakterin tilt servo kimliği olup olmadığını kontrol et
 while(Serial.available() <=0); //Seri bağlantı noktasından ikinci komut baytını bekle.
 tilt_derece=Serial.read();//Seri bağlantı noktasından karakteri değişkene kopyala
 tiltservo.write(tilt_derece); //Tilt servo konumunu, seri porttan alınan ikinci komut baytının değerine ayarla.
 }
 else if(val == pan_kimlik){ //İlk seri karakterin pan servo için servo kimliği olup olmadığını kontrol et.
 while(Serial.available() <= 0); //Seri bağlantı noktasından ikinci komut baytını bekle.
 pan_derece=Serial.read(); //Seri bağlantı noktasından karakteri değişkene kopyala
 panservo.write(pan_derece); //Pan servo konumunu, seri porttan alınan ikinci komut baytının değerine ayarla.
 }
 
}

Processing Kodu:

import hypermedia.video.*; //Web kamerasından görüntü yakalamak için video kütüphanesi
import java.awt.Rectangle; //Yüz koordinatlarını takip eden dikdörtgen sınıfı.
import processing.serial.*; //Arduino ile iletişim kurmak için bağlantı kütüphanesi

OpenCV opencv; //Bir OpenCV nesnesi oluşturulur

//Ekran Boyutu Parametreleri
int width = 320;
int height = 240;

// Kontrast / parlaklık değerleri
int Kontrast_degeri = 0;
int Parlaklik_degeri = 0;

Serial port; // Seri bağlantı noktası

//Mevcut servo konumlarını takip etmek için değişkenler.
char Servo_Tilt_Pozisyon = 90;
char Servo_Pan_Pozisyon = 90;
//Arduino seri komut arabirimi için pan / tilt servo kimlikleri.
char Tilt_Servo_Kimlik = 0;
char Pan_Servo_Kimlik = 1;

//Bu değişkenler, algılanan yüzün ortası için x ve y konumunu tutar.
int Yuz_Y_Orta_Konumu=0;
int Yuz_X_Orta_Konumu=0;

//Ekranın ortasına karşılık gelen değişkenler 
// bu değişkenler midFace değerleriyle karşılaştırılacaktır
int Ekran_Y_Orta_Konumu = (height/2);
int Ekran_X_Orta_Konumu = (width/2);
int Orta_Ekran_Penceresi = 10; //Ekranın ortası için kabul edilebilir hata değeri

//Pozisyonu güncelleştirdiğimiz her sefer servoya uygulanacak değişim derecesi.
int Adim_Derecesi=1;

void setup() {
 //Ekran için bir pencere oluşturur
 size( width, height );

 opencv = new OpenCV( this );
 opencv.capture( width, height ); // Açık video akışı
 
//ön yüz tespiti: haarcascade_frontalface_alt.xml dosyası için aşağıdaki gibi sizdeki dosya konumunu yazın.
opencv.cascade( "C:/Users/sezgin/Documents/Processing/libraries/opencv/haarcascades/haarcascade_frontalface_alt.xml" );

 //Port noktası ve iletişim hızı seçimi
 port = new Serial(this,"COM1", 57600); 

 println( "Kontrastı değiştirmek için bu ekran penceresinin içinde X ekseni üzerine fareyi sürükleyin." );
 println( "Parlaklığı değiştirmek için bu ekran penceresinin içinde Y ekseni üzerine fareyi sürükleyin." );
 
 //Cihazı düz ileri bakacak şekilde ayarlamak için 90 derecede pan / tilt açısını Arduino'ya gönderir.
 port.write(Tilt_Servo_Kimlik); //Send the Tilt Servo ID
 port.write(Servo_Tilt_Pozisyon); //Send the Tilt Position (currently 90 degrees)
 port.write(Pan_Servo_Kimlik); //Send the Pan Servo ID
 port.write(Servo_Pan_Pozisyon); //Send the Pan Position (currently 90 degrees)
}


public void stop() {
 opencv.stop();
 super.stop();
}



void draw() {
// yeni bir çerçeve yakalar
 opencv.read();
 //griye dönüştürür
 opencv.convert( GRAY );
 opencv.contrast( Kontrast_degeri );
 opencv.brightness( Parlaklik_degeri );

 // Işleme devam et
 Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 );

 // Resmi görüntüle
 image( opencv.image(), 0, 0 );

 // Yüz bölgesi çizer
 noFill();
 stroke(255,0,0);
 for( int i=0; i<faces.length; i++ ) {
 rect( faces[i].x, faces[i].y, faces[i].width, faces[i].height );
 }
 
 //Herhangi bir yüz tespit edilmi kontrol et.
 if(faces.length > 0){
 // Bir yüz bulunursa, çerçevedeki ilk yüzün orta noktasını bulun.
 // Buradaki .x ve .y kooordinatları dikdörtgenin sol üst köşesine karşılık gelir,
 // Böylece dikdörtgenin orta noktasını bulmak için bu değerleri işlenir.
 Yuz_Y_Orta_Konumu = faces[0].y + (faces[0].height/2);
 Yuz_X_Orta_Konumu = faces[0].x + (faces[0].width/2);
 
 //Yüzdeki Y bileşeninin ekranın ortasından aşağıda olup olmadığını kontrol et.
 if(Yuz_Y_Orta_Konumu < (Ekran_Y_Orta_Konumu - Orta_Ekran_Penceresi)){
 if(Servo_Tilt_Pozisyon >= 5)Servo_Tilt_Pozisyon -= Adim_Derecesi; // Ekranın ortasındaysa, tilt servosunu indirmek için tiit açısını birer derece azalt.
 }
 //Yüzdeki Y bileşeninin ekranın ortasından yukarıda olup olmadığını kontrol et.
 else if(Yuz_Y_Orta_Konumu > (Ekran_Y_Orta_Konumu + Orta_Ekran_Penceresi)){
 if(Servo_Tilt_Pozisyon <= 175)Servo_Tilt_Pozisyon +=Adim_Derecesi; //Tilt servo açısını birer derece arttır.
 }
 //Yüzün X bileşeni, ekranın ortasının solunda olup olmadığını kontrol et.
 if(Yuz_X_Orta_Konumu < (Ekran_X_Orta_Konumu - Orta_Ekran_Penceresi)){
 if(Servo_Pan_Pozisyon >= 5)Servo_Pan_Pozisyon -= Adim_Derecesi; //Servoyu sola hareket ettirmek için pan açısını birer derece azalt.
 }
 //Yüzdeki X bileşeninin ekranın sağında olup olmadığını kontrol et.
 else if(Yuz_X_Orta_Konumu > (Ekran_X_Orta_Konumu + Orta_Ekran_Penceresi)){
 if(Servo_Pan_Pozisyon <= 175)Servo_Pan_Pozisyon +=Adim_Derecesi; //Servoyu sağa hareket ettirmek için pan açısını birer derece arttır.
 }
 
 }
 //Arduino'ya servo kimlik ve açılarını gönder
 port.write(Tilt_Servo_Kimlik); 
 port.write(Servo_Tilt_Pozisyon); 
 port.write(Pan_Servo_Kimlik); 
 port.write(Servo_Pan_Pozisyon); 

 delay(1);
}



/**
 * Ekrarnın Kontrast / parlaklık değerlerini değiştirir
 */
void mouseDragged() {
 Kontrast_degeri = (int) map( mouseX, 0, width, -128, 128 );
 Parlaklik_degeri = (int) map( mouseY, 0, width, -128, 128 );
}

 

 

Processing Opencv Ayarları

Proje aşağıdaki sürümler için sorunsuz çalışmaktadır.

  • Processing 2.2.1 sürümünü indirelim.

  • Opencv kütüphanesi linki>>

    http://ubaa.net/shared/processing/opencv/download/2.0/opencv_2.0b4.zip

  • İndirdiğiniz kütüphaneyi processing programının sketchbook konumundaki library klasörüne atınız. Sketchbook konumunu processing programından File >> Preferences sekmesinden öğrenebilirsiniz.

  • Processing kod kısmındaki şu satırı bulun.

opencv.cascade( "C:/Users/sezgin/Documents/Processing/libraries/opencv/haarcascades/haarcascade_frontalface_alt.xml" );

Burada “haarcascade_frontalface_alt.xml” dosya yolunu göstermeniz gerekiyor. Sizdeki dosya konumunu yukarıdaki yere yazınız.

Son olarak port = new Serial(this,”COM1″, 57600);  satırındaki com numarasına arduinonun bağlı olduğu port numarasını yazınız.

Bütün ayarları yaptıktan sonra arduinoyu bilgisayara takın. Arduino kodunu yükledikten sonra Processing programını çalıştırdığınızda kameranın yüzünüzü algıladığını göreceksiniz. Ekranda fareyi sağa sola ve yukarı aşağı hareket ettirerek, alınan görüntünün Kontrastını ve parlaklığını ayarlayıp, yüzünüzü daha doğru şekilde algılamasını sağlayabilirsiniz.

Kaynak: Face Tracking with a Pan/Tilt

Bunları da beğenebilirsin

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

18 Yorum

  1. Mustafa

    Sezgin Bey uygulamanız güzel
    ama ben yaptım hata aldım karekter hatası sizin
    dediginiz gibi yaptın
    opencv.cascade( “C:\Users\Robot\Desktop\arduino-1.6.9-windows\arduino-1.6.9\libraries\opencv\haarcascades\haarcascade_frontalface_alt” ); degiştirdim yolları
    ve şöyle hata aldım

    processing.app.SketchException: unexpected char: ‘U’
    at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:386)
    at processing.mode.java.JavaBuild.preprocess(JavaBuild.java:192)
    at processing.mode.java.JavaBuild.build(JavaBuild.java:151)
    at processing.mode.java.JavaBuild.build(JavaBuild.java:130)
    at processing.mode.java.JavaMode.handleRun(JavaMode.java:120)
    at processing.mode.java.JavaEditor$23.run(JavaEditor.java:697)
    at java.lang.Thread.run(Unknown Source)

    sizin dediginiz sürümü indirip yaptım

  2. efe

    merhaba sezgin bey ( the package ‘ ‘gab” does not exist. you might b emissing a library.) hatası alıyorum kütüphaneyi dediğiniz gibi attım sorun ne olabilir acaba

  3. saygın

    Sezgin Bey,
    Projeniz ve paylaşımnız için teşekkür ederim.
    Daha denemedim. Malzeme temni yapıp temin edeceğim.
    Videoyu SD karta yazmak mümkün mu?
    Mümkünse nasıl yapabiliriz?
    Teşekkür ediyorum.

  4. ahmet

    hocam ne yaptıysam uygulamayı çalıştıramadım sürekli hatalar aldım ama gerçekten çok beğendiğim bi uygulama bizimle paylaştığınız için çok teşekkür ederim

    1. Sezgin GÜL

      istersen facebook tan bana ulaş TeamViewer üzerinden bağlanayım

  5. efe

    merhaba sezgin bey rica etsem Processing save dosyasını verebilirmisiniz kopala yapıştır yaptığım zaman hata alıyorum

    1. Sezgin GÜL

      Buradan indirebilirsiniz >> http://www.robimek.com/wp-content/uploads/processing_pantilt.zip
      Kodda aşağıdaki kısmı bulun
      opencv.cascade(“C:/Users/sezgin/Documents/Processing/libraries/opencv/haarcascades/haarcascade_frontalface_alt.xml” );
      Burada haarcascade_frontalface_alt.xml dosyasını gösteren dosya yolunu sizin pc ye göre değiştirin.

  6. ahmet

    hocam merhaba öncelikle gerçekten çok başarılı ve güzel proje bizimle paylaştığınız için teşekkür ederim benim sorum open cv kütüphanesini library klasörüne atmama rağman library hatası vermekt yardımcı olursanız teşekkür ederim

    1. Sezgin GÜL

      Yukarıda yazdığım processing sürümü ve link verdiğim opencv kütüphanesini indirerek deneyiniz.

      1. ahmet

        evet hocam sizin verdiğiniz kütüphane ve sürüm de aynı rica etsem kütüphane eklemeyi tarif edermisiniz yanlış yapıyo olabilirim

        1. Sezgin GÜL

          Bilgisayarın belgeler klasörüne girin. orada processing >> libraries klasörünü açın. indirdiğiniz kütüphaneyi buraya atın. Programı yeniden başlatın ve kodu çalıştırın.

          1. ahmet

            hocam benim bigisayırım 32 bit ondan kaynaklanıyor olabilir mi

          2. Sezgin GÜL

            Olabilir fakat bu sürümde bit ayrımı yok sanırım. Bir de eski sürümde deneyin. Aşağıdaki linkten indirebilirsiniz. ubaa.net/shared/processing/opencv/download/01/opencv_01.zip

            Sorun şundan da kaynaklı olabilir.Bilgisyarınızda bundan başka processing sürümü de var ise veya önceden silmişseniz o programın çalışma klasörü ile bu sürümün klasörü çakışıyordur. Bu sorunu ortadan kaldırmak için processing den file >> prefences menüsünü açın. Burada sketchbook location yazan yerde kütüphanenin konumu var.Oradaki Processing yazan yeri farklı bir isim vererek değiştirin.Daha sonra belgelerim klasörüne gelin ve yeni isim verdiğiniz klasörün oluştuğunu göreceksiniz. Aynı şekilde kütüphaneyi bu klasördeki library konumuna ekleyip tekrar deneyin.
            Ayrıca koddaki aşağıdaki kısımda dosya adresini sizin pc nize göre değiştirmelisiniz.
            opencv.cascade( “C:/Users/sezgin/Documents/Processing/libraries/opencv/haarcascades/haarcascade_frontalface_alt.xml” );

  7. Serkan Uz

    Öncelikle paylaşım ve emeğinize teşekkürler. Güvenlik amaçlı projeler dışında birçok farklı projede kullanılabilecek çok güzel bir uygulama.
    Bu uygulamada bilgisayar yerine raspberry pi kullanırsak özellikle hangi noktalara dikkat etmemiz gerekir. Raspberry pi üzerine kamera modülü takarak harici bağladığım ekranda görüntü alabiliyorum. Saygılarımla

  8. Sarp

    Hocam acaba bu programın yüzü değil de topu takip eden bir versiyonu var mıdır?

  9. Ahmet

    Merhabalar,
    Ben processing programını çalıştırmak istedim fakat hypermedia.video isimli library bulunmadı diyor. İnternette baktım biraz ama bulamadım. Bu sorunu nasıl halledebilir acaba. Şimdiden çok teşekkür ediyorum

    1. Sezgin GÜL

      merhabalar, Opencv kütüphanesini eklemediğiniz için kaynaklanmış . yukarıda opencv kütüphane linkini verdim. Onu indirin zip ten çıkartın ve olduğu gibi processing library klasörüne atın. Processing 2.2.1 sürümünde çalıştırın.