本文实例为大家分享了 JavaCV 实现人脸检测功能的具体代码 , 供大家参考 , ,
/ * * Hak Cipta (C) 2010.2011.2012 Samuel Audet * * FacePreview - Perpaduan Facedetect OpenCV dan sampel CamerapReview Android, * dengan JavaCV + JavaCPP sebagai lem di antaranya. * * File ini didasarkan pada camerapreview.java yang datang dengan sampel untuk * Android SDK API 8, Revisi 1 dan berisi pemberitahuan hak cipta berikut: * * Hak Cipta (c) 2007 Proyek Open Source Android * * dilisensikan di bawah lisensi Apache, versi 2.0 ("lisensi"); * Anda tidak boleh menggunakan file ini kecuali sesuai dengan lisensi. * Anda dapat memperoleh salinan lisensi di * * http://www.apache.org/licenses/license-2.0 * * kecuali diharuskan oleh hukum yang berlaku atau disepakati secara tertulis, perangkat lunak * yang didistribusikan di bawah lisensi didistribusikan berdasarkan "sebagaimana adanya", * tanpa jaminan atau ketentuan apa pun, baik yang diungkapkan atau disiratkan. * Lihat lisensi untuk izin yang mengatur bahasa tertentu dan * batasan di bawah lisensi. * * * PENTING - Pastikan file androidmanifest.xml terlihat seperti ini: * * <? Xml versi = "1.0" encoding = "utf -8"?> * <Manifest xmlns: android = "http://schemas.android.com/apk/res/android" * package = "com.googas.android.com Android: VersionCode = "1" * Android: VersionName = "1.0"> * <menggunakan-SDK Android: MinsDKversion = "4" /> * <use-erymission android: name = "android.permission.camera" /> <use-feature android: name = "android.hardware.camera" /@label "@name =" name = "android.hardware.camera" /@label "@label"@name = "android Android: name = "facePreview" * android: label = "@string/app_name" * android: screenorientation = "landscape"> * <Intent-filter> * <Action Android: name = "android.intent.action.Action"/> <Category/Name = "android * </ manifest> */ package com.googlecode.javacv.facepreview; impor android.app.activity; impor android.app.alertdialog; impor android.content.context; impor android.graphics.canvas; impor android.graphics.color; impor android.graphics.imageformat; impor android.graphics.paint; impor android.hardware.camera; impor android.hardware.camera.size; impor android.os.bundle; impor android.view.surfaceHolder; impor android.view.surfaceview; impor android.view.view; impor android.view.window; impor android.view.windowManager; impor android.widget.framelayout; impor java.io.file; impor java.io.ioException; impor java.nio.bytebuffer; impor java.util.list; impor com.googlecode.javacpp.loader; impor com.googlecode.javacv.cpp.opencv_objdetect; Impor static com.googlecode.javacv.cpp.opencv_core.*; Impor static com.googlecode.javacv.cpp.opencv_imgproc.*; Impor static com.googlecode.javacv.cpp.opencv_objdetect.*; Impor static com.googlecode.javacv.cpp.opencv_highgui.*; // ---------------------------------------------------------------------- Kelas Publik FacePreview memperluas aktivitas {Private Framelayout Layout; faceview faceview pribadi; pratinjau pribadi mPreview; @Override Protected void onCreate (bundle savedInstanceState) {// Sembunyikan judul jendela. requestWindowFeature (window.feature_no_title); super.onCreate (savedInstancestrate); getWindow (). addFlags (windowManager.layoutparams.flag_fullscreen); // Buat tampilan pratinjau kami dan atur sebagai konten aktivitas kami. coba {tata letak = framelayout baru (ini); faceview = faceview baru (ini); mPreview = pratinjau baru (ini, faceview); Layout.Addview (mPreview); Layout.AddView (FacEview); setContentView (tata letak); } catch (ioException e) {e.printstacktrace (); alertdialog.builder (ini) .setMessage (e.getMessage ()). Create (). Show (); }}} // ------------------------------------------------------------------ Kelas FACEVIEW memperluas tampilan implementasi kamera.previewCallback {public static int int subsampling_factor = 4; Grayimage iPlimage pribadi; private cvhaarclassifiercascade classifier; Penyimpanan CVMemStorage pribadi; wajah CVSEQ pribadi; faceview publik (konteks facepreview) melempar ioException {super (konteks); // Muat file classifier dari Java Resources. File classifierFile = loader.extractresource (getClass (), "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml", context.getcachedir (), "classifier", ".xml"); if (classifierfile == null || classifierfile.length () <= 0) {lempar ioException baru ("tidak dapat mengekstrak file classifier dari sumber daya java."); } // preload modul opencv_objdetect untuk bekerja di sekitar bug yang diketahui. Loader.load (opencv_objdetect.class); classifier = cvhaarclassifierCascade baru (cvload (classifierfile.getAbsolutePath ())); classifierfile.delete (); if (classifier.isnull ()) {lempar ioException baru ("tidak dapat memuat file classifier."); } penyimpanan = cvmemstorage.create (); } public void onpreviewframe (data byte akhir [], kamera kamera akhir) {coba {camera.size size = camera.getParameters (). getPreviewSize (); ProcessImage (data, size.width, size.height); Camera.AddCallbackBuffer (data); } catch (runtimeException e) {// kamera mungkin baru saja dirilis, abaikan. }} Prosessimage void yang dilindungi (byte [] data, lebar int, tinggi int) {// Pertama, sampel sampel gambar kami dan ubah menjadi iPlimage scale grays f = subsampling_factor; if (grayimage == null || grayimage.width ()! = width/f || grayimage.height ()! = Tinggi/f) {GrayImage = iPLImage.create (lebar/f, tinggi/f, iPL_DEPTH_8U, 1); } int ImageWidth = GrayImage.width (); int ImageHeight = GrayImage.height (); int dataStride = f*lebar; int imagestride = grayimage.widthstep (); Bytebuffer ImageBuffer = GrayImage.getByTeBuffer (); untuk (int y = 0; y <imageHeight; y ++) {int dataline = y*dataStride; int imageline = y*imagestride; untuk (int x = 0; x <imageWidth; x ++) {ImageBuffer.put (imageline + x, data [dataline + f*x]); }} IPLIMAGE GRYMAGET = iPLIMAGE.CREATE (Tinggi/F, Lebar/F, IPL_DEPTH_8U, 1); //cvsaveImage("/storage/emulated/0/pictures/grayimage.jpg".grayimage); cvtranspose (Grayimage, Grayimaget); //cvsaveimage("/storage/emulated/0/pictures/grayimaget.jpg".grayimaget); CVFLIP (Grayimaget, Grayimaget, 0); //cvsaveImage("/storage/emulated/0/pictures/grayimaget_x.jpg".grayimaget); CVFLIP (Grayimaget, Grayimaget, 1); //cvsaveImage("/storage/emulated/0/pictures/grayimaget_y.jpg".grayimaget); CVClearMemStorage (penyimpanan); wajah = cvhaardetectObjects (Grayimaget, classifier, Storage, 1.1, 3, cv_haar_do_canny_pruning); postinvalidate (); } @Override Protected Void OnDraw (Canvas Canvas) {Paint Paint = New Paint (); Paint.setColor (Color.Red); Paint.setTextSize (20); String s = "facepreview - sisi ini ke atas."; float textwidth = Paint.measureText (s); canvas.drawtext (s, (getWidth ()-textwidth)/2, 20, cat); if (faces! = null) {Paint.setstrokeWidth (2); Paint.setstyle (Paint.Style.Stroke); float scalex = (float) getWidth ()/grayimage.width (); float scaley = (float) getheight ()/greyimage.height (); int total = faces.total (); untuk (int i = 0; i <total; i ++) {cvrect r = cvrect baru (cvgetSeQelem (wajah, i)); int x = rx (), y = ry (), w = r.width (), h = r.height (); canvas.drawrect (x*scalex, y*scaley, (x+w)*scalex, (y+h)*scaley, cat); }} else {canvas.drawtext ("meiyoujiancedao", (getWidth ()-textwidth)/2, 20, cat); }}} // ------------------------------------------------------------------ Kelas Pratinjau Memperluas SurfaceView mengimplementasikan pemegang permukaan.callback {pemegang permukaan mholder; Kamera McAmera; Camera.PreviewCallback PreviewCallback; Pratinjau (konteks konteks, camera.previewCallback previewCallback) {super (konteks); this.previewCallback = PreviewCallback; // Pasang pemegang permukaan. mholder = GetHolder (); mholder.addcallback (ini); mholder.setType (SurfaceHolder.Surface_Type_Push_buffers); } public void Surfacecreated (SurfaceHolder Holder) {// Permukaan telah dibuat, dapatkan kamera dan katakan di mana // untuk menggambar. mcamera = camera.open (camera.camerainfo.camera_facing_front); coba {mcamera.setPreviewDisplay (holder); } catch (IoException Exception) {mcamera.release (); mcamera = null; // TODO: Tambahkan lebih banyak logika penanganan pengecualian di sini}} public void permukaan permukaan (pemegang pemegang permukaan) {// Permukaan akan dihancurkan saat kita kembali, jadi hentikan pratinjau. // Karena objek Cameradevice bukan sumber daya bersama, sangat // penting untuk melepaskannya ketika aktivitas dijeda. mcamera.stoppreview (); mcamera.release (); mcamera = null; } ukuran pribadi getOptimalpreviewSize (Daftar <Size> ukuran, int w, int h) {final double aspek_tolerance = 0,05; ganda targetratio = (ganda) w / h; if (ukuran == null) return null; Ukuran optimalSize = null; ganda mindiff = double.max_value; int targetheight = h; // Coba temukan rasio dan ukuran aspek pencocokan ukuran untuk (ukuran ukuran: ukuran) {rasio ganda = (ganda) ukuran.width / size.height; if (math.abs (rasio - targetratio)> aspek_tolerance) lanjutkan; if (math.abs (size.height - targetHeight) <mindiff) {optimalSize = size; mindiff = math.abs (size.height - targetHeight); }} // Tidak dapat menemukan yang cocok dengan rasio aspek, abaikan persyaratan jika (optimalSize == null) {mindiff = double.max_value; untuk (ukuran ukuran: ukuran) {if (math.abs (size.height - targetHeight) <mindiff) {optimalSize = size; mindiff = math.abs (size.height - targetHeight); }}} return optimalSize; } public void SurfaceChanged (pemegang permukaan, format int, int w, int h) {// Sekarang ukurannya diketahui, atur parameter kamera dan mulai // pratinjau. Parameter Camera.Parameters = mcamera.getParameters (); Daftar <Size> ukuran = parameter.getSupportedPreviewSizes (); Ukuran optimalSize = getOptimalPreviewSize (ukuran, w, h); parameter.setPreviewSize (optimalSize.width, optimalSize.height); mcamera.setParameters (parameter); if (previewCallback! = null) {mcamera.setPreviewCallbackWithBuffer (previewCallback); Camera.size size = parameter.getPreviewSize (); byte [] data = byte baru [size.width* size.height* imageformat.getbitsperpixel (parameter.getPreviewFormat ())/8]; mcamera.addcallbackbuffer (data); } mcamera.startpreview (); }}以上就是本文的全部内容 , 希望对大家的学习有所帮助 , 也希望大家多多支持武林网。