[JAVA] Ich habe versucht, eine einfache Gesichtserkennungs-Android-Anwendung mit OpenCV zu erstellen

Einführung

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.

Was ist OpenCV überhaupt?

OpenCV (Open Source Computer Vision Library) ist eine Open Source-Bibliothek zur Verarbeitung von Videos und Bildern. Für OpenCV war dieser Artikel hilfreich.

Was ich machen wollte

Verwenden Sie OpenCV, um festzustellen, ob ein mit der Android-Kamerafunktion aufgenommenes Foto ein Gesicht enthält

  1. Führen Sie maschinelles Lernen durch, um Funktionen zu erwerben
  2. Implementieren Sie die Kamerafunktion in der Android App
  3. Implementierte Gesichtserkennungsfunktion für Bilddaten, die mit einer Kamera aufgenommen wurden ← Teil, das dieses Mal eingeführt werden soll
  4. Bildverarbeitung und Beurteilung anhand von Erkennungsergebnissen (Gesichtsgröße, Positionsinformationen)

Was wird verwendet, um die Gesichtserkennungsfunktion mit OpenCV zu realisieren

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.

Nutzungsumgebung / Bibliothek

Prozessablauf

Laden der OpenCV-Bibliothek

FaceClassifier.java



  //Laden der OpenCV-Bibliothek
  static {
    System.loadLibrary("opencv_java3"); 
  }

Konvertieren Sie Bilddaten in das Mat-Format

FaceClassifier.java



    //Bilddaten konvertieren (Bitmap Mat-Dateikonvertierung)
    Mat matImg = new Mat();
    Utils.bitmapToMat(image,matImg); 

Erstellen einer Cascade Classifier-Instanz zur Gesichtserkennung

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

Gesichtserkennung durch Übergabe von Bilddaten an Cascade Classifier

FaceClassifier.java



    //Gesichtserkennung durch Übergabe von Bilddaten an den Kaskadenklassifizierer
    MatOfRect faceRects = new MatOfRect();
    faceDetetcor.detectMultiScale(matImg, faceRects);

Ermitteln Sie die Anzahl der im Bild erkannten Gesichter und die Position der Gesichter aus dem in der MatOfRect-Instanz gespeicherten Ergebnis.

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

Quellcode

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

Zusammenfassung

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.

Recommended Posts

Ich habe versucht, eine einfache Gesichtserkennungs-Android-Anwendung mit OpenCV zu erstellen
Ich habe versucht, eine einfache Anwendung mit Dockder + Rails Scaffold zu erstellen
Java-Anfänger haben versucht, mit Spring Boot eine einfache Webanwendung zu erstellen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Java Ich habe versucht, einen einfachen Block zu brechen
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 3 ~ Übung ~ erstellt
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
[Android] Ich habe mit ListView + Bottom Sheet einen Materiallistenbildschirm erstellt
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
[Einführung in die Android App-Entwicklung] Machen wir einen Zähler
Ich habe versucht, ein einfaches Spiel mit Javafx zu machen ① "Lass uns Glücksspiel finden" (unvollendete Version ②)
Ich habe versucht, innerhalb von 3 Monaten einen Antrag von unerfahren zu stellen
Ich habe versucht, TabLayout unter Android eine Trennlinie hinzuzufügen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich habe einen RESAS-API-Client in Java erstellt
Versuchen Sie, OpenCV in die Android-Anwendung einzuführen
Versuchen Sie, einen einfachen Rückruf zu tätigen
Ich habe versucht, die Beispielanwendung gemäß der Idee des Buches "Micro Service Architecture" in einen Mikrodienst zu verwandeln.
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe versucht, mithilfe von Routing-Verschachtelung eine beliebige URL zu erstellen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 2 ~ Grundlegende Schreibweise für Dash ~ erstellt
Nachdem ich Progate gelernt hatte, versuchte ich, eine SNS-Anwendung mit Rails in der lokalen Umgebung zu erstellen
Ich möchte eine Webanwendung entwickeln!
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Gesichtserkennungs-App mit OpenCV + Android Studio
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Ich habe einen Arbitrage-Transaktionsbot für virtuelle Währungen erstellt und versucht, Geld zu verdienen
Ich habe versucht, eine Anwendung für maschinelles Lernen mit Dash (+ Docker) Teil 1 ~ Umgebungskonstruktion und Funktionsprüfung ~ zu erstellen
Ich habe versucht, ein Beispielprogramm mit dem Problem des Datenbankspezialisten für domänengesteuertes Design zu erstellen
Mit der Gesichtserkennungsfunktion von Watson Visual Recognition habe ich versucht, ein Ganzkörperbild einer Person in ein Bild nur des Gesichtsteils zu verarbeiten
[LINE @] Ich habe versucht, einen westlichen Kalender für einen japanischen Kalender zu konvertieren. BOT [Messaging API]
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Eine Geschichte, als ich versuchte, ein Video zu erstellen, indem ich Processing und Resolume verknüpfte
Ich habe versucht, ein Personalmanagement-Tool zu entwickeln
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich habe versucht, eine Website für das Studium von DUO3.0 zu entwickeln.
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, eine LINE-Klon-App zu erstellen
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
[Azure] Ich habe versucht, eine Java-App für die Erstellung von kostenlosen Web-Apps zu erstellen. [Anfänger]
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln