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.
veya
Pantilt Servo Motor Setini Satın Al
Malzemeler;
-
Arduino
-
Pan-tilt mekanizması >> Satın Al
-
2 Adet Servo Motor
-
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.
Merhaba birden fazla kamera arasında secimi nasıl yapabilirim
Merhaba buradaki programları kullanarak yüz takibe ek olarak yüz tanıma sistemi yapılabilir mi
Ç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.
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ı?
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
PLEASE FİX THE SİZE LİNE TO CONTİNUE hatası alıyorum
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
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.
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
size( width, height ); olan yeri size( 320, 240); olarak değiştirin düzelir
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…
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.
yaptım ama hala aynı
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
arduinonun içine neden atıyorsun o processing kütüphanesi
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
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.
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
istersen facebook tan bana ulaş TeamViewer üzerinden bağlanayım
hocam ben sorun yaşıyorum herşeyi yapmama rağmen ERROR: [ofxOpenCV] the haar classifier cascade file hatası alıyorum
merhaba sezgin bey rica etsem Processing save dosyasını verebilirmisiniz kopala yapıştır yaptığım zaman hata alıyorum
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.
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
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
Yukarıda yazdığım processing sürümü ve link verdiğim opencv kütüphanesini indirerek deneyiniz.
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
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.
hocam benim bigisayırım 32 bit ondan kaynaklanıyor olabilir mi
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” );
Ö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
Hocam acaba bu programın yüzü değil de topu takip eden bir versiyonu var mıdır?
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.
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
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.