本文实例为大家分享了 javacv 实现人脸检测功能的具体代码 , 供大家参考 , 具体内容如下
/ * * حقوق الطبع والنشر (C) 2010،2011،2012 Samuel Audet * * facepreview - مزيج من عينات OpenCv's Facedetect و Android Camerapreview ، * مع Javacv + Javacpp مثل الغراء بينهما. * * استند هذا الملف إلى camerapreview.java التي جاءت مع عينات من * Android SDK API 8 ، المراجعة 1 وتضمنت إشعار حقوق الطبع والنشر التالي: * * حقوق الطبع والنشر (C) 2007 مشروع Android Open Source Project * * المرخص له بموجب ترخيص Apache ، الإصدار 2.0 ("الترخيص") ؛ * لا يجوز لك استخدام هذا الملف إلا في الامتثال للترخيص. * يمكنك الحصول على نسخة من الترخيص على * * http://www.apache.org/licenses/license-2.0 * * ما لم يكن مطلوبًا بموجب القانون المعمول به أو يتم الاتفاق عليه في الكتابة ، يتم توزيع البرمجيات * الموزعة بموجب الترخيص على أساس "كما هو" ، * دون ضمانات أو شروط من أي نوع ، إما صريحة أو ضمنية. * راجع ترخيص الأذونات اللغوية المحددة والقيود * بموجب الترخيص. * * * مهم - تأكد من أن ملف AndroidManifest.xml يشبه هذا: * * <؟ Android: versionCode = "1" * Android: versionName = "1.0"> * <use-sdk android: minsdkversion = "4" /> * <use-perfice android: name = "android.permission.camera" /> * <use-feature android: name = Android: name = "facepreview" * Android: label = "@string/app_name" * android: screenorientation = "landscape"> * <Steent-Filter> * <Action Android: name = "Android.Intent.Action.main"/> <category Android: name = "android.intent.category.launt * </measest> */ 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 ؛ استيراد 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_highgui.*؛ . Privateview FaceView ؛ المعاينة الخاصة mpreview ؛ Override محمية void oncreate (bundle SaveInstancestate) {// إخفاء عنوان النافذة. requestWindowFeature (window.feature_no_title) ؛ super.oncreate (SaveInstancestate) ؛ getWindow (). addFlags (windowManager.layoutparams.flag_fullscreen) ؛ // قم بإنشاء عرض المعاينة الخاص بنا وقم بتعيينه كمحتوى لنشاطنا. حاول {layout = new FramElayout (this) ؛ FaceView = New FaceView (هذا) ؛ mpReview = معاينة جديدة (هذا ، FaceView) ؛ layout.addview (mpReview) ؛ layout.addview (FaceView) ؛ setContentView (التصميم) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ new AlertDialog.builder (this) .setMessage (E.GetMessage ()). create (). show () ؛ }}} // ------------------------------------------------------------------------------------ extens extens expens expants classe. iPlimage Private Grayimage ؛ Cvhaarclassifiercascade المصنف الخاص ؛ تخزين CVMemStorage الخاص ؛ وجوه CVSEQ الخاصة ؛ Public FaceView (سياق FacePreview) يلقي IoException {Super (Context) ؛ // تحميل ملف المصنف من Java Resources. ملف classifierfile = loader.extractresource (getClass () ، "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml" ، context.getCachedir () ، "Classifier" ، ".xml") ؛ if (classifierfile == null || classifierfile.length () <= 0) {رمي ioException جديد ("لا يمكن استخراج ملف المصنف من Java Resource.") ؛ } // التحميل المسبق للوحدة OpenCV_ObjDetect للعمل حول خطأ معروف. loader.load (opencv_objdetect.class) ؛ المصنف = جديد cvhaarclassifiercascade (cviled (classifierfile.getabsolutepath ())) ؛ classifierfile.delete () ؛ if (classifier.isnull ()) {رمي ioException جديد ("لا يمكن تحميل ملف المصنف.") ؛ } التخزين = cvMemStorage.create () ؛ } public void onPreviewFrame (البيانات النهائية [] ، كاميرا الكاميرا النهائية) {try {camera.size size = camera.getParameters (). getPreviewsize () ؛ ProcessImage (البيانات ، الحجم. camera.addcallbackbuffer (Data) ؛ } catch (RunTimeException e) {// ربما تم إصدار الكاميرا للتو ، تجاهل. }} processimage processiMage المحمي (BYTE [] ، عرض int ، ارتفاع int) {// أولاً ، قم بتدوين صورتنا وتحويلها إلى grayscale iplimage int f = subampling_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 datustride = f*width ؛ int ImageStride = grayimage.widthstep () ؛ bytebuffer imageBuffer = grayimage.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 grayimaget = iplimage.create (الارتفاع/f ، العرض/f ، ipl_depth_8u ، 1) ؛ //cvsaveimage("/storage/emited/0/pictures/grayimage.jpg"،grayimage) ؛ CvTranspose (GrayImage ، Grayimaget) ؛ //cvsaveimage("/storage/emited/0/pictures/grayimaget.jpg"،grayimaget) ؛ cvflip (grayimaget ، grayimaget ، 0) ؛ //cvsaveimage("/storage/emited/0/pictures/grayimaget_x.jpg"،grayimaget) ؛ cvflip (Grayimaget ، Grayimaget ، 1) ؛ //cvsaveimage("/storage/emited/0/pictures/grayimaget_y.jpg"،grayimaget) ؛ cvCLearMemStorage (التخزين) ؛ الوجوه = cvhaardetectObjects (grayimaget ، المصنف ، التخزين ، 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 - هذا الجانب UP." ؛ float textwidth = paint.measureText (s) ؛ canvas.drawtext (s ، (getWidth ()-textwidth)/2 ، 20 ، paint) ؛ if (faces! = null) {paint.SetStrokeWidth (2) ؛ paint.setStyle (paint.style.stroke) ؛ float scalex = (float) getWidth ()/grayimage.width () ؛ float scaley = (float) getheight ()/grayimage.height () ؛ int total = faces.total () ؛ لـ (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 ، paint) ؛ }} آخر {canvas.drawtext ("meiyoujiancedao" ، (getWidth ()-textwidth)/2 ، 20 ، paint) ؛ }}} // ------------------------------------------------------------------------------- معاينة فئة تمديد SurfaceView الأدوات السطحية. كاميرا مكاميرا camera.previewCallback PreviewCallback ؛ معاينة (سياق السياق ، الكاميرا. this.previewCallback = معاينة ؛ // قم بتثبيت حامل السطح. mholder = getholder () ؛ mholder.addcallback (هذا) ؛ mholder.settype (surfaceholder.surface_type_push_buffers) ؛ } public void surfacecreated (حامل السطح) {// تم إنشاء السطح ، والحصول على الكاميرا وأخبرها أين // للرسم. mcamera = camera.open (camera.camerainfo.camera_facing_front) ؛ حاول {mcamera.setPreviewDisplay (Holder) ؛ } catch (IoException issection) {mcamera.release () ؛ McAmera = فارغة ؛ // TODO: أضف المزيد من المنطق معالجة الاستثناءات هنا}} باطاع الفراغ العام يدوم (حامل حامل السطح) {// surface عندما نعود ، لذا توقف عن المعاينة. // لأن كائن CamerAdevice ليس موردًا مشتركًا ، فمن المهم للغاية // إطلاقه عند توقف النشاط. mcamera.stoppreview () ؛ McAmera.Release () ؛ McAmera = فارغة ؛ } الحجم الخاص getOpTimalPreviewSize (قائمة <Sives> بأحجام ، int w ، int h) {Final double side_tolerance = 0.05 ؛ Double TargetRatio = (double) w / h ؛ إذا (الأحجام == فارغة) إرجاع فارغ ؛ الحجم المثالي = فارغ ؛ mindiff double = double.max_value ؛ int targetheight = h ؛ // حاول العثور على نسبة عرض إلى حجم مطابقة الحجم لـ (الحجم الحجم: الأحجام) {نسبة مزدوجة = (مزدوج) size.width / size.height ؛ إذا (Math.ABS (نسبة - TargetRatio)> Side_tolerance) متابعة ؛ if (math.abs (size.hight - targetheight) <mindiff) {popimalize = size ؛ mindiff = math.abs (size.hight - targetheight) ؛ }} // لا يمكن العثور على واحد يتطابق مع نسبة العرض إلى الارتفاع ، وتجاهل المتطلبات إذا (potormalize == null) {mindiff = double.max_value ؛ لـ (الحجم الحجم: الأحجام) {if (math.abs (size.hight - targetheight) <mindiff) {OptimalSize = size ؛ mindiff = math.abs (size.hight - targetheight) ؛ }}} إرجاع الأمثل ؛ } public void surfacechanged (حامل السطح ، تنسيق int ، int w ، int h) {// الآن بعد أن أصبح الحجم معروفًا ، قم بإعداد معلمات الكاميرا وتبدأ // المعاينة. camera.parameters المعلمات = mcamera.getParameters () ؛ قائمة <Size> sizes = parameters.getSupportedPreviewSizes () ؛ الحجم المثالي = getOpTimalPreviewSize (الأحجام ، W ، H) ؛ parameters.setPreviewSize (OptimalSize.Width ، OptimalSize.Height) ؛ mcamera.setparameters (المعلمات) ؛ if (المعاينة! = null) {mcamera.setPreviewCallbackWithBuffer (المعاينة) ؛ حجم camera.size = parameters.getPreviewSize () ؛ byte [] data = new byte [size.width* size.height* imageFormat.getBitsperPixel (parameters.getPreviewFormat ())/8] ؛ mcamera.addcallbackbuffer (Data) ؛ } mcamera.startpreview () ؛ }}以上就是本文的全部内容 , 希望对大家的学习有所帮助 , 也希望大家多多支持武林网。