OpenCV Java Yüz Tespiti – Haar Cascade Classifier

OpenCV Yüz Tanıma – Haar cascade classifier

(Proje kaynak kodunu indirmek için tıklayın)

OpenCV Nesne Tespiti(Yüz ve Göz Tespiti Örneği)


Opencv kurulumu ve bazı örnekleri daha önce yapmıştık aynı kategorideki (Opencv) diğer yazılara göz atabilirsiniz.

Bu yazıda opencv ve java kullanarak bir resim üzerindeki insan yüzlerini nasıl tespit edebileceğimizi göreceğiz.İki farklı şekilde çalışabilmektedir ilk olarak web kamera üzerinden alınan fotoğrafdaki insan yüzlerini tespit edebiliyor yada yolunu verdiğiniz bir resim üzerindeki yüzleri tespit edebilmektedir.Tanımlanan yüz bir kare içerisine alınarak yeni bir resim dosyası olarak çalışma dizinine kaydedilmektedir.

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;
//genereted by mesut-pc
public class FaceDetector{
 
    public static void main(String[] args) {
 
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
        //bu xml ile ilgili detaylı bilgiyi dosya içerisinde okuyabilirsiniz
        CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("Face.xml").getPath());
       
        //Bir resim dosyası üzerindeki yüzleri yakalamak için
        Mat image = Highgui.imread(FaceDetector.class.getResource("kemalsunal.jpg").getPath());
       
     /*        
        //Web kamerası ile yüzleri yakalamak için VideoCapture kullanılabilir 
        //0 varsayılan kameradır 1,2,3,4 ... sistemdeki diğer kameralardır
         * Mat image=new Mat();
         *VideoCapture videoCapture=new VideoCapture(0);
         *videoCapture.read(image);
     */
        MatOfRect faceDetections = new MatOfRect();
        //image nesnemiz taranacak resmimizdir
        faceDetector.detectMultiScale(image, faceDetections);
        //faceDetections yakalanan yüzleri barındırmaktadır bunu array olarak aldığımızda kaç adet yüz belirlenmiş bulabiliriz
        System.out.println(String.format("Sahnede %s yüz tespit edildi", faceDetections.toArray().length));
        
        //Yakalanan yüzler içerisinde döner
        for (Rect rect : faceDetections.toArray()) {
        	//rect yakalanan yüzü tutmaktadır bu yüzün koordinatlarınıda alarak  Core.rectangle ile bir kare çizer
 	
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }
        
        //imwirte ile bir resim dosyası yazıyoruz yüzler belirlendi ise yeni dosyamız orjinalinden farklı olacaktır
        Highgui.imwrite("yeniresim.png", image);
        System.out.println("Çalışma tamamlandı");
    }
    
    
}

İlk resim kemalsunal.jpg olarak verdiğimiz resim dosyası,uygulamanın çalıştırılmasının ardından yeniresim.png (2.resim) olarak çalışma dizinine kaydedilmektedir.

 

Ek olarak yukarıda işlemlerimizi bir defa yaptık,yani uygulama başlıyor kamerada yüz var ise tespit edip işaretleyip kaydediyor,ek olarak sadece yüz tanımlandığında kaydedilsin ve yüz tanıma sürekli devam etsin istiyorsanız bir döngüye alabiliriz.Son olarak ise yukarıdaki örnekte yüz algılandıktan sonra kare içerisine alıp kaydediyorduk ,peki sadece yüzü nasıl kaydederiz yani yüzü kare içerisine almak yerine yüzü resimden kessek ve ayrı kaydetsek nasıl olur,bunun için aşağıdaki gibi bir uygulama yapabilirsiniz,kestiğiniz yüzü daha sonra yüz tanıma yapmak isterseniz  kalıp olarak kulllanabilirsiniz.

 

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;
 
public class FaceDetector{
 
    public static void main(String[] args) {
    	int facesNumber=0;
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
      
        CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("Face.xml").getPath());
       
        //Bir resim dosyası üzerindeki yüzleri yakalamak için
        //Mat image = Highgui.imread(FaceDetector.class.getResource("kemalsunal.jpg").getPath());
     
        //Web kamerası ile yüzleri yakalamak için VideoCapture kullanılabilir      
         Mat image=new Mat();
         VideoCapture videoCapture=new VideoCapture(1);
         while(true)
         {
         
     	 MatOfRect faceDetections = new MatOfRect();
     	
       do {
    	   //Sahnedeki yüz sayısı 0 olduğunda sürekli kamerayı tarar
    	   videoCapture.read(image);
           faceDetector.detectMultiScale(image, faceDetections);          
           //faceDetections yakalanan yüzleri barındırmaktadır bunu array olarak aldığımızda kaç adet yüz belirlenmiş bulabiliriz
           System.out.println(String.format("Sahnede %s yüz tespit edildi", faceDetections.toArray().length));
           facesNumber=Integer.valueOf(faceDetections.toArray().length);
	   } while (facesNumber==0);
         Rect cropRect=null;
       //Yakalanan yüzler içerisinde döner
        for (Rect rect : faceDetections.toArray()) {
        	//Resmin etrafına kare çizer
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
            //Algılanan yüzü keserek cropRect nesnesine atar
            cropRect=new Rect(rect.x, rect.y, rect.width, rect.height);
            
        }
        
        //Resimden yüz kesilerek bu mat nesnesindedir,image ise orjinal resmi ve kareyi tutan nesnedir
        Mat image_roi = new Mat(image,cropRect);       
        Highgui.imwrite(System.currentTimeMillis()+"yüz.png", image_roi);
        System.out.println("Yüz tanımlama tamamlandı.");
        
         }
    }
    
    
}