Die Gesichtserkennungstechnologie selbst gibt es schon seit langer Zeit, aber in letzter Zeit sind Smartphone-Apps mit Gesichtserkennung wie Schnee aufgetaucht, die immer bekannter werden. Wie ist es vorher passiert? Das interessiert mich auch, und wenn ich selbst ein Gesichtsfoto mache, möchte ich eine App erstellen, die das Gesicht der Person auf dem Foto durch ein anderes ersetzt! Ich dachte. Als ich jedoch tatsächlich im Internet nach Gesichtserkennung und Bildanalyse suchte, konzentrierten sich viele von ihnen hauptsächlich auf maschinelles Lernen, und ich war überwältigt von der Schwierigkeit ... Als ich diesmal mit OpenCV mit einer Android-Anwendung einen Teil der Gesichtserkennungsfunktion erstellte, war dies einfacher als ich es mir vorgestellt hatte, daher möchte ich ihn vorstellen. Als ich es tatsächlich machte, stellte ich fest, dass es schwieriger war, die Kamerafunktion zu implementieren, als OpenCV zu verwenden, um das Gesicht vom Bild zu erkennen.
OpenCV (Open Source Computer Vision Library) ist eine Open Source-Bibliothek zur Verarbeitung von Videos und Bildern. Für OpenCV war dieser Artikel hilfreich.
Verwenden Sie OpenCV, um festzustellen, ob ein mit der Android-Kamerafunktion aufgenommenes Foto ein Gesicht enthält
OpenCV bietet Schnittstellen für C, C ++, Python und Java. Beim Einbetten in eine Smartphone-App werden SDKs für iOS und Android vorbereitet. Durch Importieren dieses SDK in das Projekt können Sie problemlos eine Umgebung für die Verwendung von OpenCV vorbereiten. Auch bei der Gesichtserkennung ist das Ergebnis des maschinellen Lernens erforderlich, um "Gesicht" zu beurteilen, aber es gibt einige, die OpenCV bereits vorbereitet hat. Das Ergebnis dieses maschinellen Lernens * ist im SDK-Paket enthalten.
FaceClassifier.java
//Laden der OpenCV-Bibliothek
static {
System.loadLibrary("opencv_java3");
}
FaceClassifier.java
//Bilddaten konvertieren (Bitmap Mat-Dateikonvertierung)
Mat matImg = new Mat();
Utils.bitmapToMat(image,matImg);
--Verwenden Sie "haarcascade_frontalface_alt.xml", eine Kaskade von Gesichtern. Da die Feature-Menge-Datei auch beim Herunterladen des SDK heruntergeladen wird, speichern Sie die Zieldatei unter res / raw des Android-Projekts. ――Ich stecke hier für einen Moment fest ...
FaceClassifier.java
//Generieren Sie eine Kaskadenklassifikatorinstanz, die die Gesichtserkennung durchführt (schreiben Sie die Datei einmal und rufen Sie den Pfad der Datei ab).
//Holen Sie sich die XML-Datei, sobald sie unter raw gespeichert ist
InputStream inStream = this.activity.getResources().openRawResource(R.raw.haarcascade_frontalface_alt);
File cascadeDir = this.activity.getDir("cascade", Context.MODE_PRIVATE);
File cascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt.xml");
//Geben Sie die erfasste XML-Datei in ein bestimmtes Verzeichnis aus
FileOutputStream outStream = new FileOutputStream(cascadeFile);
byte[] buf = new byte[2048];
int rdBytes;
while ((rdBytes = inStream.read(buf)) != -1) {
outStream.write(buf, 0, rdBytes);
}
outStream.close();
inStream.close();
//Verwenden Sie den Pfad der XML-Ausgabedatei als Argument für CascadeClassifier
CascadeClassifier faceDetetcor = new CascadeClassifier(cascadeFile.getAbsolutePath());
//Sobald die CascadeClassifier-Instanz erstellt wurde, ist die Ausgabedatei nicht mehr erforderlich. Löschen Sie sie daher.
if (faceDetetcor.empty()) {
faceDetetcor = null;
} else {
cascadeDir.delete();
cascadeFile.delete();
}
FaceClassifier.java
//Gesichtserkennung durch Übergabe von Bilddaten an den Kaskadenklassifizierer
MatOfRect faceRects = new MatOfRect();
faceDetetcor.detectMultiScale(matImg, faceRects);
--MatOfRect-Instanzen können in den Rect-Typ geändert werden. ―― Als Beispielquelle wird nur die Protokollausgabe ausgeführt. Wenn Sie jedoch das Gesicht im Bild durch ein anderes ersetzen möchten, können Sie dies tun, indem Sie die Bilder entsprechend den Koordinaten des Gesichts und der Größe des Gesichts überlagern.
FaceClassifier.java
//Bestätigung der Gesichtserkennungsergebnisse
Log.i(TAG ,"Anzahl der erkannten Gesichter:" + faceRects.toArray().length);
if (faceRects.toArray().length > 0) {
for (Rect face : faceRects.toArray()) {
Log.i(TAG ,"Vertikale Breite des Gesichts" + face.height);
Log.i(TAG ,"Gesichtsbreite" + face.width);
Log.i(TAG ,"Gesichtsposition (Y-Koordinate)" + face.y);
Log.i(TAG ,"Gesichtsposition (X-Koordinate)" + face.x);
}
return true;
} else {
Log.i(TAG ,"Es wurde kein Gesicht erkannt");
return false;
}
FaceClassifier.java
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.objdetect.CascadeClassifier;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FaceClassifier {
//Laden der OpenCV-Bibliothek
static {
System.loadLibrary("opencv_java3");
}
private Activity activity;
public FaceClassifier (Activity activity) {
this.activity = activity;
}
public boolean checkFaceExistence (Bitmap image) throws IOException {
//Bilddaten konvertieren (Bitmap Mat-Dateikonvertierung)
Mat matImg = new Mat();
Utils.bitmapToMat(image,matImg);
//Generieren Sie eine Kaskadenklassifikatorinstanz, die die Gesichtserkennung durchführt (schreiben Sie die Datei einmal und rufen Sie den Pfad der Datei ab).
//Holen Sie sich die XML-Datei, sobald sie unter raw gespeichert ist
InputStream inStream = this.activity.getResources().openRawResource(R.raw.haarcascade_frontalface_alt);
File cascadeDir = this.activity.getDir("cascade", Context.MODE_PRIVATE);
File cascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt.xml");
//Geben Sie die erfasste XML-Datei in ein bestimmtes Verzeichnis aus
FileOutputStream outStream = new FileOutputStream(cascadeFile);
byte[] buf = new byte[2048];
int rdBytes;
while ((rdBytes = inStream.read(buf)) != -1) {
outStream.write(buf, 0, rdBytes);
}
outStream.close();
inStream.close();
//Verwenden Sie den Pfad der XML-Ausgabedatei als Argument für CascadeClassifier
CascadeClassifier faceDetetcor = new CascadeClassifier(cascadeFile.getAbsolutePath());
//Sobald die CascadeClassifier-Instanz erstellt wurde, ist die Ausgabedatei nicht mehr erforderlich. Löschen Sie sie daher.
if (faceDetetcor.empty()) {
faceDetetcor = null;
} else {
cascadeDir.delete();
cascadeFile.delete();
}
//Gesichtserkennung durch Übergabe von Bilddaten an den Kaskadenklassifizierer
MatOfRect faceRects = new MatOfRect();
faceDetetcor.detectMultiScale(matImg, faceRects);
//Bestätigung der Gesichtserkennungsergebnisse
Log.i(TAG ,"Anzahl der erkannten Gesichter:" + faceRects.toArray().length);
if (faceRects.toArray().length > 0) {
for (Rect face : faceRects.toArray()) {
Log.i(TAG ,"Vertikale Breite des Gesichts" + face.height);
Log.i(TAG ,"Gesichtsbreite" + face.width);
Log.i(TAG ,"Gesichtsposition (Y-Koordinate)" + face.y);
Log.i(TAG ,"Gesichtsposition (X-Koordinate)" + face.x);
}
return true;
} else {
Log.i(TAG ,"Es wurde kein Gesicht erkannt");
return false;
}
}
}
Das OpenCV SDK ist viel einfacher zu verwenden, also einfacher als Sie denken. Wenn Sie etwas anderes als das Gesicht erkennen möchten, müssen Sie das maschinelle Lernen mit OpenCV überprüfen. Da jedoch verschiedene veröffentlichte Ergebnisse (XML-Dateien) des maschinellen Lernens für OpenCV einmal vorhanden sind Es wird empfohlen, dies zu überprüfen. Wenn Sie eine App erstellen möchten, die Gesichtserkennungstechnologie wie ich verwendet, verwenden Sie bitte OpenCV.