Dieser Artikel teilt den spezifischen Code für Java mit, um die Gesichtserkennung für Ihre Referenz zu realisieren. Der spezifische Inhalt ist wie folgt
Offizielle Download- und Installationsdatei, win7 als Beispiel, laden Sie OpenCVV-2.4.13.3-VC14.exe herunter
Nach der Installation im Build-Verzeichnis erhalten Sie im Build-Verzeichnis d:/opencv/build/java openCV-2413.jar, kopieren Sie in das Projektverzeichnis und benötigen auch die DLL-Datei und jede Erkennungs-XML
DLL -Verzeichnis: d: /opencv/build/java/x64/opencv_java2413.dll
XML -Verzeichnis: d: /opencv/sources/data/HAARCASCADES/HAARCASCADE_FRONTALFACE_ALT.XML (im Verzeichnis befinden sich verschiedene Identifikationsdateien)
Projektstruktur:
Spezifischer Code: Da Sie die DLL -Datei von OpenCV verwenden müssen, kann er entweder im Java -Bibliotheksweg oder in Jre Lib. Es kann in das System32 -Verzeichnis unter Windows platziert werden oder wie folgt dynamisch in den Code geladen werden:
Paket openCV; import com.sun.scenario.effect.imagedata; import org.opencv.core.*; import org.opencv.core.point; import org.opencv.highgui.highgui; import org.opencv.imgproc.imgproc; import org.opencv.objdetect.cascadeClassifier; import Javax.imageo.imageo; Javax.swing importieren.*; import Java.awt.*; Import Java.awt.image.BuffenedImage; Import Java.io.file; importieren java.io.ioException; Import Java.util.Arrays; Import Java.util.Vector; /*** Erstellt von Administrator am 2017/8/17. */public class Test {static {// OpenCV -Bibliotheksstring opencv path = system.getProperty ("user.dir") + "// opencv // x64 //"; String libpath = system.getProperty ("java.library.Path"); String a = opencvPath + core.native_library_name + ".dll"; System.load (opencvPath + core.native_library_name + ".dll"); } public static String getCutPath (String filepath) {String [] splitpath = filepath.split ("//."); return splitpath [0]+"cut"+"."+splitpath [1]; } public static void prozess (String Original, String Ziel) löst Ausnahme aus {String originalcut = getCutPath (original); String targetCut = getCutPath (Ziel); if (detectface (original, originalcut) && detectface (Ziel, targetCut)) {}} public static boolean Detectface (String ImagePath, String -Outfile) löst eine Ausnahme aus {System.out.println ("/nrunning detektFaceemo"); // Erstellen Sie einen Gesichtserkenner aus der Konfigurationsdatei lbpcascade_frontalface.xml, die sich im OpenCV -Installationsverzeichnis befindet. CascadeClassifier FaceETector = new CascadeClassifier ("C: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); MAT Image = HighGui.imread (ImagePath); // Gesichter im Bild matofrect faceDections = new matofrect () erfassen; FaceDeTector System.out.println (String.Format ("Erkennete %s Faces", FaceDeTection.toArray (). Länge)); Rect [] rects = faceDeTection.toArray (); if (recTs! = null && rectexs.length> 1) {werfen neu runimeexception ("mehr als ein Gesicht"); } // Zeichnen Sie eine Box um jedes erkannte Gesichtsgesicht, das rechte Rekt. Core.Rectangle (Bild, neuer Punkt (rect.x-2, rect.y-2), neuer Punkt (rect.x + rect.width, rect.y + rect.height), neuer Skalar (0, 255, 0)); Mat sub = image.submat (rect); Mat matte = new Mat (); Größe Größe = neue Größe (300, 300); Imgproc.Resize (sub, mat, Größe); // Durchsuchen Sie das Gesicht und speichern Sie die Rückkehr HighGui.imwrite (Outfile, MAT); // das Ergebnis in einer Datei speichern // String Dateiname = "C: //users//administrator//desktop//opencv//faceTection.png"; // system.out.println (string.format ("Schreiben %S", Dateiname)); // HighGui.imwrite (Dateiname, Bild); } public static void setalpha (String ImagePath, String -Outfile) { / *** Testelemente hinzufügen* Lesen Sie das Bild und zeichnen Sie es in translucent* / try {imageCon imageCon = new ImageCon (ImagePath); Bufferedimage bufferedimage = new bufferedimage (imageicon.geticonwidth (), imageicon.geticonHeight (), bufferedimage.type_4Byte_abgr); Graphics2d G2D = (Graphics2d) bufferedImage.getGraphics (); g2d.drawimage (imageicon.getImage (), 0, 0, imageicon.getImageObServer ()); // jeden Pixelpunkt schleifen und den Alpha -Wert des Pixelpunkts int alpha = 100 ändern; für (int j1 = bufferedImage.getMiny (); j1 <bufferedimage.getheight (); j1 ++) {für (int j2 = bufferedImage.getminx (); rgb = ((alpha + 1) << 24) | (RGB & 0x00ffffff); bufferedImage.setRGB (J2, J1, RGB); }} g2d.drawimage (bufferedImage, 0, 0, imageCon.getImageObserver ()); // das Bild als png imageio.write (bufferedImage, "png", neuer Datei (Outfile)) generieren; } catch (Ausnahme e) {e.printstacktrace (); }} privates statisches Void -Wasserzeichen (Zeichenfolge A, String B, String Outfile, Float Alpha) löscht ioException {// die Basiskarte bufferedimage buffimg = imageio.read (neue Datei (a)) ab. // Layer Map BufferedImage WaterImg = imageio.read (neue Datei (b)) abrufen; // Graphics2D -Objekt erstellen und auf das Basiskartenobjekt Graphics2d G2D = buffimg.createGraphics () zeichnen; int wateriMgwidth = waterImg.getWidth (); // Schichtkartenbreite int waaterImgheight = waterImg.getheight (); // Schichtkartenhöhe abrufen // Mischung und transparente Effekte in Graphics und Bildern G2D.SetComposite (Alphacomposite.getInstance (Alphacomposite "(Alphacomposit.src_atop, alphacomposite); // g2d.drawimage zeichnen (WaterImg, 0, 0, WaterImgwidth, WaterImghehy, Null); g2d.disis (); // die im Grafikkontext verwendeten Systemressourcen freigeben // das Bild als PNG Imageio.write (BuffImg, "PNG", neue Datei (Outfile)) erstellen; } public static boolean mergeSimple (bufferedImage image1, bufferedimage image2, int posw, int posh, fileOutput) {// zwei Bilder int int w1 = image1.getWidth () zusammenführen; int h1 = image1.getheight (); int w2 = image2.getWidth (); int H2 = Image2.Getheight (); Bufferedimage imagesaved = new bufferedImage (W1, h1, bufferedimage.type_int_argb); Graphics2d G2D = ImagesAv.CreateGraphics (); // Fügen Sie den folgenden Code hinzu, um den Hintergrund transparent G2D.Drawimage (Image1, Null, 0, 0) zu machen; Image1 = g2d.getDeviceConfiguration (). CreateCompatibleImage (W1, W2, Transparenz.Translucent); g2d.disis (); G2D = Image1.CreateGraphics (); // Ende des Hintergrunds transparenten Code // für (int i = 0; i <w2; i ++) {// für (int j = 0; j <h2; j ++) {// int rgb1 = image1.getRgb (i+posw, j+posh); // int rgb2 = image2.getRGB (i, j); // if (rgb1! = rgb2) {// // rgb2 = rgb1 & rgb2; //} // Imagesave.setRGB (i + posw, j + posh, rgb2); //} //} boolean b = false; try {b = imageio.write (imageSaved, "png", FileOutput); } catch (ioException dh) {ie.printstacktrace (); } return b; } public static void main (String [] args) löst eine Ausnahme aus {String A, B, C, d; a = "c: //users//administrator//desktop//opencv/zl.jpg"; d = "c: //users//administrator//desktop//opencv//cgx.jpg"; // Prozess (a, d); a = "c: //users//administrator//desktop//opencv//zzlcut.jpg"; d = "c: //users//administrator//desktop//opencv//cgxcut.jpg"; CascadeClassifier FaceETector = new CascadeClassifier ("C: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); CASCADECLASSIFIER EYEDETECTOR1 = NEUER CASCADECLASSIFIER ("C: //users//administrator//desktop//opencv//haarcascade_eye.xml"); CASCADECLASSIFIER EYEDETECTOR2 = NEU CASCADECLASSIFIER ("C: //users//administrator//desktop//opencv//haarcascade_eye_tree_eyeglasses.xml"); MAT Image = HighGui.imread ("C: //users//administrator//desktop//opencv//gakki.jpg"); // FaceDections im Bild Matofrect FacedTections = New Matofrect () erfassen; //eyedetector2.DeTectMultiscale(image, FaceDections); Vektor <Rect> Objekte; EyeDetektor1.DetectMultiscale (Bild, FaceDeTections, 2,0,1,1, neue Größe (20,20), neue Größe (20,20)); Rect [] rects = faceDeTection.toArray (); RECHTE EYE, EYEB; Eye = RPS [0]; Eyeb = RPS [1]; System.out.println ("A-Center-Koordinate" + eye.x + "und" + eye.y); System.out.println ("B-Center-Koordinate" + eyeb.x + "und" + eyeb.y); // den Winkel von zwei Augen doppelt dy = (eyeb.y-eyea.y) erhalten; double dx = (eyeb.x-eyea.x); double len = math.sqrt (dx*dx+dy*dy); System.out.println ("dx is"+dx); System.out.println ("Dy is"+dy); System.out.println ("Len is"+len); Doppelwinkel = math.atan2 (math.abs (dy), math.abs (dx))*180.0/math.pi; System.out.println ("Winkel ist"+Winkel); für (rect rect: faceedETections.toarray ()) {core.Rectangle (Bild, neuer Punkt (rect.x, rect.y), neuer Punkt (rect.x + rect.width, rect.y + rect.height), neuer Skalar (0, 255, 0)); } String -Dateiname = "C: //users//administrator//desktop//opencv//ouput.png"; System.out.println (string.format ("Schreiben %S", Dateiname)); HighGui.imwrite (Dateiname, Bild); // Watermark (a, d "c: //users//administrator//desktop//opencv/zltm2.jpg", 0.7f); // // // // das Bild lesen, ohne die ursprünglichen Informationen des Bildes zu ändern // MAT Image1 = HighGui.imread (a); // MAT Image2 = HighGui.imread (d); // mat mat1 = new Mat (); MAT MAT2 = New Mat (); // Größe Größe = neue Größe (300, 300); // imgproc.resize (Image1, MAT1, Größe); // imgproc.resize (Bild2, MAT2, Größe); // MAT MAT3 = NEUE MAT (Größe, cvType.cv_64f); // core.addWeighted (MAT1, 0,5, MAT2, 1, 0, MAT3); // // // // Highgui.imwrite ("C: //users//administrator//desktop//opencv//add.jpg", mat3); // // mergeSimple (imageio.read (neue Datei (a)), // imageio.read (neue Datei (d), 0,0, // neue Datei ("c: //users//administrator//desktop//opencv//add.jpg"); }}Finaleffekt: Neben dem Gesicht befindet
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.