本文实例为大家分享了javacv实现人脸检测功能的具体代码,供大家参考,具体内容如下
/ * *版权(c)2010,2011,2012 Samuel Audet * * facePreview- OpenCV的FaceDect和Android的Camerapreview样品融合,Javacv + Javacpp作为胶水在之间。 * *该文件基于camerapreview.java,带有 * Android SDK API 8,修订1的样品,并包含以下版权通知: * *版权所有(C)2007年Android开源项目 * *根据Apache许可证许可,ApaChe许可证,版本2.0(版本2.0)(“许可证”); *您不得使用此文件,除非符合许可证。 *您可以在 * * * http://www.apache.org/licenses/license-2.0 * *获得许可证的副本,除非适用法律要求或以书面形式同意以“许可”分配的软件 *以“基础”分发, * as Basine as Basine, *没有任何形式或条件的保证或条件。 *请参阅许可证的许可,以获取许可条款和 *限制。 * * *重要 - 确保androidManifest.xml文件看起来像这样: * * <?xml版本=“ 1.0” encoding =“ utf -8”?> * <清单xmlns:android =“ http:///schemas.android.com/apke.com/apk/apk/ress/res-res/andres/android” com.goog =“ Android:versionCode =“ 1” * Android:versionName =“ 1.0”> * <用途 - sdk android:minsdkversion =“ 4” /> * <use-permission android:name =“ android.permision.camera.camera” /> * android:label =“@string/app_name”> * <活动 * android:name =“ facepreview” * android:label =“@string/app_name” * android:screatorientation =“ landencecape”> * <intent-filter> * <intent-filter> * <行动android:name =“ android.intent.category.launcher”/> * </intent-filter> * </active> * </Application> * </application> * </sustest> */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;导入静态com.googlecode.javacv.cpp.opencv_core。*;导入静态com.googlecode.javacv.cpp.opencv_imgproc。*;导入静态com.googlecode.javacv.cpp.opencv_objdetect。*;导入静态com.googlecode.javacv.cpp.opencv_highgui。 // ---------------------------------------------------------------------- public class FacePreview extends Activity { private FrameLayout layout;私人面对面浏览;私人预览mpreview; @Override受保护的void ongreate(捆绑savedinstanceState){//隐藏窗口标题。 requestWindowFeature(window.feature_no_title); super.oncreate(savedinstancestate); getWindow()。addflags(windowmanager.layoutparams.flag_fullscreen); //创建我们的预览视图并将其设置为我们活动的内容。尝试{layout = new Framelayout(this); faceView = new FaceView(this); mpreview = new Preview(this,faceview); layout.addview(mpreview); layout.addview(faceView); setContentView(布局); } catch(ioexception e){e.printstacktrace(); new AlertDialog.builder(this).setMessage(e.getMessage())。create()。show(); } } } // ---------------------------------------------------------------------- class FaceView extends View implements Camera.PreviewCallback { public static final int SUBSAMPLING_FACTOR = 4;私人iPlimage灰色图;私人cvhaarclassifiercascade分类器;私有CVMemStorage存储;私人CVSEQ面孔; public faceview(facepreview上下文)抛出ioexception {super(super(context); //从Java Resources加载分类器文件。文件classifierfile = loader.extractresource(getClass(),“/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml”,context.getCachedir(),clastifier(),“ classifier” if(classifierfile == null || classifierfile.length()<= 0){抛出新的ioexception(“无法从Java Resource中提取分类器文件。”); } //预加载opencv_objdetect模块以围绕已知错误工作。 loader.load(opencv_objdetect.class); classifier =新的cvhaarclassifiercascade(cvload(classifierfile.getabsolutepath())); classifierfile.delete(); if(clastifier.isnull()){抛出新的ioexception(“不能加载分类器文件。”); }存储= cvmemstorage.create(); } public void onpreviewFrame(final byte []数据,最终摄像机){尝试{camera.size size = camera.getParameters()。getPreviewSize(); processImage(数据,size.width,size.height); camera.addcallbackbuffer(data); } catch(runtimeException e){//相机可能刚刚发布,忽略。 }}受保护的void processimage(byte []数据,int width,int height){//首先,将图像下样本并将其转换为灰度iPlimage int f = subsampling_factor; if(grayimage == null || grayimage.width()!= width/f || grayimage.height()!= height/f){grayimage = iplimage.create.create(width/f,height/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*datasTride; int imageline = y*成像stride; for(int x = 0; x <imageWidth; x ++){imageBuffer.put(imageLine + x,data [dataline + f*x]); }} iplimage grayimaget = iplimage.create(height/f,width/f,ipl_depth_8u,1); //cvsaveimage(“/storage/emulation/0/pictures/grayimage.jpg",grayimage); cvtranspose(灰色图像,灰色imaget); //cvsaveimage(“/storage/emulation/0/pictures/grayimaget.jpg",grayimaget); cvflip(grayimaget,grayimaget,0); //cvsaveimage(“/storage/emulation/0/pictures/grayimaget_x.jpg",,grayimaget); cvflip(grayimaget,grayimaget,1); //cvsaveimage(“/storage/emulation/0/pictures/grayimaget_y.jpg",grayimaget); cvclearmemstorage(存储); faces = cvhaardetectobjects(grayimaget,分类器,存储,1.1,3,cv_haar_do_canny_pruning); invalidate(); } @Override受保护的void onDraw(画布帆布){paint Paint = new Paint(); Paint.setColor(color.Red); paint.setTextsize(20);字符串s =“ facepreview-这一侧向上。”; float textWidth = paint.measuretext(s); canvas.drawText(s,(getWidth() - textWidth)/2,20,paint);如果(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(); for(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); }} else {canvas.drawText(“ meiyoujiancedao”,(getWidth() - textWidth)/2,20,paint); }} // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------》预览扩展了SurfaceView实现SurfaceHolder.Callback {Surperionholder Mholder;摄影机McAmera; camera.previewCallback PreviewCallback; Preview(上下文上下文,camera.previewCallback PreviewCallback){super(supervect); this.previewCallback = previewCallback; //安装SurfaceHolder.Callback,以便我们在创建和破坏的//基础表面时得到通知。 mholder = getholder(); mholder.addcallback(this); mholder.setType(sublyholder.surface_type_push_buffers); } public void surfaceCecreated(表面持有人){//已经创建了表面,获取相机并告诉它在哪里绘制。 mcamera = camera.open(camera.camerainfo.camera_facing_front);尝试{mcamera.setpreviewdisplay(holder); } catch(ioexception异常){mcamera.release(); mcamera = null; // todo:在此处添加更多例外处理逻辑}} public void surfacedestroyed(SurfaceOltholder Holder){//我们返回时将破坏表面,因此停止预览。 //由于cameradeVice对象不是共享资源,因此在暂停活动时将其发布非常重要。 mcamera.stoppreview(); McAmera.Release(); mcamera = null; }私有大小getOptimalPreviewSize(list <size <Size> size,int w,int H){final double double fack_tolerance = 0.05; double targetRatio =(double)w / h;如果(sizes == null)返回null;尺寸Optimalsize = null; double mindiff = double.max_value; int targetheight = h; //尝试找到一个尺寸匹配的宽高比和(尺寸尺寸:尺寸){double比率=(double)size.width / size.height;如果(Math.Abs(比率 - targetRatio)> exchallance_tolerance)继续; if(Math.abs(size.height -targetheight)<hindiff){optimalsize = size; Mindiff = Math.Abs(size.Height -targetheight); }} //找不到匹配纵横比的一个,请忽略要求,如果(optimalsize == null){mindiff = double.max_value; for(尺寸:尺寸){if(Math.abs(size.height -targetheight)<Mindiff){optimalsize = size; Mindiff = Math.Abs(size.Height -targetheight); }}}返回Optimalsize; } public void surfacechanged(表面持有人,int格式,int w,int h){//现在大小已知,设置摄像机参数并开始//预览。 camera.parameters参数= mcamera.getParameters(); list <size> sizes = parameters.getSupportedPreviewSizes(); size Optimalsize = getOptimalPreviewSize(size,w,h); parameters.setPreviewSize(optimalsize.width,optimalsize.height); mcamera.setParameters(参数); if(previewCallback!= null){mcamera.setpreviewcallbackwithbuffer(previewCallback); camera.size size = parameters.getPreviewSize();字节[] data = new Byte [size.width* size.height* imageFormat.getBitsperpixel(parameters.getPreviewFormat())/8]; McAmera.AddCallbackBuffer(数据); } mcamera.startpreview(); }}}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。,也希望大家多多支持武林网。