本文實例為大家分享了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(); }}}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。 ,也希望大家多多支持武林網。