Статьи

Распознавание лиц с использованием Java

В этом посте мы узнаем, как извлечь лица из изображения с веб-камеры. Мы будем использовать две библиотеки: Sarxos и Openimaj.

  • Используемый язык : Java

  • Используемая программаFaceDetector.java  

  • Git РЕПО : Ссылка

  • Сайт : Ссылка 

Вот наша зависимость POM: 

<dependency>
	<groupId>org.openimaj</groupId>
	<artifactId>image-feature-extraction</artifactId>
	<version>1.3.5</version>
</dependency>
<dependency>
	<artifactId>faces</artifactId>
	<groupId>org.openimaj</groupId>
	<version>1.3.5</version>
	<scope>compile</scope>
</dependency>
<dependency>
	<groupId>com.github.sarxos</groupId>
	<artifactId>webcam-capture</artifactId>
	<version>0.3.11</version>
	<scope>test</scope>
</dependency>  

Это наши переменные:

      private static final long serialVersionUID = 1L;  
      private static final HaarCascadeDetector detector = new HaarCascadeDetector();  
      private Webcam webcam = null;  
      private BufferedImage img= null;  
      private List<DetectedFace> faces = null;  

Основной метод:

 public static void main(String[] args) throws IOException {
  new FaceDetector().detectFace();
 }

Использование библиотеки Sarxos

Мы создаем объект с FaceDetector классом, который классирует конструктор по умолчанию. Затем мы вызываем detectFace метод этого класса.

FaceDetector конструктор:

      public FaceDetector() throws IOException {
       webcam = Webcam.getDefault();
       webcam.setViewSize(WebcamResolution.VGA.getSize());
       webcam.open(true);
       img = webcam.getImage();
       webcam.close();
       ImagePanel panel = new ImagePanel(img);
       panel.setPreferredSize(WebcamResolution.VGA.getSize());
       add(panel);
       setTitle("Face Recognizer");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       pack();
       setLocationRelativeTo(null);
       setVisible(true);
      }

Как это устроено:

  1. Используйте библиотеку Sarxos для веб-камеры здесь.

  2. Создайте объект веб-камеры и установите размер изображения.

  3. Откройте веб-камеру, используя open метод.

  4. Возьмите изображение с веб-камеры и сохраните его в BufferedImage объекте с именем  img.

  5. Закройте веб-камеру и передайте изображение, полученное в  ImagePanel классе, которое затем будет добавлено Frame.

  6. Покажите пользователю кадр с изображением веб-камеры, которое будет обработано.

Использование библиотеки Openimaj

detectFace метод:

      public void detectFace() {
       JFrame fr = new JFrame("Discovered Faces");
       faces = detector.detectFaces(ImageUtilities.createFImage(img));
       if (faces == null) {
        System.out.println("No faces found in the captured image");
        return;
       }
       Iterator < DetectedFace > dfi = faces.iterator();
       while (dfi.hasNext()) {
        DetectedFace face = dfi.next();
        FImage image1 = face.getFacePatch();
        ImagePanel p = new ImagePanel(ImageUtilities.createBufferedImage(image1));
        fr.add(p);
       }
       fr.setLayout(new FlowLayout(0));
       fr.setSize(500, 500);
       fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       fr.setVisible(true);
      }

Как это устроено:

  1. Используйте библиотеку Ppenimaj для обнаружения лица.

  2. Создайте новый Frame , который покажет результаты.

  3. Используйте  detectFaces метод  HaarCascadeDetector детектора объектов класса, передавая изображение для обработки. ImageUtilities используется для создания FImage из BufferedImage.

  4. Если на изображении не найдено лицо, возвращается сообщение об ошибке.

  5. В противном случае выполните итерацию по каждой грани и извлеките грани, используя  getFacePatch метод.

  6. Используйте createBufferedImage метод ImageUtilities класса снова — на этот раз, чтобы выйти BufferedImage из FImage.

  7. Добавьте все грани к полученному кадру.

ImagePanel Учебный класс:

 package com.cooltrickshome;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Image;
 import javax.swing.ImageIcon;
 import javax.swing.JPanel;
 class ImagePanel
 extends JPanel {
  private Image img;
  public ImagePanel(String img) {
   this(new ImageIcon(img).getImage());
  }
  public ImagePanel(Image img) {
   this.img = img;
   Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
   setPreferredSize(size);
   setMinimumSize(size);
   setMaximumSize(size);
   setSize(size);
   setLayout(null);
  }
  public void paintComponent(Graphics g) {
   g.drawImage(this.img, 0, 0, null);
  }
 }

Как это устроено:

  1. Это используется для отображения изображения на панели.

Вывод:

Полная программа

FaceDetector.java:

 package com.cooltrickshome;
 /**  
  * Reference:  
  * https://github.com/sarxos/webcam-capture/tree/master/webcam-capture-examples/webcam-capture-detect-face  
  * http://openimaj.org/  
  */
 import java.awt.FlowLayout;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 import javax.swing.JFrame;
 import org.openimaj.image.FImage;
 import org.openimaj.image.ImageUtilities;
 import org.openimaj.image.processing.face.detection.DetectedFace;
 import org.openimaj.image.processing.face.detection.HaarCascadeDetector;
 import com.github.sarxos.webcam.Webcam;
 import com.github.sarxos.webcam.WebcamResolution;
 public class FaceDetector extends JFrame {
  private static final long serialVersionUID = 1 L;
  private static final HaarCascadeDetector detector = new HaarCascadeDetector();
  private Webcam webcam = null;
  private BufferedImage img = null;
  private List < DetectedFace > faces = null;
  public FaceDetector() throws IOException {
   webcam = Webcam.getDefault();
   webcam.setViewSize(WebcamResolution.VGA.getSize());
   webcam.open(true);
   img = webcam.getImage();
   webcam.close();
   ImagePanel panel = new ImagePanel(img);
   panel.setPreferredSize(WebcamResolution.VGA.getSize());
   add(panel);
   setTitle("Face Recognizer");
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   pack();
   setLocationRelativeTo(null);
   setVisible(true);
  }
  public void detectFace() {
   JFrame fr = new JFrame("Discovered Faces");
   faces = detector.detectFaces(ImageUtilities.createFImage(img));
   if (faces == null) {
    System.out.println("No faces found in the captured image");
    return;
   }
   Iterator < DetectedFace > dfi = faces.iterator();
   while (dfi.hasNext()) {
    DetectedFace face = dfi.next();
    FImage image1 = face.getFacePatch();
    ImagePanel p = new ImagePanel(ImageUtilities.createBufferedImage(image1));
    fr.add(p);
   }
   fr.setLayout(new FlowLayout(0));
   fr.setSize(500, 500);
   fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   fr.setVisible(true);
  }
  public static void main(String[] args) throws IOException {
   new FaceDetector().detectFace();
  }
 }

ImagePanel.java:

 package com.cooltrickshome;
 import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Image;
 import javax.swing.ImageIcon;
 import javax.swing.JPanel;
 class ImagePanel
 extends JPanel {
  private Image img;
  public ImagePanel(String img) {
   this(new ImageIcon(img).getImage());
  }
  public ImagePanel(Image img) {
   this.img = img;
   Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
   setPreferredSize(size);
   setMinimumSize(size);
   setMaximumSize(size);
   setSize(size);
   setLayout(null);
  }
  public void paintComponent(Graphics g) {
   g.drawImage(this.img, 0, 0, null);
  }
 }

Надеюсь, это поможет!

Ссылки