La technologie de reconnaissance faciale elle-même existe depuis longtemps, mais récemment, des applications pour smartphone utilisant la reconnaissance faciale telles que Snow sont apparues et elles sont de plus en plus familières. Comment est-ce arrivé avant? Cela m'intéresse aussi, et si je prends moi-même une photo de visage, j'aimerais créer une application qui remplace le visage de la personne sur la photo par un autre! J'ai pensé. Cependant, lorsque j'ai recherché en ligne la reconnaissance faciale et l'analyse d'image, beaucoup d'entre eux se sont concentrés sur l'apprentissage automatique, et j'ai été submergé par la difficulté ... Cependant, lorsque j'ai créé une partie de la fonction de reconnaissance faciale en utilisant OpenCV avec une application Android cette fois, c'était plus facile que ce que j'imaginais, alors j'aimerais la présenter. Ce que j'ai trouvé en le faisant, c'est qu'il était plus difficile d'implémenter la fonction de caméra que d'utiliser OpenCV pour reconnaître le visage à partir de l'image.
OpenCV (Open Source Computer Vision Library) est une bibliothèque open source pour le traitement de vidéos et d'images. Pour OpenCV, cet article a été utile.
Utilisez OpenCV pour déterminer si un visage est présent sur une photo prise avec la fonction appareil photo Android
OpenCV fournit des interfaces pour C, C ++, Python et Java. Lors de l'intégration dans une application pour smartphone, des SDK sont préparés pour iOS et Android, et en important ce SDK dans le projet, vous pouvez facilement préparer un environnement pour utiliser OpenCV. De plus, dans la reconnaissance faciale, le résultat de l'apprentissage automatique est nécessaire pour juger du «visage», mais il y en a déjà préparé par OpenCV. Le résultat de cet apprentissage automatique * est inclus dans le package SDK.
FaceClassifier.java
//Chargement de la bibliothèque OpenCV
static {
System.loadLibrary("opencv_java3");
}
--Convertissez les données d'image au format OpenCV Mat. --Dans l'exemple, nous avons converti du format Bitmap au format Mat.
FaceClassifier.java
//Convertir les données d'image (conversion de fichier Bitmap Mat)
Mat matImg = new Mat();
Utils.bitmapToMat(image,matImg);
--Utilisez "haarcascade_frontalface_alt.xml" qui est une cascade de visages. Étant donné que le fichier de quantité de fonctionnalités est également téléchargé lorsque le SDK est téléchargé, stockez le fichier cible sous res / raw du projet Android. ――Je suis resté coincé ici pendant un moment ...
FaceClassifier.java
//Générer une instance de classificateur en cascade qui effectue la reconnaissance faciale (écrivez le fichier une fois et obtenez le chemin du fichier)
//Obtenez le fichier xml une fois stocké sous raw
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");
//Sortir le fichier xml acquis dans un répertoire spécifique
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();
//Utilisez le chemin du fichier xml de sortie comme argument de CascadeClassifier
CascadeClassifier faceDetetcor = new CascadeClassifier(cascadeFile.getAbsolutePath());
//Une fois l'instance CascadeClassifier créée, le fichier de sortie est inutile, supprimez-le.
if (faceDetetcor.empty()) {
faceDetetcor = null;
} else {
cascadeDir.delete();
cascadeFile.delete();
}
FaceClassifier.java
//Reconnaissance faciale en donnant des données d'image au classificateur en cascade
MatOfRect faceRects = new MatOfRect();
faceDetetcor.detectMultiScale(matImg, faceRects);
FaceClassifier.java
//Confirmation des résultats de la reconnaissance faciale
Log.i(TAG ,"Nombre de visages reconnus:" + faceRects.toArray().length);
if (faceRects.toArray().length > 0) {
for (Rect face : faceRects.toArray()) {
Log.i(TAG ,"Largeur verticale du visage" + face.height);
Log.i(TAG ,"Largeur du visage" + face.width);
Log.i(TAG ,"Position du visage (coordonnée Y)" + face.y);
Log.i(TAG ,"Position de la face (coordonnée X)" + face.x);
}
return true;
} else {
Log.i(TAG ,"Aucun visage n'a été détecté");
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 {
//Chargement de la bibliothèque OpenCV
static {
System.loadLibrary("opencv_java3");
}
private Activity activity;
public FaceClassifier (Activity activity) {
this.activity = activity;
}
public boolean checkFaceExistence (Bitmap image) throws IOException {
//Convertir les données d'image (conversion de fichier Bitmap Mat)
Mat matImg = new Mat();
Utils.bitmapToMat(image,matImg);
//Générer une instance de classificateur en cascade qui effectue la reconnaissance faciale (écrivez le fichier une fois et obtenez le chemin du fichier)
//Obtenez le fichier xml une fois stocké sous raw
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");
//Sortir le fichier xml acquis dans un répertoire spécifique
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();
//Utilisez le chemin du fichier xml de sortie comme argument de CascadeClassifier
CascadeClassifier faceDetetcor = new CascadeClassifier(cascadeFile.getAbsolutePath());
//Une fois l'instance CascadeClassifier créée, le fichier de sortie est inutile, supprimez-le.
if (faceDetetcor.empty()) {
faceDetetcor = null;
} else {
cascadeDir.delete();
cascadeFile.delete();
}
//Reconnaissance faciale en donnant des données d'image au classificateur en cascade
MatOfRect faceRects = new MatOfRect();
faceDetetcor.detectMultiScale(matImg, faceRects);
//Confirmation des résultats de la reconnaissance faciale
Log.i(TAG ,"Nombre de visages reconnus:" + faceRects.toArray().length);
if (faceRects.toArray().length > 0) {
for (Rect face : faceRects.toArray()) {
Log.i(TAG ,"Largeur verticale du visage" + face.height);
Log.i(TAG ,"Largeur du visage" + face.width);
Log.i(TAG ,"Position du visage (coordonnée Y)" + face.y);
Log.i(TAG ,"Position de la face (coordonnée X)" + face.x);
}
return true;
} else {
Log.i(TAG ,"Aucun visage n'a été détecté");
return false;
}
}
}
Le SDK OpenCV est beaucoup plus facile à utiliser, il est donc plus facile que vous ne le pensez. Si vous souhaitez reconnaître autre chose que le visage, vous devez vérifier l'apprentissage automatique à l'aide d'OpenCV, mais comme il existe divers résultats publiés (fichiers XML) de l'apprentissage automatique pour OpenCV, une fois Il est recommandé de vérifier. Si vous souhaitez créer une application qui utilise la technologie de reconnaissance faciale comme moi, veuillez utiliser OpenCV.
Recommended Posts