本文实例为大家分享了 javacv 实现人脸检测功能的具体代码 , 供大家参考 具体内容如下
/ * * Copyright (c) 2010,2011,2012 Samuel Audet * * Facepreview - Una fusión de las muestras de Camerapreview de Cameraprevieid de OpenCV y Android, * con Javacv + Javacpp como el pegamento en el medio. * * Este archivo se basó en CamerApReview.java que vino con las muestras para * Android SDK API 8, Revisión 1 y contenía el siguiente aviso de copyright: * * Copyright (c) 2007 El Proyecto de código abierto de Android * * licencia bajo la licencia Apache, versión 2.0 (la licencia "); * No puede usar este archivo, excepto de conformidad con la licencia. * Puede obtener una copia de la licencia en * * http://www.apache.org/licenses/license-2.0 * * A menos que sea requerido por la ley aplicable o acordado por escrito, el software * distribuido bajo la licencia se distribuye sobre una base "como es", * sin garantías o condiciones de ningún tipo, ya sea expresa o implícita. * Consulte la licencia para los permisos de gobierno específicos que rigen el idioma y * limitaciones bajo la licencia. * * * IMPORTANTE - Asegúrese de que el archivo androidManifest.xml se vea así: * * <? Xml versión = "1.0" encoding = "utf -8"?> * <Manifest xmlns: android = "http://schemas.android.com/apk/res/android" * paquete = "com.googlecode.javacv.faCaid" * * * * * * * * * * * android: versionCode = "1" * Android: versionName = "1.0"> * <usos-sdk android: minsdkversion = "4" /> * <use-permission android: name = "android.permission.camera" /> * <usos-feature android: name = "android.hardware.camera" /> * <ractor android: labory: labory: "@string /"@string " * Android: name = "facepreview" * android: etiqueta = "@string/app_name" * android: scseyorientation = "sandscape"> * <intent-filter> * <Action android: name = "android.intent.action.main"/> * <category android: name = "android.intent.category.launcher"/> * </intent-filter> * </intent-filter> * <////ortation * * </ortent-filter> </Application> * </manifest> */paquete com.googlecode.javacv.facePreview; importar android.app.activity; importar android.app.alertdialog; importardroid.content.context; importar android.graphics.canvas; importardroid.graphics.color; importar android.graphics.ImageFormat; importar android.graphics.Paint; importar android.hardware.camera; importar android.hardware.camera.size; importar android.os.bundle; importar android.view.surfaceholder; importardroid.view.surfaceView; importar android.view.view; importardroid.view.window; importar android.view.windowmanager; importar android.widget.framelayout; import java.io.file; import java.io.ioException; import java.nio.bytebuffer; import java.util.list; import com.googlecode.javacpp.loader; import com.googlecode.javacv.cpp.opencv_objdetect; import static com.googlecode.javacv.cpp.opencv_core.*; import static com.googlecode.javacv.cpp.opencv_imgproc.*; import static com.googlecode.javacv.cpp.opencv_objdetect.*; import static com.googlecode.javacv.cpp.opencv_highgui.*; // ----------------------------------------------------------------- FaceView privado FaceView; Vista previa privada MPreview; @Override protegido void onCreate (Bundle SaveDInStancestate) {// Oculta el título de la ventana. request WindowFeature (Window.Feature_No_Title); super.Oncreate (SavedInstancestate); getwindow (). addflags (WindowsManager.LayoutParams.flag_fullScreen); // Crear nuestra vista previa y establecerla como el contenido de nuestra actividad. intente {diseño = new Framelayout (esto); FACEVIEW = new FaceView (esto); mpreview = nueva vista previa (this, faceView); Layout.addView (mpreview); Layout.AddView (faceView); setContentView (diseño); } catch (ioException e) {E.PrintStackTrace (); nuevo alertdialog.builder (this) .setMessage (e.getMessage ()). create (). show (); }}} // ------------------------------------------------------------------ La clase FaceView extiende la vista implementa cámara. iPlimage privado Grayimage; clasificador privado CVHAARClassifierCascade; almacenamiento privado de CVMemStorage; caras privadas de CVSEQ; Public FaceView (contexto de Facepreview) lanza ioexception {super (contexto); // Cargue el archivo clasificador de los recursos Java. File ClassifierFile = Loader.ExtracTresource (getClass (), "/com/googlecode/javacv/facePreview/haarcascade_frontalface_alt2.xml", context.getCachedir (), "classifier", ".xml"); if (classifierFile == null || classifierFile.length () <= 0) {lanzar nueva IOException ("no pudo extraer el archivo clasificador del recurso Java."); } // precarga el módulo OpenCV_OBJDetect para trabajar alrededor de un error conocido. Loader.load (opencv_objdetect.class); clasificador = nuevo CVHAARClassifierCascade (cvLoad (classifierFile.getAbSolutePath ())); classifierfile.delete (); if (classifier.isnull ()) {throw new ioException ("no se pudo cargar el archivo clasificador"); } almacenamiento = cvMemStorage.Create (); } public void onpreviewframe (datos finales byte [], cámara de cámara final) {try {coper.size size = cámaras.getParameters (). getPreviewSize (); ProcessImage (datos, size.width, size.Height); Camera.addCallbackBuffer (datos); } Catch (RuntimeException e) {// La cámara probablemente acaba de ser lanzada, ignore. }} protegido void processImage (byte [] data, int width, int altura) {// Primero, muestre nuestra imagen y conviértala en una escala de gris iPlimage int f = subsample_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*width; int imagestride = GrayImage.Widthstep (); Bytebuffer imageBuffer = GrayImage.getByteBuffer (); for (int y = 0; y <imageHeight; y ++) {int dataLine = y*dataTride; int Imageline = y*Imagestride; for (int x = 0; x <imageWidth; x ++) {imageBuffer.put (imagine + x, data [dataLine + f*x]); }} IPlimage Grayimaget = iPlimage.Create (altura/f, ancho/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/emuled/0/pictures/grayimaget_y.jpg",grayimaget); CVCLearMemStorage (almacenamiento); Faces = cvhaardetectObjects (Grayimaget, clasificador, almacenamiento, 1.1, 3, cv_haar_do_canny_pruning); postinValidate (); } @Override protegido void onDraw (lienzo de lona) {pintura pintura = new Paint (); pintar.setColor (color.red); pintar.settextsize (20); Cadena S = "Facepreview - Este lado hacia arriba"; float textwidth = pintar.measuretext (s); Canvas.DrawText (s, (GetWidth ()-TextWidth)/2, 20, pintura); if (face! = null) {pintar.setstrokewidth (2); pintar.setstyle (pintar.style.stroke); float scalex = (float) getwidth ()/grayimage.width (); float scaley = (float) getheight ()/grayimage.height (); int total = face.total (); for (int i = 0; i <total; i ++) {cvrect r = new cvrect (cvgetseqelem (caras, i)); int x = rx (), y = ry (), w = r.width (), h = r.height (); Canvas.Drawrect (x*escalax, y*escala, (x+w)*escalax, (y+h)*escala, pintar); }} else {canvas.drawText ("meiyoujiatecedao", (getwidth ()-textwidth)/2, 20, pintar); }}} // --------------------------------------------------- Camera McAmera; Camera.PreviewCallback PreviewCallback; Vista previa (contexto context, cámara.previewCallback PreviewCallback) {super (context); this.PreviewCallback = PreviewCallback; // Instale un SurfaceHolder.callback, por lo que nos notificamos cuando se crea y destruye la superficie subyacente. mholder = getholder (); mholder.addCallback (esto); mholder.settype (SurfaceHolder.surface_type_push_buffers); } public void Surfacecreated (SurfaceHolder Holder) {// Se ha creado la superficie, adquiere la cámara y dígale dónde // para dibujar. McAmera = Camera.open (Camera.camerainfo.camera_facing_front); intente {mcamera.setPreviewDisplay (Holder); } Catch (excepción ioException) {mcamera.release (); mcamera = nulo; // TODO: Agregue más lógica de manejo de excepciones aquí}} public void Surfuredestroyed (SurfaceHolder Holder) {// La superficie se destruirá cuando regresemos, así que detenga la vista previa. // Debido a que el objeto Cameradevice no es un recurso compartido, es muy importante liberarlo cuando la actividad se detiene. mcamera.stoppreview (); mcamera.Release (); mcamera = nulo; } tamaño privado getOptimalpreviewSize (List <size> tamaños, int w, int h) {final doble aspecto_tolerance = 0.05; doble Targetratio = (doble) w / h; if (tamaños == nulo) return null; Tamaño optimalsize = nulo; Double Mindiff = double.max_value; int targetheight = h; // Intenta encontrar una relación de aspecto de coincidencia de tamaño y tamaño para (tamaño de tamaño: tamaños) {doble relación = (doble) size.width / size.height; if (math.abs (relación - targetRatio)> aspecto_tolerance) continuar; if (math.abs (size.Height - Targetheight) <nindiff) {optimalSize = size; Mindiff = Math.abs (size.Height - Targetheight); }} // No puedo encontrar el que coincida con la relación de aspecto, ignore el requisito if (optimalSize == null) {mindiff = double.max_value; para (tamaño de tamaño: tamaños) {if (math.abs (size.height - targetheight) <nindiff) {optimalSize = size; Mindiff = Math.abs (size.Height - Targetheight); }}} return óptimsize; } public void SurfaceCechanged (SurfaceHolder Holder, Int Format, Int W, Int H) {// Ahora que se conoce el tamaño, configure los parámetros de la cámara y comience // la vista previa. Camera.Parameters Parameters = McAmera.getParameters (); Lista <size> tames = parámetros.getSupportedPreviewSizes (); Tamaño óptimos = getOptimalPreviewSize (tamaños, W, H); parámetros.setPreviewSize (OptimalSize.Width, Optimalsize.Height); mcamera.setParameters (parámetros); if (PreviewCallback! = NULL) {McAmera.SetPreviewCallBackWithBuffer (PreviewCallback); Camera.size size = parameters.getPreviewSize (); byte [] data = new Byte [size.width* size.height* imageFormat.getBitsPePixel (parámetros.getPreviewFormat ())/8]; mcamera.addcallbackbuffer (datos); } mcamera.startpreview (); }}以上就是本文的全部内容 , 希望对大家的学习有所帮助 也希望大家多多支持武林网。 也希望大家多多支持武林网。