В этом посте мы узнаем, как извлечь лица из изображения с веб-камеры. Мы будем использовать две библиотеки: Sarxos и Openimaj.
Вот наша зависимость 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);
}
Как это устроено:
-
Используйте библиотеку Sarxos для веб-камеры здесь.
-
Создайте объект веб-камеры и установите размер изображения.
-
Откройте веб-камеру, используя
open
метод. -
Возьмите изображение с веб-камеры и сохраните его в
BufferedImage
объекте с именемimg
. -
Закройте веб-камеру и передайте изображение, полученное в
ImagePanel
классе, которое затем будет добавленоFrame
. -
Покажите пользователю кадр с изображением веб-камеры, которое будет обработано.
Использование библиотеки 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);
}
Как это устроено:
-
Используйте библиотеку Ppenimaj для обнаружения лица.
-
Создайте новый
Frame
, который покажет результаты. -
Используйте
detectFaces
методHaarCascadeDetector
детектора объектов класса, передавая изображение для обработки.ImageUtilities
используется для созданияFImage
изBufferedImage
. -
Если на изображении не найдено лицо, возвращается сообщение об ошибке.
-
В противном случае выполните итерацию по каждой грани и извлеките грани, используя
getFacePatch
метод. -
Используйте
createBufferedImage
методImageUtilities
класса снова — на этот раз, чтобы выйтиBufferedImage
изFImage
. -
Добавьте все грани к полученному кадру.
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);
}
}
Как это устроено:
-
Это используется для отображения изображения на панели.
Вывод:
Полная программа
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);
}
}
Надеюсь, это поможет!