本文实例为大家分享了 Javacv 实现人脸检测功能的具体代码, 供大家参考, 具体内容如下
/ * * ลิขสิทธิ์ (c) 2010,2011,2012 Samuel Audet * * facepreview - การรวมกันของตัวอย่างของ OpenCV และตัวอย่าง CamerapReview ของ Android * พร้อม Javacv + Javacpp เป็นกาวในระหว่างนั้น * * ไฟล์นี้ขึ้นอยู่กับ camerapreview.java ที่มาพร้อมกับตัวอย่างสำหรับ * Android SDK API 8, Revision 1 และมีประกาศลิขสิทธิ์ต่อไปนี้: * * Copyright (C) 2007 โครงการโอเพ่นซอร์ส Android * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * คุณไม่สามารถใช้ไฟล์นี้ยกเว้นตามใบอนุญาต * คุณอาจได้รับสำเนาใบอนุญาตที่ * * http://www.apache.org/licenses/license-2.0 * * เว้นแต่ว่ากฎหมายที่บังคับใช้หรือตกลงที่จะเป็นลายลักษณ์อักษรซอฟต์แวร์ * แจกจ่ายภายใต้ใบอนุญาตจะถูกแจกจ่ายใน "ตาม" โดยไม่มีการรับประกันหรือเงื่อนไขใด ๆ * ดูใบอนุญาตสำหรับภาษาเฉพาะที่ควบคุมการอนุญาตและ * ข้อ จำกัด ภายใต้ใบอนุญาต * * * สำคัญ - ตรวจสอบให้แน่ใจว่าไฟล์ AndroidManifest.xml มีลักษณะเช่นนี้: * * <? xml version = "1.0" การเข้ารหัส = "UTF -8" Android: versionCode = "1" * Android: versionName = "1.0"> * <use-sdk Android: minsdkversion = "4" /> * <ใช้การกระจาย Android: name = "Android.permission.camera" /> * Android: label = "@string/app_name"> * <activity * Android: name = "facepreview" * Android: label = "@string/app_name" * Android: Screenorientation = "Landscape"> * Android: name = "Android.intent.category.launcher"/> * </intent-filter> * </activity> * </application> * </manifest> */package com.googlecode.javacv.facepreview; นำเข้า Android.app.activity; นำเข้า Android.app.alertdialog; นำเข้า Android.content.context; นำเข้า Android.graphics.canvas; นำเข้า Android.graphics.Color; นำเข้า Android.graphics.imageFormat; นำเข้า Android.graphics.Paint; นำเข้า Android.hardware.camera; นำเข้า Android.hardware.camera.size; นำเข้า Android.os.bundle; นำเข้า Android.view.surfaceholder; นำเข้า Android.view.surfaceview; นำเข้า Android.View.View; นำเข้า Android.View.Window; นำเข้า Android.View.WindowManager; นำเข้า Android.widget.framelayout; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า java.nio.bytebuffer; นำเข้า java.util.list; นำเข้า com.googlecode.javacpp.loader; นำเข้า com.googlecode.javacv.cpp.opencv_objdetect; นำเข้า com.googlecode.javacv.cpp.opencv_core.*; นำเข้า com.googlecode.javacv.cpp.opencv_imgproc.*; นำเข้า com.googlecode.javacv.cpp.opencv_objdetect.*; นำเข้า com.googlecode.javacv.cpp.opencv_highgui.*; // ------------------------------------------------------------------ VACEPREVIEW ขยายกิจกรรมขยายกิจกรรม {เลย์เอาต์เฟรมเลย์เอาต์ส่วนตัว faceview ส่วนตัว; ดูตัวอย่างส่วนตัว mpreview; @Override ป้องกันโมฆะ onCreate (Bundle SavedInstancestate) {// ซ่อนชื่อหน้าต่าง RequestWindowFeature (window.feature_no_title); super.oncreate (SavedInstancestate); getWindow (). addflags (windowmanager.layoutparams.flag_fullscreen); // สร้างมุมมองตัวอย่างของเราและตั้งค่าเป็นเนื้อหาของกิจกรรมของเรา ลอง {layout = framelayout ใหม่ (นี่); faceView = ใหม่ faceView (นี้); mpreview = ตัวอย่างใหม่ (นี่, faceView); layout.addview (mpreview); layout.addview (faceView); SetContentView (เลย์เอาต์); } catch (ioexception e) {e.printstacktrace (); ใหม่ AlertDialog.builder (นี้) .setMessage (e.getMessage ()). สร้าง (). show (); }}} // ------------------------------------------------------------------ คลาส faceView ขยายมุมมองใช้กล้อง PREVIEWCALLBACK {Public Static Final Int Subsampling_factor = 4; private iplimage greymage; ตัวจําแนก cvhaarclassifiercade ส่วนตัว; พื้นที่เก็บข้อมูล CVMEMSTORAGE ส่วนตัว CVSEQ ส่วนตัว public faceView (บริบท facepreview) พ่น IOException {super (บริบท); // โหลดไฟล์ตัวแยกประเภทจากทรัพยากร Java ไฟล์ classiFierFile = loader.extractresource (getClass (), "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml", context.getcachedir (), "classifier", ".xml"); if (classiFierFile == null || classifierfile.length () <= 0) {โยน iOexception ใหม่ ("ไม่สามารถแยกไฟล์ตัวแยกประเภทจากทรัพยากร Java"); } // preload โมดูล OpenCV_OBJDETECT เพื่อแก้ไขข้อผิดพลาดที่รู้จัก loader.load (opencv_objdetect.class); classifier = ใหม่ cvhaarclassifierCascade (cvload (classifierfile.getabsolutepath ())); classifierfile.delete (); if (classifier.isnull ()) {โยน iOexception ใหม่ ("ไม่สามารถโหลดไฟล์ classifier ได้"); } storage = cvmemstorage.create (); } โมฆะสาธารณะ onPreviewFrame (BYTE สุดท้าย [] ข้อมูลกล้องกล้องสุดท้าย) {ลอง {camera.size size = camera.getParameters (). getPreviewSize (); ProcessImage (data, size.width, size.height); camera.addcallbackbuffer (ข้อมูล); } catch (runtimeException e) {// กล้องอาจเพิ่งถูกปล่อยออกมาไม่สนใจ }} void processimage ที่ได้รับการป้องกัน (BYTE [] ข้อมูล, ความกว้าง int, ความสูง int) {// ก่อน, ตัวอย่างภาพของเราและแปลงเป็นสีเทา iplimage int f = subsampling_factor; if (greyimage == null || greatimage.width ()! = width/f || greatimage.height ()! = ความสูง/f) {greatimage = iplimage.create (ความกว้าง/f, ความสูง/f, ipl_depth_8u, 1); } int imageWidth = greyimage.width (); int imageHeight = greyimage.height (); int dataStride = f*ความกว้าง; int imageStride = taryimage.widthstep (); ByteBuffer ImageBuffer = greatiMage.getByTebuffer (); สำหรับ (int y = 0; y <imageHeight; y ++) {int dataline = y*dataStride; int imageline = y*imagestride; สำหรับ (int x = 0; x <imageWidth; x ++) {imageBuffer.put (imageline + x, data [dataline + f*x]); }} iplimage greatimaget = iplimage.create (ความสูง/f, ความกว้าง/f, ipl_depth_8u, 1); //cvsaveimage("/storage/emulated/0/pictures/grayimage.jpg",GrayImage); cvtranspose (สีเทาเทียม, greyimaget); //cvsaveimage("/storage/emulated/0/pictures/grayimaget.jpg",grayimaget); CVFLIP (greatimaget, greatimaget, 0); //cvsaveimage("/storage/emulated/0/pictures/grayimaget_x.jpg",grayimaget); CVFLIP (GAYMAGET, GAYMAGET, 1); //cvsaveimage("/storage/emulated/0/pictures/grayimaget_y.jpg",grayimaget); CVClearMemStorage (Storage); faces = cvhaardetectoBjects (greatimaget, ตัวจําแนก, ที่เก็บ, 1.1, 3, cv_haar_do_canny_pruning); postinvalidate (); } @Override Void onDraw (Canvas Canvas) {Paint Paint = New Paint (); Paint.setColor (Color.Red); Paint.settextsize (20); String s = "facepreview - ด้านนี้ขึ้น"; float textwidth = paint.measureetext (s); Canvas.DrawText (s, (getWidth ()-textWidth)/2, 20, สี); if (faces! = null) {paint.setStrokeWidth (2); paint.setstyle (paint.style.stroke); float scalex = (float) getWidth ()/greyimage.width (); float scaley = (float) getheight ()/greyimage.height (); int total = faces.total (); สำหรับ (int i = 0; i <total; i ++) {cvrect r = cvrect ใหม่ (cvgetseqelem (faces, i)); int x = rx (), y = ry (), w = r.width (), h = r.height (); Canvas.DrawRect (x*scalex, y*scaley, (x+w)*scalex, (y+h)*scaley, สี); }} else {canvas.drawtext ("meiyoujiancedao", (getWidth ()-textWidth)/2, 20, สี); }}} // ------------------------------------------------------------------ ตัวอย่างของชั้นเรียนขยาย SurfaceView ใช้งาน SurfaceHolder.Callback {Surfaceolder Mholder; กล้อง McAmera; Camera.PreviewCallback PreviewCallback; ดูตัวอย่าง (บริบทบริบท, camera.previewcallback PreviewCallback) {super (บริบท); this.previewCallback = PreviewCallback; // ติดตั้ง surfaceholder.callback เพื่อให้เราได้รับการแจ้งเตือนเมื่อพื้นผิว // พื้นฐานถูกสร้างและทำลาย mholder = getholder (); mholder.addcallback (นี่); mholder.settype (surfaceholder.surface_type_push_buffers); } โมฆะสาธารณะ surfacecreated (ผู้ถือครองพื้นผิว) {// พื้นผิวถูกสร้างขึ้นมารับกล้องและบอกว่า // จะวาดที่ไหน mcamera = camera.open (camera.camerainfo.camera_facing_front); ลอง {McAmera.SetPreviewDisplay (ผู้ถือ); } catch (ข้อยกเว้น ioexception) {mcamera.release (); mcamera = null; // TODO: เพิ่มตรรกะการจัดการข้อยกเว้นเพิ่มเติมที่นี่}} โมฆะสาธารณะ soulpasedestroyed (ผู้ถือครองพื้นผิว) {// พื้นผิวจะถูกทำลายเมื่อเรากลับมาดังนั้นหยุดดูตัวอย่าง // เนื่องจากวัตถุ Cameradevice ไม่ใช่ทรัพยากรที่ใช้ร่วมกันจึงเป็นเรื่องสำคัญมาก // สำคัญที่จะปล่อยมันเมื่อกิจกรรมหยุดชั่วคราว mcamera.stoppreview (); mcamera.release (); mcamera = null; } ขนาดส่วนตัว getOptimalPreviewSize (รายการ <size> ขนาด, int w, int h) {ขั้นสุดท้าย double appect_tolerance = 0.05; double targetRatio = (สองเท่า) w / h; if (ขนาด == null) ส่งคืน null; ขนาดที่เหมาะสมที่สุด = null; double mindiff = double.max_value; int targetheight = H; // พยายามหาอัตราส่วนการจับคู่ขนาดและขนาดสำหรับ (ขนาดขนาด: ขนาด) {อัตราส่วนคู่ = (สองเท่า) ขนาด / ขนาด / ขนาด; if (math.abs (อัตราส่วน - targetRatio)> appert_tolerance) ดำเนินการต่อ; if (math.abs (size.height - targetheight) <mindiff) {ompeteratize = size; mindiff = math.abs (size.height - targetheight); }} // ไม่พบหนึ่งการจับคู่อัตราส่วนภาพไม่สนใจข้อกำหนดถ้า (Optimalsize == null) {mindiff = double.max_value; สำหรับ (ขนาดขนาด: ขนาด) {if (math.abs (size.height - targetheight) <Mindiff) {Optimalsize = size; mindiff = math.abs (size.height - targetheight); }}} return optimalsize; } โมฆะสาธารณะ surfacechanged (ผู้ถือ surfaceholder, รูปแบบ int, int w, int h) {// ตอนนี้ที่รู้จักขนาดแล้วให้ตั้งค่าพารามิเตอร์กล้องและเริ่มต้น // ตัวอย่าง กล้องพารามิเตอร์พารามิเตอร์ = mcamera.getParameters (); รายการ <size> sizes = parameters.getSupportedPreviewsizes (); Size Optimalsize = getOptimalPreviewsize (ขนาด, w, h); Parameters.SetPreviewSize (Optimalsize.width, Optimalsize.height); McAmera.SetParameters (พารามิเตอร์); if (previewCallback! = null) {mcamera.setPreviewCallbackWithBuffer (PreviewCallback); camera.size size = parameters.getPreviewsize (); ไบต์ [] data = byte ใหม่ [size.width* size.height* imageformat.getBitsperpixel (parameters.getPreviewFormat ())/8]; mcamera.addcallbackbuffer (ข้อมูล); } mcamera.startpreview (); -以上就是本文的全部内容, 希望对大家的学习有所帮助, 也希望大家多多支持武林网。