تشارك هذه المقالة الكود المحدد لجافا لتحقيق التعرف على الوجه للرجوع إليه. المحتوى المحدد كما يلي
ملف التنزيل والتثبيت الرسمي ، خذ Win7 كمثال ، قم بتنزيل OpenCV-2.4.13.3-Vc14.exe
بعد التثبيت ، في دليل الإنشاء ، في دليل الإنشاء ، 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 {// import OpenCV String 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") ؛ } السلسلة الثابتة العامة getCutPath (سلسلة filepath) {string [] splitpath = filepath.split ("//.") ؛ إرجاع splitpath [0]+"CUT"+"."+splitpath [1] ؛ } عملية الفراغ الثابتة العامة (السلسلة الأصلية ، الهدف السلسلة) يلقي استثناء {String OriginalCut = getCutPath (الأصلي) ؛ String TargetCut = getCutPath (Target) ؛ إذا كان (DetectFace (Original ، OriginalCut) && detectface (Target ، TargetCut)) {}} detectsface static static (string imagePath ، string outfile) يلقي الاستثناء {system.out.println ("/nrunning detectfacedemo") ؛ // قم بإنشاء معرف على الوجه من ملف التكوين lbpcascade_frontalface.xml ، والذي يقع في دليل تثبيت OpenCV. cascadeclassifier facedetector = cascadeclassifier جديد ("c: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml") ؛ MAT Image = HIGHGUI.IMREAD (ImagePath) ؛ // الكشف عن الوجوه في صورة الوجهات matofrect = matofrect () جديدة ؛ FaceDetector.DetectMultiscale (الصورة ، الوجه) ؛ System.out.println (string.format ("الوجوه المكتشفة ٪ s" ، FaceDetections.Toarray (). الطول)) ؛ rect [] rects = facedetections.toarray () ؛ if (rects! = null && rects.length> 1) {رمي new runTimeException ("أكثر من وجه واحد") ؛ } // ارسم مربعًا حول كل مستقيم للوجه المعترف به = المستقيم [0] ؛ Core.Rectangle (صورة ، نقطة جديدة (rect.x-2 ، rect.y-2) ، نقطة جديدة (rect.x + rect.width ، rect.y + rect.height) ، القياس الجديد (0 ، 255 ، 0)) ؛ حصيرة sub = image.submat (rect) ؛ MAT MAT = NEW MAT () ؛ حجم الحجم = حجم جديد (300 ، 300) ؛ imgproc.resize (sub ، mat ، size) ؛ // ابحث عن الوجه وحفظ return highgui.imwrite (outfile ، mat) ؛ // حفظ النتيجة إلى ملف // سلسلة filename = "c: //users//administrator//desktop//opencv//facedetection.png" ؛ // system.out.println (string.format ("الكتابة ٪ s" ، اسم الملف)) ؛ // Highgui.imwrite (اسم الملف ، الصورة) ؛ } setalpha static void static (String ImagePath ، String Outfile) { / *** إضافة عناصر الاختبار* اقرأ الصورة ورسمها إلى شفاف* / try {imageicon imageicon = new 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 ++) {for (int j2 = bufferedimage.getminx () ؛ j2 <bufferedimage.getwidth () ؛ j2 ++) {int rgb = bufferedimage.getrgb ( RGB = ((ألفا + 1) << 24) | (RGB & 0x00FFFFFF) ؛ BufferedImage.setrgb (J2 ، J1 ، RGB) ؛ }} g2d.drawImage (bufferedImage ، 0 ، 0 ، imageicon.getImageObserver ()) ؛ // إنشاء الصورة كـ png imageio.write (bufferedImage ، "png" ، ملف جديد (outfile)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} علامة مائية باطلة ثابتة (سلسلة A ، السلسلة B ، السلسلة Outfile ، Float alpha) يلقي ioException {// احصل على الخريطة الأساسية bufferedimage buffimg = imageio.read (ملف جديد (a)) ؛ // الحصول على MAP MAP BufferEdImage waterimg = imageio.read (ملف جديد (ب)) ؛ // إنشاء كائن Graphics2D ورسم على كائن MAP الأساسي GRASTICS2D G2D = buffimg.creategraphics () ؛ int waterimgwidth = waterimg.getWidth () ؛ // الحصول على طبقة عرض خريطة int waterimgheight = waterimg.getheight () ؛ // احصل على ارتفاع خريطة الطبقة // تنفيذ الخلط والآثار الشفافة في الرسومات والصور g2d.setComposite (Alphacomposite.getInstance (alphacomposite.src_atop ، alpha) ؛ // draw g2d.drawimage (waterimg ، 0 ، 0 ، waterimgwidth ، waterimgheight ، null) ؛ g2d.dispose () ؛ // قم بتحرير موارد النظام المستخدمة في سياق الرسومات // قم بإنشاء الصورة كـ png imageio.write (buffimg ، "png" ، ملف جديد (Outfile)) ؛ } دمج Boolean الثابت العام (Image1mage 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 (). g2d.dispose () ؛ g2d = image1.creategraphics () ؛ // نهاية الكود الشفاف الخلفية // لـ (int i = 0 ؛ i <w2 ؛ i ++) {// for (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 ؛ //} // picturesaved.setrgb (i + posw ، j + posh ، rgb2) ؛ //} //} boolean b = false ؛ حاول {b = imageio.write (picturesaved ، "png" ، fileOutput) ؛ } catch (ioException ie) {ie.printStackTrace () ؛ } العودة ب ؛ } public static void main (string [] args) يلقي الاستثناء {string 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 = جديدة matofrect () ؛ //eyedetector2.detectmultiscale(image ، الوجه) ؛ ناقل <rect> كائنات ؛ eyedetector1.detectMultiscale (Image ، Exedet Elections ، 2.0،1،1 ، حجم جديد (20،20) ، حجم جديد (20،20)) ؛ rect [] rects = facedetections.toarray () ؛ عين العين ، العين ؛ العين = المستقيم [0] ؛ العين = المستقيم [1] ؛ System.out.println ("A-Center Coordinate" + Eye.x + "و" + eye.y) ؛ System.out.println ("B-Center Coordinate" + EyeB.x + "و" + EyeB.y) ؛ // احصل على زاوية عينين مزدوجة dy = (eyeb.y-eyea.y) ؛ 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) ؛ زاوية مزدوجة = Math.Atan2 (Math.ABS (DY) ، Math.ABS (DX))*180.0/MATH.PI ؛ System.out.println ("angle is"+angle) ؛ لـ (rect rect: facedetections.toarray ()) {core.rectangle (صورة ، نقطة جديدة (rect.x ، rect.y) ، نقطة جديدة (rect.x + rect.width ، rect.y + rect.Height) ، مقياس جديد (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) ؛ // mat1 = new mat () ؛ MAT2 = new mat () ؛ // حجم الحجم = حجم جديد (300 ، 300) ؛ // imgproc.resize (image1 ، mat1 ، size) ؛ // imgproc.resize (image2 ، mat2 ، size) ؛ // mat3 = new mat (size ، 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 (ملف جديد (أ)) ، // imageio.read (ملف جديد (D)) ، 0،0 ، }}التأثير النهائي: هناك حدود خضراء بجوار الوجه ، ويمكن التقاط صورة الحدود الخضراء لإنشاء صورة للوجه
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.