OpenCV - wykrywanie twarzy na zdjęciu

Plik VideoCapture klasa org.opencv.videoioPakiet zawiera klasy i metody do przechwytywania wideo za pomocą kamery systemowej. Przejdźmy krok po kroku i nauczmy się, jak to zrobić.

Krok 1: Załaduj natywną bibliotekę OpenCV

Podczas pisania kodu Java przy użyciu biblioteki OpenCV, pierwszym krokiem, jaki należy wykonać, jest załadowanie natywnej biblioteki OpenCV za pomocą loadLibrary(). Załaduj natywną bibliotekę OpenCV, jak pokazano poniżej.

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

Krok 2: Utwórz wystąpienie klasy CascadeClassifier

Plik CascadeClassifier klasa pakietu org.opencv.objdetectsłuży do ładowania pliku klasyfikatora. Utwórz wystąpienie tej klasy, przekazując plikxml plik lbpcascade_frontalface.xml jak pokazano niżej.

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

Krok 3: Wykryj twarze

Możesz wykryć twarze na obrazie za pomocą metody detectMultiScale() klasy o nazwie CascadeClassifier. Ta metoda akceptuje obiekt klasyMat przechowujący obraz wejściowy i obiekt klasy MatOfRect aby zapisać wykryte twarze.

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

Przykład

Poniższy program demonstruje, jak wykrywać twarze na obrazie.

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

Załóżmy, że poniżej jest obraz wejściowy facedetection_input.jpg określone w powyższym programie.

Wynik

Podczas wykonywania programu otrzymasz następujące dane wyjściowe -

Detected 3 faces 
Image Processed

Jeśli otworzysz określoną ścieżkę, możesz obserwować obraz wyjściowy w następujący sposób -