本文实例为大家分享了 javacv 实现人脸检测功能的具体代码 供大家参考 供大家参考 具体内容如下 具体内容如下
/ * * Copyright (C) 2010, 2011,2012 Сэмюэл Аудет * * Facepreview - слияние образцов Faceletect Opencv и Android, * с Javacv + Javacpp в качестве клея между ними. * * Этот файл был основан на camerapReview.java, который поставлялся с образцами для * Android SDK API 8, Revision 1 и содержал следующее уведомление об авторском праве: * * Copyright (C) 2007 Проект с открытым исходным кодом Android * * Лицензированная по лицензии Apache, версия 2.0 («Лицензия»); * Вы не можете использовать этот файл, кроме как в соответствии с лицензией. * Вы можете получить копию лицензии по адресу * * http://www.apache.org/licenses/license-2.0 * *, если не требуется применимый закон или не согласен в письменной форме, программное обеспечение *, распределено по лицензии, распределяется на «как это», * без гарантий или условий любого рода, либо экспрессии, либо подразумевается. * См. Лицензию для конкретного языка, регулирующих разрешения и * ограничения по лицензии. * * * Важно - убедитесь, что файл androidmanifest.xml выглядит следующим образом: * * <? Xml version = "1.0" Encoding = "UTF-8"?> * <Manifest xmlns: android = "http://schemas.android.com/apk/res/android" * package = "com.goglecode.javacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacvacve.japk/res/android" android:versionCode="1" * android:versionName="1.0" > * <uses-sdk android:minSdkVersion="4" /> * <uses-permission android:name="android.permission.CAMERA" /> * <uses-feature android:name="android.hardware.camera" /> * <application android:label="@string/app_name"> * <activity * android:name="FacePreview" * android:label="@string/app_name" * android:screenOrientation="landscape"> * <intent-filter> * <action android:name="android.intent.action.MAIN" /> * <category android:name="android.intent.category.LAUNCHER" /> * </intent-filter> * </activity> * </application> * </manifest> */package com.googlecode.javacv.facepreview; Импорт Android.App.Activity; Импорт Android.app.alertdialog; Import Android.content.context; Import Android.graphics.canvas; Импорт Android.graphics.color; Импорт Android.graphics.imageformat; Импорт Android.graphics.paint; Импорт Android.hardware.camera; Import Android.hardware.camera.size; Импорт Android.os.bundle; Import Android.view.surfaceholder; Import Android.View.surfaceView; Импорт Android.View.View; Импорт Android.View.Window; Import Android.View.WindowManager; Import 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; импорт static com.googlecode.javacv.cpp.opencv_core.*; импорт static com.googlecode.javacv.cpp.opencv_imgproc.*; импорт static com.googlecode.javacv.cpp.opencv_objdetect.*; Импорт static com.googlecode.javacv.cpp.opencv_higgui.*; // ----------------------------------------------------------------------------- FacePreview Extaintion {Private Framelayout Layout; Частный FaceView FaceView; Частный предварительный просмотр mpreview; @Override Protected void Oncreate (Bundle SavedInstanceState) {// скрыть заголовок окна. requestWindowFeature (window.feature_no_title); Super.oncreate (saveInstanceState); getWindow (). AddFlags (windowmanager.layoutparams.flag_fullScreen); // Создание нашего представления предварительного просмотра и установите его как содержание нашей деятельности. try {layout = new Framelayout (this); faceView = new FaceView (это); mpreview = новый предварительный просмотр (это, faceview); mayout.addview (mpreview); layout.addview (faceview); setContentView (макет); } catch (ioException e) {e.printstackTrace (); new alertdialog.builder (this) .setMessage (e.getMessage ()). Create (). Show (); }}} // ---------------------------------------------------------------------- класс FaceView Extends View Imerings Camera.previewCallback {public Static Final int subsampling_factor = 4; Частный iplimage greyimage; Частный классификатор CVHAARCLASSIFIERCASCADE; Частное хранилище CVMemStorage; частные лица CVSEQ; Public FaceView (контекст FacePreview) бросает ioException {super (context); // Загрузите файл классификатора из 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) {бросить новое ioexception («Не удалось извлечь файл классификатора из ресурса Java.»); } // Предварительно загрузить модуль opencv_objdetect для работы вокруг известной ошибки. Loader.Load (openCV_Objdetect.class); classifier = new cvhaarclassifiercascade (cvload (classifierfile.getabsolutepath ())); classifierfile.delete (); if (classifier.isnull ()) {бросить новое ioexception («Не удалось загрузить файл классификатора.»); } storage = cvmemStorage.create (); } public void OnPreviewFrame (Final Byte [] Data, Final Camera Camera) {try {Camera.size size = camera.getParameters (). getPreviewSize (); ProcessImage (данные, размер. Camera.addcallbackbuffer (data); } catch (runtimeexception e) {// Камера, вероятно, только что была выпущена, игнорируйте. }} Защищенный void processimage (byte [] data, int width, int height) {// сначала, погрузитесь в наше изображение и преобразуйте его в серого иплерея INT f = subsampling_factor; if (greyimage == null || greyimage.width ()! = width/f || greyimage.height ()! = height/f) {greyimage = iplimage.create (ширина/f, высота/f, ipl_depth_8u, 1); } int ImageWidth = greyimage.width (); int ImageHeight = greyimage.height (); int datastride = f*width; int ImageStride = greyimage.widthStep (); Bytebuffer imagebuffer = greyimage.getbytebuffer (); for (int y = 0; y <imageHeight; y ++) {int dataline = y*dataStride; int ImageLine = y*ImageStride; for (int x = 0; x <imagewidth; x ++) {imagebuffer.put (ImageLine + x, data [dataline + f*x]); }} Iplimage greyimaget = iplimage.create (высота/f, ширина/f, ipl_depth_8u, 1); //cvsaveimage("/storage/emult/0/pictures/grayimage.jpg",grayimage); cvtranspose (greyimage, greyimaget); //cvsaveimage("/storage/emult/0/pictures/grayimaget.jpg",grayimaget); cvflip (greyimaget, greyimaget, 0); //cvsaveimage("/storage/emult/0/pictures/grayimaget_x.jpg",grayimaget); cvflip (greyimaget, greyimaget, 1); //cvsaveimage("/storage/emult/0/pictures/grayimaget_y.jpg",grayimaget); cvclearmemStorage (хранение); FaceS = CVHAARDETECTOBJECTS (GREATIMAGET, классификатор, хранение, 1.1, 3, CV_HAAR_DO_CANY_PRUNING); postinvalidate (); } @Override Protected void onDraw (Canvas Canvas) {Paint Paint = new Paint (); Paint.SetColor (Color.Red); paint.settextize (20); String s = "facepreview - эта сторона вверх."; float textwidth = paint.measuretext (ы); 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 (); for (int i = 0; i <total; i ++) {cvrect r = new cvrect (cvgetSeqelem (лица, i)); int x = rx (), y = ry (), w = r.width (), h = r.height (); canvas.drawrect (x*scalex, y*scaly, (x+w)*scalex, (y+h)*scaly, paint); }} else {canvas.drawtext ("meioujiancedao", (getWidth ()-textWidth)/2, 20, paint); }}} // ---------------------------------------------------------------------- Класс Предварительный просмотр расширяет SurfaceView Surfaceholder.callback {Surfaceholder Mholder; Камера McAmera; Camera.previewCallback PreviewCallback; Preview (контекст контекста, cameman.previewcallback previewcallback) {super (context); this.previewcallback = previewCallback; // Установите поверхностный holder.callback, чтобы мы получили уведомление, когда // базовая поверхность создается и разрушается. mholder = getholder (); mholder.addcallback (это); mholder.settype (Surfaceholder.surface_type_push_buffers); } public void surfacecreated (держатель Surface Holder) {// Поверхность была создана, приобретает камеру и сообщите ей, где // нарисовать. mcamera = camera.open (cameman.camerainfo.camera_faging_front); try {mcamera.setpreviewdisplay (holder); } catch (ioException Exception) {mcamera.release (); mcamera = null; // todo: добавить больше логики обработки исключений здесь}} public void SurfeceDestroyed (Holder Holder) {// Поверхность будет уничтожена при возвращении, так что остановите предварительный просмотр. // Поскольку объект Cameradevice не является общим ресурсом, очень важно выпустить его при приостановке деятельности. mcamera.stoppreview (); mcamera.release (); mcamera = null; } Частный размер getOptimalPreviewSize (List <izere> размеры, int w, int h) {final double aspoy_tolerance = 0,05; Double TargetRatio = (Double) W / H; if (размеры == null) return null; Размер оптимализации = null; Double Mindiff = Double.max_Value; int targetheight = h; // Попробуйте найти соотношение сторон и размер соответствия и размер для (размер: размеры: размеры) {двойное соотношение = (двойное) size.width / size.height; if (math.abs (соотношение - targetratio)> assive_tolerance) продолжить; if (math.abs (size.height - targetheight) <mindiff) {optimalize = size; mindiff = math.abs (size.height - targetheight); }} // Не удается найти одно соответствие соотношению сторон, игнорируйте требование, если (оптимизирует == null) {mindiff = double.max_value; Для (размер: размеры) {if (math.abs (size.height - targetheight) <mindiff) {Optimalize = size; mindiff = math.abs (size.height - targetheight); }}} вернуть оптимализацию; } public void surfaceChanged (держатель владельца поверхности, int format, int w, int h) {// Теперь, когда размер известен, настройте параметры камеры и начинать // Предварительный просмотр. Camera.parameters Параметры = mcamera.getParameters (); List <izes> размеры = параметры. Size Optimalize = getOptimalPreviewSize (размеры, w, h); Parameters.SetPreviewSize (Optimalize.width, оптимализация. Hheight); mcamera.setparameters (параметры); if (previewcallback! = null) {mcamera.setpreviewcallbackwithbuffer (previewCallback); Cameman.size size = parameters.getPreviewSize (); byte [] data = new Byte [size.width* size.height* imageformat.getbitsperpixel (parameters.getPreviewFormat ())/8]; mcamera.addcallbackbuffer (data); } mcamera.StartPreview (); }}以上就是本文的全部内容 , 希望对大家的学习有所帮助 也希望大家多多支持武林网。