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 -