使用java cv进行面部识别

时间:2014-12-13 13:54:01

标签: java opencv

我正在尝试使用java中的open cv创建面部识别应用程序,但我只是设法调用网络摄像头并执行面部检测。我无法进行面部识别,即将数据库中的面部与网络摄像头中捕获的面部进行比较。这是代码:

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;  
     }  
}  

这是主要课程:

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 
}

0 个答案:

没有答案
相关问题