OpenCV - Detección de rostro en una imagen

los VideoCapture clase de la org.opencv.videoioEl paquete contiene clases y métodos para capturar video usando la cámara del sistema. Vayamos paso a paso y aprendamos a hacerlo.

Paso 1: Cargue la biblioteca nativa de OpenCV

Mientras escribe código Java usando la biblioteca OpenCV, el primer paso que debe hacer es cargar la biblioteca nativa de OpenCV usando el loadLibrary(). Cargue la biblioteca nativa de OpenCV como se muestra a continuación.

// Loading the core library 
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Paso 2: crear una instancia de la clase CascadeClassifier

los CascadeClassifier clase del paquete org.opencv.objdetectse utiliza para cargar el archivo clasificador. Cree una instancia de esta clase pasando elxml archivo lbpcascade_frontalface.xml Como se muestra abajo.

// Instantiating the CascadeClassifier 
String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml"; 
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

Paso 3: detecta las caras

Puede detectar las caras en la imagen usando el método detectMultiScale() de la clase nombrada CascadeClassifier. Este método acepta un objeto de la clase.Mat sosteniendo la imagen de entrada y un objeto de la clase MatOfRect para almacenar los rostros detectados.

// Detecting the face in the snap 
MatOfRect faceDetections = new MatOfRect(); 
classifier.detectMultiScale(src, faceDetections);

Ejemplo

El siguiente programa demuestra cómo detectar caras en una imagen.

import org.opencv.core.Core;
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.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
  
public class FaceDetectionImage {
   public static void main (String[] args) {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file ="E:/OpenCV/chap23/facedetection_input.jpg";
      Mat src = Imgcodecs.imread(file);

      // Instantiating the CascadeClassifier
      String xmlFile = "E:/OpenCV/facedetect/lbpcascade_frontalface.xml";
      CascadeClassifier classifier = new CascadeClassifier(xmlFile);

      // Detecting the face in the snap
      MatOfRect faceDetections = new MatOfRect();
      classifier.detectMultiScale(src, faceDetections);
      System.out.println(String.format("Detected %s faces", 
         faceDetections.toArray().length));

      // Drawing boxes
      for (Rect rect : faceDetections.toArray()) {
         Imgproc.rectangle(
            src,                                               // where to draw the box
            new Point(rect.x, rect.y),                            // bottom left
            new Point(rect.x + rect.width, rect.y + rect.height), // top right
            new Scalar(0, 0, 255),
            3                                                     // RGB colour
         );
      }

      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap23/facedetect_output1.jpg", src);

      System.out.println("Image Processed");
   }
}

Suponga que la siguiente es la imagen de entrada facedetection_input.jpg especificado en el programa anterior.

Salida

Al ejecutar el programa, obtendrá el siguiente resultado:

Detected 3 faces 
Image Processed

Si abre la ruta especificada, puede observar la imagen de salida de la siguiente manera: