本文实例为大家分享了 javacv 实现人脸检测功能的具体代码 , 供大家参考 , 具体内容如下
/ * * Copyright (C) 2010.2011.2012 Samuel Audet * * FACEPREVIEW - Une fusion des échantillons FACEDETECT d'OpenCV et d'Android, * avec Javacv + Javacpp comme colle entre les deux. * * Ce fichier était basé sur Camerapreview.java qui est venu avec les échantillons pour * Android SDK API 8, Revision 1 et contenait le préavis de droit d'auteur suivant: * * Copyright (C) 2007 Le projet open source Android * * sous licence Apache, version 2.0 (la "licence"); * Vous ne pouvez pas utiliser ce fichier sauf conforme à la licence. * Vous pouvez obtenir une copie de la licence à * * http://www.apache.org/licenses/license-2.0 * * sauf si la loi applicable ou convenu par écrit, le logiciel * distribué sous la licence est distribué sur une base "en tant que", * sans garantie ou conditions de toute nature, exprimée ou impliquée. * Voir la licence pour la langue spécifique régissant les autorisations et les * limitations sous la licence. * * * IMPORTANT - Make sure the AndroidManifest.xml file looks like this: * * <?xml version="1.0" encoding="utf-8"?> * <manifest xmlns:android="http://schemas.android.com/apk/res/android" * package="com.googlecode.javacv.facepreview" * Android: VersionCode = "1" * Android: VersionName = "1.0"> * <usages-sdk Android: minsdkversion = "4" /> * <using-permission Android: name = "android.permission.camera" /> * <use-feature android: name = "Android.hardware.Camera" /> * <application et-alrime: étiquette = "@ stague Android: name = "facePreview" * Android: label = "@ string / app_name" * Android: screenorientation = "Landscape"> * <intention-filter> * <action android: name = "android.intent.action.main" /> * <catégorie Android: name = "Android.intent.category.laper" </ manifest> * / package com.googlecode.javacv.facePreview; import Android.App.activité; import android.app.AlertDialog; import Android.Content.Context; import android.graphics.canvas; import android.graphics.color; import android.graphics.imageFormat; import android.graphics.paint; import android.hardware.camera; import android.hardware.camera.size; import android.os.bundle; import Android.view.SurfaceHolder; import Android.view.surfaceView; import Android.view.view; import android.view.window; import android.view.windowManager; import android.widget.framelayout; Importer java.io.file; Importer java.io.ioException; import java.nio.bytebuffer; Importer java.util.list; import com.googlecode.javacpp.loader; import com.googlecode.javacv.cpp.opeccv_objDetect; import static com.googlecode.javacv.cpp.opecvv_core. *; Importer static com.googlecode.javacv.cpp.opeccv_imgproc. *; Importer static com.googlecode.javacv.cpp.opencv_objDetect. *; Importer static com.googlecode.javacv.cpp.opencv_highgui. *; // ---------------------------------------------------------------------- Classe publique FACEPREVIEW étend l'activité {Private Framelayout Disposition; FACEVIED PRIVÉE FACEVIED; Aperçu privé MPREVIEW; @Override Protected void onCreate (bundle SavedInstanceState) {// Masquez le titre de la fenêtre. requestwindowFeature (window.feature_no_title); super.onCreate (SavedInstancEstate); getWindow (). addFlags (windowManager.LayoutParams.flag_fullScreen); // Créez notre vue d'aperçu et définissez-le comme le contenu de notre activité. try {Layout = new FrameLayout (this); faceView = new faceView (this); mpreView = new Aperçu (this, faceView); Layout.AddView (mpreView); Layout.AddView (faceView); setContentView (disposition); } catch (ioException e) {e.printStackTrace (); new alertDialog.builder (this) .setMessage (e.getMessage ()). create (). show (); }}} // ---------------------------------------------------------------------- Class FaceView étend la vue implémente CAMERA.PREVIEWCALLBACK {public static final int subsampling_factor = 4; Iplimage privé Grayimage; classificateur privé cvhaarclassifierCascade; Stockage privé CVMemStorage; visages cvseq privés; Public FaceView (FACEPREVIEW Context) lève ioException {super (context); // Chargez le fichier de classificateur à partir des ressources Java. File ClassifierFile = Loder.ExtractResource (getClass (), "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml", context.getCachedir (), "Classifier", ".xml"); if (classifierFile == null || ClassifierFile.Length () <= 0) {Throw New ioException ("n'a pas pu extraire le fichier de classificateur de la ressource Java."); } // Précharge du module OpenCV_OBJDETECT pour contourner un bogue connu. Lourder.load (openccv_objdetect.class); Classifier = new CvhaArClassifierCascade (cvload (classifierfile.getAbsolutepath ())); ClassifierFile.Delete (); if (classifier.isnull ()) {lancer une nouvelle ioException ("ne peut pas charger le fichier de classificateur."); } stockage = cvMemStorage.Create (); } public void onPreViewFrame (Data Byte [] final, caméra finale) {try {caméra.size size = caméra.getParameters (). getPreViewSize (); ProcessImage (données, taille.width, size.height); caméra.addcallbackbuffer (données); } catch (runtimeException e) {// La caméra vient probablement d'être publiée, ignore. }} Protected void ProcessImage (byte [] data, int largeth, int height) {// Tout d'abord, échantillonner notre image et les convertir en un iplimage de gris int f = subsampling_factor; if (grayImage == null || grayImage.width ()! = width / f || grayimage.height ()! = height / f) {grayImage = iPlimage.create (width / f, height / f, ipl_depth_8u, 1); } int imagewidth = grayImage.Width (); int imageHeight = grayImage.height (); int datastride = f * largeur; int imagestride = grayimage.widthStep (); ByteBuffer ImageBuffer = GrayImage.getByteBuffer (); pour (int y = 0; y <ImageHeight; y ++) {int dataline = y * datastride; Int Imageline = y * Imagestride; pour (int x = 0; x <imagewidth; x ++) {imageBuffer.put (imageline + x, data [dataline + f * x]); }} IPlimage GrayImaget = iPlimage.create (hauteur / f, largeur / f, ipl_depth_8u, 1); //cvsaveimage("/storage/emulate/0/pictures/grayimage.jpg",grayimage); cvTransspose (Grayimage, Grayimaget); //cvsaveimage("/storage/emulate/0/pictures/grayimaget.jpg",grayimaget); cvflip (Grayimaget, Grayimaget, 0); //cvsaveimage("/storage/emulate/0/pictures/grayimaget_x.jpg",grayimaget); cvflip (Grayimaget, Grayimaget, 1); //cvsaveimage("/storage/emulate/0/pictures/grayimaget_y.jpg",grayimaget); cvClearMemStorage (stockage); faces = cvhaardeTectObjects (GrayImaget, classificateur, stockage, 1.1, 3, cv_haar_do_cany_pruning); postinvalidate (); } @Override Protected void ondraw (Canvas Canvas) {peinture peinture = new Paint (); peinture.setColor (Color.Red); peinture.seTTextSize (20); String s = "facePreview - ce côté vers le haut."; float textwidth = peinture.measureText (s); Canvas.DrawText (S, (getWidth () - TextWidth) / 2, 20, peinture); if (visages! = null) {peinture.setstrokewidth (2); peinture.setStyle (peinture.style.stroke); float scalex = (float) getWidth () / grayImage.width (); float scaley = (float) getheight () / grayImage.height (); int total = faces.total (); pour (int i = 0; i <total; i ++) {cvrect r = new 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, peinture); }} else {canvas.drawText ("meiyoujiancedao", (getWidth () - textwidth) / 2, 20, peinture); }}} // ---------------------------------------------------------------------- L'aperçu de la classe étend la surfaceView implémente surfaceholder.callback {SurfaceHolder mHolder; Camera McAmera; Caméra.PreViewCallback AperçuCallback; Aperçu (contexte contextuel, appareil photo.PreViewCallback préviewCallback) {super (contexte); this.preViewCallback = préviewCallback; // Installez un surfaceholder.Callback afin que nous soyons informés lorsque la surface sous-jacente est créée et détruite. mHolder = getholder (); mHolder.addcallback (this); mHolder.setType (surfaceholder.surface_type_push_buffers); } Public Void Surfacecrened (Holder de surface) {// La surface a été créée, acquérir la caméra et lui dire où // à dessiner. mcamera = caméra.open (caméra.camerainfo.camera_facing_front); essayez {mcamera.setPreViewDisplay (Holder); } catch (IoException Exception) {mcamera.release (); McAmera = null; // TODO: Ajouter plus de logique de gestion des exceptions ici}} public void surfacedEstroyed (Surfaceholder Holder) {// Surface sera détruite à notre retour, alors arrêtez l'aperçu. // Parce que l'objet CameraDevice n'est pas une ressource partagée, il est très important de le libérer lorsque l'activité est interrompue. mcamera.stoppreview (); mcamera.release (); McAmera = null; } Taille privée getOptiMalPreViewSize (List <Size> tailles, int w, int h) {final double aspect_toleance = 0,05; double cibleratio = (double) w / h; if (tailles == null) renvoie null; Taille OptimalSize = NULL; Double MindIFF = double.max_value; int targetheight = h; // Essayez de trouver un rapport d'aspect et de taille de correspondance de taille pour (taille de taille: tailles) {Double Ratio = (double) taille.Width / Taille.Height; if (math.abs (ratio - cibleratio)> aspect_toleance) continue; if (math.abs (size.height - targetheight) <MindIFF) {OptimalSize = size; MindIff = math.abs (size.height - Targetheight); }} // Impossible de trouver celui qui correspond au rapport d'aspect, ignorez l'exigence if (optimalSize == null) {MindIFF = double.max_value; pour (taille de taille: tailles) {if (math.abs (size.height - targetheight) <MindIFF) {OptimalSize = size; MindIff = math.abs (size.height - Targetheight); }}} return OptimalSize; } public void SurfaceChanged (Surfaceholder Holder, int Format, int w, int h) {// Maintenant que la taille est connue, configurez les paramètres de la caméra et commencez // l'aperçu. CAMERS.PARAMETERS Paramètres = McAmera.GetParameters (); List <Size> tailles = paramètres.getsupportedPreViewSizes (); Size OptimalSize = getOptimalPreViewSize (tailles, w, h); Paramètres.SetPreViewSize (OptimalSize.Width, OptimalSize.Height); mcamera.setParameters (paramètres); if (préviewcallback! = null) {mcamera.setpreviewcallbackwithbuffer (préviewcallback); Caméra.size size = paramètres.getPreViewSize (); octet [] data = nouveau octet [size.width * size.height * imageFormat.getBitsPerPixel (paramètres.getPreViewFormat ()) / 8]; mcamera.addcallbackbuffer (données); } mcamera.startPreview (); }}以上就是本文的全部内容 , 希望对大家的学习有所帮助 , 也希望大家多多支持武林网。