บทความนี้แบ่งปันรหัสเฉพาะสำหรับ Java เพื่อรับรู้การรับรู้ใบหน้าสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ไฟล์ดาวน์โหลดและการติดตั้งอย่างเป็นทางการนำ Win7 เป็นตัวอย่างดาวน์โหลด opencv-2.4.13.3-vc14.exe
หลังจากการติดตั้งในไดเรกทอรี Build ในไดเรกทอรี Build, D:/OpenCV/Build/Java, รับ OpENCV-2413.JAR, คัดลอกไปยังไดเรกทอรีโครงการและต้องใช้ไฟล์ DLL และไฟล์ XML ที่ได้รับการจดจำแต่ละไฟล์เพื่อระบุคุณสมบัติที่แตกต่างกัน
ไดเรกทอรี dll: d: /opencv/build/java/x64/opencv_java2413.dll
ไดเรกทอรี XML: D: /opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml (มีไฟล์ประจำตัวหลายไฟล์ในไดเรกทอรี)
โครงสร้างโครงการ:
รหัสเฉพาะ: เนื่องจากคุณจำเป็นต้องใช้ไฟล์ DLL ของ OpENCV จึงสามารถวางไว้ในเส้นทางไลบรารี Java หรือใน JRE LIB สามารถวางไว้ในไดเรกทอรี System32 ภายใต้ Windows หรือสามารถโหลดได้ในรหัสดังนี้:
แพ็คเกจ OpenCV; นำเข้า com.sun.scenario.effect.imagedata; นำเข้า org.opencv.core.*; นำเข้า org.opencv.core.point; นำเข้า org.opencv.highgui.highgui; นำเข้า org.opencv.imgproc.imgproc; นำเข้า org.opencv.objdetect.cascadeclassifier; นำเข้า Javax.imageio.imageio; นำเข้า Javax.swing.*; นำเข้า Java.awt.*; นำเข้า java.awt.image.bufferedimage; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า Java.util.Arrays; นำเข้า java.util.vector; /*** สร้างโดยผู้ดูแลระบบเมื่อ 2017/8/17 */การทดสอบคลาสสาธารณะ {Static {// นำเข้าสตริง OpenCV Library String OpenCv Path = System.getProperty ("user.dir") + "// opencv // x64 //"; String libpath = system.getProperty ("java.library.path"); สตริง a = opencvpath + core.native_library_name + ".dll"; System.load (OpenCvPath + Core.native_library_name + ".dll"); } สตริงคงที่สาธารณะ getCutpath (สตริง filepath) {string [] splitpath = filepath.split ("//."); return splitpath [0]+"cut"+"."+splitpath [1]; } กระบวนการโมฆะคงที่สาธารณะ (สตริงต้นฉบับ, สตริงเป้าหมาย) พ่นข้อยกเว้น {สตริงต้นฉบับ = getCutPath (ต้นฉบับ); สตริง targetCut = getCutPath (เป้าหมาย); if (detectFace (ต้นฉบับ, ต้นฉบับ cut) && detectFace (target, targetCut)) {}} detectface บูลีนแบบคงที่สาธารณะ // สร้างตัวจดจำใบหน้าจากไฟล์การกำหนดค่า lbpcascade_frontalface.xml ซึ่งอยู่ในไดเรกทอรีการติดตั้ง OpenCV cascadeclassifier facedetector = ใหม่ cascadeclassifier ("c: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); ภาพ mat = highgui.imread (imagepath); // ตรวจจับใบหน้าในภาพ matofrect facedetections = new matofrect (); Facedetector.DetectMultiscale (ภาพ, ใบหน้า); System.out.println (string.format ("ตรวจพบ %s Faces", facedetections.toarray (). ความยาว)); rect [] rects = facedetections.toarray (); if (rects! = null && rects.length> 1) {โยน runtimeException ใหม่ ("มากกว่าหนึ่งหน้า"); } // วาดกล่องรอบ ๆ ใบหน้าที่เป็นที่รู้จัก rect = rects [0]; Core.Rectangle (ภาพ, จุดใหม่ (rect.x-2, rect.y-2), จุดใหม่ (rect.x + rect.width, rect.y + rect.height), สเกลาร์ใหม่ (0, 255, 0)); mat sub = image.submat (rect); MAT MAT = MAT ใหม่ (); ขนาดขนาด = ขนาดใหม่ (300, 300); imgproc.resize (sub, mat, ขนาด); // ค้นหาใบหน้าและบันทึก return highgui.imwrite (outfile, mat); // บันทึกผลลัพธ์ลงในไฟล์ // string filename = "c: //users//administrator//desktop//opencv//facedetection.png"; // system.out.println (string.format ("การเขียน %s", ชื่อไฟล์)); // highgui.imwrite (ชื่อไฟล์, รูปภาพ); } โมฆะคงที่สาธารณะ setalpha (สตริง imagepath, สตริง outfile) { / *** เพิ่มรายการทดสอบ* อ่านภาพและวาดลงในโปร่งแสง* / ลอง {imageicon imageicon = ใหม่ imageicon (imagepath); bufferedImage bufferedImage = bufferedImage ใหม่ (imageicon.geticonwidth (), imageicon.geticonheight (), bufferedimage.type_4byte_abgr); graphics2d g2d = (graphics2d) bufferedimage.getGraphics (); G2D.DrawImage (imageicon.getImage (), 0, 0, imageicon.getimageobserver ()); // วนรอบทุกจุดพิกเซลและเปลี่ยนค่าอัลฟ่าของจุดพิกเซล int alpha = 100; สำหรับ (int j1 = bufferedimage.getMiny (); j1 <bufferedimage.getheight (); j1 ++) {สำหรับ (int j2 = bufferedimage.getMinx (); j2 <bufferedimage.getWidth (); j2 ++) rgb = ((alpha + 1) << 24) | (RGB & 0x00ffffff); bufferedimage.setrgb (J2, J1, RGB); }} g2d.DrawImage (bufferedImage, 0, 0, imageicon.getimageobserver ()); // สร้างภาพเป็น png imageio.write (bufferedimage, "png", ไฟล์ใหม่ (outfile)); } catch (exception e) {e.printstacktrace (); }} ลายน้ำโมฆะแบบคงที่ส่วนตัว (สตริง A, สตริง B, สตริง outfile, ลอยอัลฟ่า) พ่น IOException {// รับแผนที่ฐาน bufferedImage buffimg = imageio.read (ไฟล์ใหม่ (a)); // รับ Layer Map BufferedImage waterimg = imageio.read (ไฟล์ใหม่ (b)); // สร้างวัตถุกราฟิก 2D และวาดบนวัตถุแผนที่วัตถุกราฟิก 2D G2D = buffimg.createGraphics (); int waterimgwidth = waterimg.getWidth (); // รับความกว้างของแผนที่ความกว้าง int waterimgheight = waterimg.getheight (); // รับความสูงแผนที่ชั้น // ใช้ผลการผสมและผลกระทบที่โปร่งใสในกราฟิกและภาพ G2D.setComposite (alphacomposite // วาด g2d.drawimage (waterimg, 0, 0, waterimgwidth, waterimgheight, null); g2d.dispose (); // ปล่อยทรัพยากรระบบที่ใช้ในบริบทกราฟิก // สร้างภาพเป็น png imageio.write (buffimg, "png", ไฟล์ใหม่ (outfile)); } บูลีนแบบสแตติกแบบคงที่ Mergesimple (bufferedImage image1, bufferedImage image2, int posw, int posh, ไฟล์ fileoutput) {// ผสานสองภาพ int w1 = image1.getWidth (); int h1 = image1.getheight (); int w2 = image2.getWidth (); int h2 = image2.getheight (); bufferedImage imagesaved = bufferedImage ใหม่ (w1, h1, bufferedimage.type_int_argb); graphics2d g2d = imagesaved.createGraphics (); // เพิ่มรหัสต่อไปนี้เพื่อให้พื้นหลังโปร่งใส G2D.DrawImage (Image1, Null, 0, 0); image1 = g2d.getDeviceConfiguration (). createCompatibleImage (W1, W2, ความโปร่งใส translucent); g2d.dispose (); g2d = image1.createGraphics (); // สิ้นสุดรหัสพื้นหลังโปร่งใส // สำหรับ (int i = 0; i <w2; i ++) {// สำหรับ (int j = 0; j <h2; j ++) {// int rgb1 = image1.getRgb (i+posw, j+posh); // int rgb2 = image2.getrgb (i, j); // ถ้า (rgb1! = rgb2) {// // rgb2 = rgb1 & rgb2; //} // imagesaved.setrgb (i + posw, j + posh, rgb2); //} //} บูลีน b = false; ลอง {b = imageio.write (imagesaved, "png", fileOutput); } catch (ioexception ie) {ie.printstacktrace (); } return b; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {สตริง a, b, c, d; a = "c: //users//administrator//desktop//opencv//zzl.jpg"; d = "c: //users//administrator//desktop//opencv//cgx.jpg"; // กระบวนการ (a, d); a = "c: //users//administrator//desktop//opencv//zzlcut.jpg"; d = "c: //users//administrator//desktop//opencv//cgxcut.jpg"; cascadeclassifier facedetector = ใหม่ cascadeclassifier ("c: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); cascadeclassifier eyedetector1 = ใหม่ cascadeclassifier ("c: //users//administrator//desktop//opencv//haarcascade_eye.xml"); cascadeclassifier eyedetector2 = ใหม่ cascadeclassifier ("c: //users//administrator//desktop//opencv//haarcascade_eye_tree_eyeglasses.xml"); MAT Image = highgui.imread ("C: //users//administrator//desktop//opencv//gakki.jpg"); // ตรวจพบการตรวจสอบใบหน้าในภาพ matofrect facedetections = new matofrect (); //eyedetector2.detectmultiscale(image, Facedetections); Vector <rect> วัตถุ; Eyedetector1.DetectMultiscale (ภาพ, ใบหน้า, 2.0,1,1, ขนาดใหม่ (20,20), ขนาดใหม่ (20,20)); rect [] rects = facedetections.toarray (); ตา rect, eyeb; Eye = rects [0]; eyeb = rects [1]; System.out.println ("A-center Coordent" + eye.x + "และ" + eye.y); System.out.println ("B-Center Center" + Eyeb.x + "และ" + Eyeb.y); // รับมุมของตาสองตา double dy = (eyeb.y-yea.y); Double dx = (eyeb.x-yea.x); double len = math.sqrt (dx*dx+dy*dy); System.out.println ("dx คือ"+dx); System.out.println ("dy is"+dy); System.out.println ("Len คือ"+Len); Double Angle = Math.atan2 (Math.Abs (Dy), Math.Abs (DX))*180.0/Math.pi; System.out.println ("มุมคือ"+มุม); สำหรับ (rect rect: facedetections.toarray ()) {core.rectangle (ภาพ, จุดใหม่ (rect.x, rect.y), จุดใหม่ (rect.x + rect.width, rect.y + rect.height), Scalar ใหม่ (0, 255, 0); } string filename = "c: //users//administrator//desktop//opencv//ouput.png"; System.out.println (string.format ("การเขียน %s", ชื่อไฟล์)); highgui.imwrite (ชื่อไฟล์, รูปภาพ); // watermark (a, d, "c: //users//administrator//desktop//opencv//zzltm2.jpg", 0.7f); // // // // อ่านภาพโดยไม่ต้องเปลี่ยนข้อมูลดั้งเดิมของรูปภาพ // mat image1 = highgui.imread (a); // mat image2 = highgui.imread (d); // mat mat1 = mat ใหม่ (); MAT MAT2 = MAT ใหม่ (); // ขนาดขนาด = ขนาดใหม่ (300, 300); // imgproc.resize (image1, mat1, ขนาด); // imgproc.resize (image2, mat2, ขนาด); // mat mat3 = mat ใหม่ (ขนาด, 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 (ไฟล์ใหม่ (a)), // imageio.read (ไฟล์ใหม่ (d)), 0,0, // ไฟล์ใหม่ ("c: //users//administrator//desktop//opencv//add.jpg" -เอฟเฟกต์สุดท้าย: มีเส้นขอบสีเขียวถัดจากใบหน้าและสามารถจับภาพชายแดนสีเขียวเพื่อสร้างภาพใบหน้า
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น