Click here to Skip to main content
15,891,248 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
Java
package com.gordon.trial;

import java.awt.*;  

import java.awt.image.BufferedImage;  
import java.io.ByteArrayInputStream;  
import java.io.IOException;  
import javax.imageio.ImageIO;  
import javax.swing.*;  
import org.opencv.core.Core;  
import org.opencv.core.Mat;  
import org.opencv.core.MatOfByte;  
import org.opencv.core.MatOfRect;  
import org.opencv.core.Point;  
import org.opencv.core.Rect;  
import org.opencv.core.Scalar;  
import org.opencv.core.Size;  
import org.opencv.highgui.Highgui;  
import org.opencv.highgui.VideoCapture;  
import org.opencv.imgproc.Imgproc;  
import org.opencv.objdetect.CascadeClassifier;  

class FacePanel extends JPanel{  
     private static final long serialVersionUID = 1L;  
     private BufferedImage image;  
     // Create a constructor method  
     public FacePanel(){  
          super();   
     }  
     /*  
      * Converts/writes a Mat into a BufferedImage.  
      *   
      * @param matrix Mat of type CV_8UC3 or CV_8UC1  
      * @return BufferedImage of type TYPE_3BYTE_BGR or TYPE_BYTE_GRAY  
      */       
     public boolean matToBufferedImage(Mat matrix) {  
          MatOfByte mb=new MatOfByte();  
          Highgui.imencode(".jpg", matrix, mb);  
          try {  
               this.image = ImageIO.read(new ByteArrayInputStream(mb.toArray()));  
          } catch (IOException e) {  
               e.printStackTrace();  
               return false; // Error  
          }  
       return true; // Successful  
     }  
     public void paintComponent(Graphics g){  
          super.paintComponent(g);   
          if (this.image==null) return;         
           g.drawImage(this.image,10,10,this.image.getWidth(),this.image.getHeight(), null);
     }

}  
class FaceDetector {  
     private CascadeClassifier face_cascade;  
     // Create a constructor method  
     public FaceDetector(){  
         // face_cascade=new CascadeClassifier("./cascades/lbpcascade_frontalface_alt.xml");  

         //..didn't have not much luck with the lbp

//./cascades/haarcascade_frontalface_alt.xml
        face_cascade=new CascadeClassifier("C://opencv//build//java//haarcascade_frontalface_alt.xml"); 
          if(face_cascade.empty())  
          {  
               System.out.println("--(!)Error loading A\n");  
                return;  
          }  
          else  
          {  
                     System.out.println("Face classifier loooaaaaaded up");  
          }  
     }  
     public Mat detect(Mat inputframe){  
          Mat mRgba=new Mat();  
          Mat mGrey=new Mat();  
          MatOfRect faces = new MatOfRect();  
          inputframe.copyTo(mRgba);  
          inputframe.copyTo(mGrey);  
          Imgproc.cvtColor( mRgba, mGrey, Imgproc.COLOR_BGR2GRAY);  
          Imgproc.equalizeHist( mGrey, mGrey );  
          face_cascade.detectMultiScale(mGrey, faces);  
          System.out.println(String.format("Detected %s faces", faces.toArray().length));  
          for(Rect rect:faces.toArray())  
          {  
               Point center= new Point(rect.x + rect.width*0.5, rect.y + rect.height*0.5 );  
               //draw a blue eclipse around face

             //  Size s = new Size( rect.width*0.5, rect.height*0.5), 0, 0, 360, new Scalar( 0, 0, 255 )

               // Core.ellipse( mRgba, center,s , 4, 8, 0 );  
          }  
          return mRgba;  
     }  
}  

This is the main class:
Java
package com.gordon.trial;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.VideoCapture;

public class Main {
    public static void main(String arg[]) throws InterruptedException{  
          // Load the native library.  
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
          //or ...     System.loadLibrary("opencv_java244");       

          //make the JFrame
          JFrame frame = new JFrame("WebCam Capture - Face detection");  
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

          FaceDetector faceDetector=new FaceDetector();  
          FacePanel facePanel = new FacePanel();  
          frame.setSize(400,400); //give the frame some arbitrary size 
          frame.setBackground(Color.BLUE);
          frame.add(facePanel,BorderLayout.CENTER);       
          frame.setVisible(true);       

          //Open and Read from the video stream  
           Mat webcam_image=new Mat();  
           VideoCapture webCam =new VideoCapture(0);   

            if( webCam.isOpened())  
              {  
               Thread.sleep(500); /// This one-time delay allows the Webcam to initialize itself  
               while( true )  
               {  
                 webCam.read(webcam_image);  
                 if( !webcam_image.empty() )  
                  {   
                      Thread.sleep(200); /// This delay eases the computational load .. with little performance leakage
                       frame.setSize(webcam_image.width()+40,webcam_image.height()+60);  
                       //Apply the classifier to the captured image  
                       webcam_image=faceDetector.detect(webcam_image);  
                      //Display the image  
                       facePanel.matToBufferedImage(webcam_image);  
                       facePanel.repaint();   
                  }  
                  else  
                  {   
                       System.out.println(" --(!) No captured frame from webcam !");   
                       break;   
                  }  
                 }  
                }
               webCam.release(); //release the webcam

          } //end main 
}
Posted
Updated 13-Dec-14 5:23am
v3
Comments
Sergey Alexandrovich Kryukov 14-Dec-14 20:56pm    
What is the purpose and the comparison criteria? What is your problem?
—SA

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900