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

34 11.366

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.

Projeyi Satın Al

veya

Pantilt Servo Motor Setini Satın Al

Malzemeler;
  1. Arduino
  2. Pan-tilt mekanizması >> Satın Al
  3. 2 Adet Servo Motor
  4. Webcam

Devre Şeması:

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.

Bunlar da İlgini Çekebilir
Cevap bırakın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

34 Yorum
  1. Ahmet Berat

    Merhaba birden fazla kamera arasında secimi nasıl yapabilirim

  2. Nisa

    Merhaba buradaki programları kullanarak yüz takibe ek olarak yüz tanıma sistemi yapılabilir mi

  3. Hira Tosun

    Çok teşekkür ederim. Vermiş olduğunuz kodları geliştirerek yüz takip edip yakalayınca otomatik olarak Nerf ile yüze ateş eden silah tareti yaptım.

  4. Hira Tosun

    Web Cam ile Arduino arasındaki bağlantıyı ne şekilde yaptınız. Breadboard ile bağlantı mı kurdunuz yoksa USB portu ile bilgisayara mı bağlı?

  5. Ercan Şener

    Böyle bir proje için teşekkür ediyorum bu projenin 3 veya 4 eksenli olanını yapabilirmiyiz yazılıma ekleme yaparak fazladan 1 kol daha ekleyip

  6. erhan

    PLEASE FİX THE SİZE LİNE TO CONTİNUE hatası alıyorum

  7. Osman

    Merhabalar kusura bakmayın hata üstüne hata sizide yoruyorum…

    NoSuchMethodError: You may be using a library that’s incompatible with this version of Processing.

    [0x7FFFA68C5110] ANOMALY: meaningless REX prefix used
    [0x7FFFB90A4250] ANOMALY: meaningless REX prefix used

    YOU ARE RUNNING THE PROCESSING OPENCV LIBRARY PRE-RELEASED VERSION 2.0b4
    BUILDED WITH THE C++ LIBRARY VERSION 2.4.9
    CHECK FOR UPDATE @ ubaa.net/shared/processing/opencv
    opencv son sürümü yüklü bu sizin kodda değil direk opencv örnek kodlarında bile çıkıyor

    1. Sezgin GÜL

      opencv processing sürümlerine göre farklı versiyonları mevcut. yukarıda belirttiğim processing sürümüne göre opencv kütüphanesi uyumludur.

  8. Osman

    hep “please fix the size() line to continue” hatasını alıyorum araştıdım size() de parantez içinde sayı olmalıdır felan diyor szin kodda weight high var acaba kodda yanlışlık olabilirmi? yada neyi yanlış yapıyorum söylerseniz çok sevinirim

    1. Sezgin GÜL

      size( width, height ); olan yeri size( 320, 240); olarak değiştirin düzelir

      1. Osman

        Uzun zaman sonra yeniden soruyorum. yaptım ama bu sefer de beni takip etmesi yerine tam tersini yapıp beni kadrajdan çıkarmaya uğraşıyor 😀 yokmu bunun çaresi…

        1. Hira Tosun

          Ben burayı yeni keşfettiğim için yorumunuzu yeni gördüm. Eğer hala bunu yapmakla ilgiliyseniz ben de X ekseninde kameranın benden kaçması sorunuyla karşılaştım ve çözdüm. Çözüm aslında basit. Processing kodları içerisinde aşağıdaki kodları bulun.

          //Yüzün X bileşeni, ekranın ortasının solunda olup olmadığını kontrol et.
          if(Yuz_X_Orta_Konumu = 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 = 5)Servo_Pan_Pozisyon -= Adim_Derecesi; //Servoyu sola hareket ettirmek için pan açısını birer derece azalt.

          2)
          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.

          Eğer kamera sizden Y ekseninde kaçıyorsa aynı şekilde "servoyu yukarı/aşağı hareket ettir" açıklaması ile verilmiş kodların yerini değiştirin. Bu işlem hatanızı düzeltebilmeniz için yeterli olacaktır.
          Kolay gelsin.

      2. erhan

        yaptım ama hala aynı

  9. 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

    1. salih

      arduinonun içine neden atıyorsun o processing kütüphanesi

  10. 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

  11. 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.

  12. 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

      1. adem

        hocam ben sorun yaşıyorum herşeyi yapmama rağmen ERROR: [ofxOpenCV] the haar classifier cascade file hatası alıyorum

  13. 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.

      1. erhan

        hep “please fix the size() line to continue” hatasını alıyorum araştıdım size() de parantez içinde sayı olmalıdır felan diyor szin kodda weight high var acaba kodda yanlışlık olabilirmi? yada neyi yanlış yapıyorum söylerseniz çok sevinirim

  14. 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” );

  15. 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

  16. Sarp

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

    1. Sezgin GÜL

      Matlab ile takip eden proje var buradan bakabilirsin >> http://www.robimek.com/matlab-arduino-nesne-takip-robotu-yapimi/
      Processing ile olan versiyonu da yakın zamanda paylaşacağım.

  17. 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.