本文实例为大家分享了javacv实现人脸检测功能的具体代码、供大家参考、具体内容如下
/ * * Copyright(c)2010,2011,2012 Samuel Audet * * FacePreview- OpenCVのFaceDeTectとAndroidのCamerapReviewサンプルの融合、 * Javacv + Javacppをその間の接着剤として。 * *このファイルは、 * Android SDK API 8のサンプルに付属しているCamerapreview.javaに基づいており、改訂1の著作権通知が含まれていました。 *ライセンスに準拠している場合を除き、このファイルを使用することはできません。 *ライセンスのコピーを取得することができます * * http://www.apache.org/licenses/license-2.0 * *該当する法律で要求されていない場合、または書面で合意しない限り、ライセンスに基づいて配布されるソフトウェア *は、保証または条件なしで「現状」に分配されます。 *権限を管理する特定の言語のライセンスと、ライセンスに基づく制限を参照してください。 * * *重要-AndroidManifest.xmlファイルが次のように見えることを確認してください: * * <?xmlバージョン= "1.0" encoding = "UTF -8"? Android:versioncode = "1" * android:versionname = "1.0"> * <ouses-sdk android:minsdkversion = "4" /> * <uses-permission android:name = "android.camera" /> * <outes-feature android:name = "android.hard.hard.camera" / * < android:label = "@string/app_name"> * <activity * android:name = "facepreview" * android:rabel = "@string/app_name" * android:screenorientation = "landscape"> * <intent-filter> * <action android:name = "android.intent. Android:name = "android.intent.category.launcher"/> * </intent-filter> * </application> * </application> * </manifest> */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。*; // ---------------------------------------------------------------------- public class FacePreview extends Activity { private FrameLayout layout; Private FaceView FaceView;プライベートプレビューmpreview; @Override Protected void oncreate(bundle savedinstancestate){//ウィンドウタイトルを非表示にします。 RequestWindowFeature(window.feature_no_title); super.oncreate(savedinstancestate); getWindow()。addflags(windowmanager.layoutparams.flag_fullscreen); //プレビュービューを作成し、アクティビティのコンテンツとして設定します。 try {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(); }}} // ----------------------------------------------------------------------------------------------------------------------------------拡張camera.previewcallback {public static final int subsampling_factor = 4;プライベートiplimage grayimage; private cvhaarclassifiercascade分類器。プライベートCVMemstorageストレージ。プライベートCVSEQの顔。 public faceview(facepreviewコンテキスト)IoException {super(context); // Javaリソースから分類子ファイルをロードします。ファイルclassifierfile = loader.extractresource(getclass()、 "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml"、context.getCachedir()、 "classifier"、 ".xml"); if(classifierfile == null || classifierfile.length()<= 0){throw new ioException( "Java Resourceから分類子ファイルを抽出できませんでした。"); } //既知のバグを回避するために、opencv_objdetectモジュールをプリロードします。 loader.load(opencv_objdetect.class); classifier = new cvhaarclassifiercascade(cvload(classifierfile.getabsolutepath())); classifierfile.delete(); if(classifier.isnull()){throw new ioException( "classifierファイルをロードできませんでした。"); }ストレージ= cvmemstorage.create(); } public void onpreviewframe(final byte [] data、final Camera Camera){try {camera.size size = camera.getParameters()。getPreviewSize(); ProcessImage(data、size.width、size.height); camera.addcallbackbuffer(data); } catch(runtimeexception e){//カメラはおそらくリリースされたばかりです。 }}保護されたvoid processimage(byte [] data、int width、int height){//最初に、画像をダウンサンプリングし、グレースケールiplimage int f = subsampling_factor; if(grayimage == null || greyimage.width()!= width/f || greyimage.height()!= height/f){greyimage = iplimage.create(width/f、height/f、ipl_depth_8u、1); } int imagewidth = grayimage.width(); int imageheight = grayimage.height(); int dataStride = f*width; int imagestride = greyimage.widthstep(); bytebuffer imagebuffer = grayimage.getByteBuffer(); for(int y = 0; y <imageheight; y ++){int dataline = y*dataStride; int imageLine = y*imagestride; for(int x = 0; x <imagewidth; x ++){yimasbuffer.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(GrayImage、GrayImaget); //cvsaveimage("/storage/emulate/0/pictures/grayimaget.jpg"、grayimaget); cvflip(grayimaget、grayimaget、0); //cvsaveimage("/storage/emulation/0/pictures/grayimaget_x.jpg"、grayimaget); cvflip(grayimaget、grayimaget、1); //cvsaveimage("/storage/emulate/0/pictures/grayimaget_y.jpg"、grayimaget); cvClearMemstorage(ストレージ); faces = cvhaardetectobjects(grayimaget、classifier、storage、1.1、3、cv_haar_do_canny_pruning); post -invalidate(); } @Override Protected void Ondraw(Canvas Canvas){Paint Paint = new Paint(); paint.setColor(color.red); paint.settextsize(20); string s = "facepreview -こちら側に。"; float textWidth = paint.measureText(s); canvas.drawtext(s、(getWidth() - textWidth)/2、20、ペイント); 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(); 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、ペイント); }}} // -------------------------------------------------------------クラスプレビュー拡張SurfaceViewを実装するSurfaceHolder.callback {SurfaceHolder Mholder;カメラマッカメラ; camera.previewcallback previewcallback;プレビュー(コンテキストコンテキスト、camera.previewcallback previewcallback){super(context); this.previewcallback = previewcallback; // surfaceholder.callbackをインストールして、//基礎となる表面が作成されて破壊されたときに通知が表示されます。 mholder = getholder(); mholder.addcallback(this); mholder.setType(SurfaceHolder.surface_type_push_buffers); } public void surfacecreated(SurfaceHolder Holder){//表面が作成され、カメラを取得して、どこに描画するかを指示します。 McAmera = camera.open(camera.camerainfo.camera_facing_front); try {McAmera.setPreviewDisplay(Holder); } catch(IOException Exception){McAmera.Release(); McAmera = null; // TODO:ここに例外処理ロジックを追加}} public void surfacedestroyed(SurfaceHolder Holder){//戻ると表面が破壊されるので、プレビューを停止します。 // CameraDeviceオブジェクトは共有リソースではないため、アクティビティが一時停止したときにリリースすることが非常に重要です。 McAmera.Stoppreview(); McAmera.Release(); McAmera = null; }プライベートサイズgetoptimalpreviewsize(list <size> sizes、int w、int h){final double aspect_tolerance = 0.05; double targetRatio =(double)w / h; if(sizes == null)nullを返します。サイズOptimalSize = null;ダブルマインド= double.max_value; int targetheight = h; //(サイズ:サイズ){double比=(double)size.width / size.height.heightのサイズのアスペクト比とサイズを見つけてみてください。 if(math.abs(ratio -targetratio)> astage_tolerance)継続; if(math.abs(size.height -targetheight)<mindiff){optimalsize = size; Mindiff = Math.Abs(size.height -targetheight); }} //アスペクト比と一致する1つの一致を見つけることができません。 for(size size:size){if(math.abs(size.height -targetheight)<mindiff){optimalsize = size; Mindiff = Math.Abs(size.height -targetheight); }}} return optimalSize; } public void surfaceChanged(SurfaceHolder Holder、int Format、int w、int h){//サイズがわかっているので、カメラパラメーターを設定して開始//プレビューを開始します。 camera.parametersパラメーター= mcamera.getParameters();リスト<size> sizes = parameters.getSupportedPreviewsize(); 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(); byte [] data = new byte [size.width* size.height* imageformat.getbitsperpixel(parameters.getPreviewFormat())/8]; McAmera.AddCallBackBuffer(データ); } mcamera.startpreview(); }}以上就是本文的全部内容、希望对大家的学习有所帮助、也希望大家多多支持武林网。