本文实例为大家分享了 javacv av, 供大家参考, 具体内容如下
/ * * Copyright (C) 2010,2011,2012 Samuel Audet * * FacePreview- OpenCV의 facedetect 및 Android의 CamerapReview 샘플의 융합 * Javacv + javacpp가 그 사이의 접착제로. * *이 파일은 * Android SDK API 8, 개정 1에 대한 샘플과 함께 제공되는 CamerapReview.java를 기반으로하며 다음 저작권 통지를 포함했습니다. * 라이센스를 준수하는 것 외에는이 파일을 사용할 수 없습니다. * 귀하는 * * http://www.apache.org/license/license/license-2.0 *에서 라이센스 사본을 얻을 수 있습니다. 적용 가능한 법률에 의해 요구되거나 서면으로 동의하지 않는 한, 라이센스에 따라 배포 된 소프트웨어 *는 "기준"에 배포됩니다. * 라이센스에 따른 특정 언어 통치 권한 및 * 제한 사항에 대한 라이센스를 참조하십시오. * * * 중요 - AndroidManifest.xml 파일이 다음과 같습니다. * * <? xml version = "1.0"encoding = "utf-8"?> * <manifest xmlns : android = "http://schemas.android.com/apk/res/android" * com.googlecode.facepreview " * googlecode.facepreview" * Android : versionCode = "1" * Android : versionName = "1.0"> * <use-sdk android : minsdkversion = "4" /> * <use-permission Android : name = "android.permission.camera" /> * <use-feature android : name = "android.hardware.camera" /> * <application : label " Android : "FacePreview" * Android : label = "@String/App_name" * Android : "Screenorientation ="Landscape "> * <intent-filter> * <action android : name ="android.intent.action.main "/> * <cat </ manifest> */ package com.googlecode.javacv.facepreview; android.app.Activity 가져 오기; android.app.alertdialog 가져 오기; android.content.context 가져 오기; Import Android.graphics.canvas; Import Android.graphics.color; import android.graphics.imageformat; Import Android.graphics.paint; Import Android.hardware.camera; Import Android.hardware.camera.size; android.os.bundle 가져 오기; 안드로이드 view.surfaceholder import; import android.view.surfaceview; 안드로이드를 가져옵니다. view.view; 안드로이드를 가져옵니다 .View.Window; 안드로이드 view.windowmanager import; Import Android.widget.framelayout; import java.io.file; import java.io.ioexception; import java.nio.bytebuffer; Java.util.list 가져 오기; com.googlecode.javacpp.loader 가져 오기; import 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; 개인 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 = 새 미리보기 (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 grayimage; 개인 CVHAARCLASSIFIERCASCADE 분류기; 개인 CVMEMSTORAGE 스토리지; 개인 CVSEQ 얼굴; public faceview (facepreview context)는 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) {throw new ioException ( "Java Resource에서 분류기 파일을 추출 할 수 없음"); } // 알려진 버그를 중심으로 작동하도록 OpenCV_OBJDETECT 모듈을 사전로드합니다. loader.load (opencv_objdetect.class); classifier = new cvhaarclassifiercascade (cvload (cvload (classifierfile.getabsolutepath ())); classifierfile.delete (); if (classifier.isnull ()) {Throw new ioException ( "Classifier 파일을로드 할 수 없음"); } Storage = cvmemstorage.create (); } public void onpreviewframe (최종 바이트 [] 데이터, 최종 카메라 카메라) {try {camera.size size = camera.getParameters (). getPreviewSize (); ProcessImage (데이터, 크기 .width, size.height); camera.addcallbackbuffer (데이터); } catch (runtimeexception e) {// 카메라가 방금 해제되었을 것입니다. }} 보호 된 void processImage (byte [] data, int width, int height) {// 먼저 이미지를 다운 샘플링하여 grayscale iplimage int f = subsampling_factor로 변환합니다. if (GrayImage == null || grayImage.width ()! = width/f || gryimage.height ()! = height/f) {grayimage = iplimage.create (너비/f, 높이/f, ipl_depth_8u, 1); } int imageWidth = grayImage.width (); int imageHeight = grayImage.height (); int datastride = f*너비; int imagestride = grayimage.widthstep (); 바이트 버퍼 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 ++) {ImageBuffer.put (ImageLine + X, data [dataline + f*x]); }} iplimage grayimaget = iplimage.create (높이/f, 너비/f, ipl_depth_8u, 1); //cvsaveimage("/storage/emulated/0/pictures/grayimage.jpg",Grayimage); cvtranspose (Grayimage, Grayimaget); //cvsaveimage("/storage/emulated/0/pictures/grayimaget.jpg",Grayimaget); cvflip (Grayimaget, Grayimaget, 0); //cvsaveimage("/storage/emulated/0/pictures/grayimaget_x.jpg",Grayimaget); CVFLIP (Grayimaget, Grayimaget, 1); //cvsaveimage("/storage/emulated/0/pictures/grayimaget_y.jpg",grayimaget); cvclearmemstorage (스토리지); faces = cvhaardetectobjects (그레이 이마 가트, 분류기, 스토리지, 1.1, 3, cv_haar_do_canny_pruning); postinvalidate (); } @Override Protected Void ondraw (Canvas Canvas) {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, 페인트); 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, 페인트); } } } // ---------------------------------------------------------------------- class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; 카메라 McAmera; 카메라 .previewCallback previewCallback; 미리보기 (컨텍스트 컨텍스트, Camera.previewCallback previewCallback) {super (컨텍스트); this.previewCallback = previewCallback; // Surfaceholder.callback을 설치하여 // 기본 표면이 생성되고 파괴 될 때 알림을받습니다. mholer = getholder (); molleder.addcallback (this); molleder.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> 크기, int w, int h) {Final Double Aspect_Tolerance = 0.05; 이중 targetRatio = (이중) w / h; if (size == null) return null; size implicalsize = null; Double Mindiff = double.max_value; int targetheight = h; // (크기 크기 : 크기) {double ratio = (double) size.width / size.height의 크기 일치 종횡비 및 크기를 찾으십시오. if (math.abs (ratio -targetratio)> agge_tolerance) 계속; if (math.abs (size.height -targetheight) <Mindiff) {Optimalsize = size; Mindiff = math.abs (size.height -targetheight); }} // 하나를 찾을 수 없습니다. 측면 비율과 일치하는 것을 찾을 수 없습니다. (Optimalsize == null) {mindiff = double.max_value; for (size size : size) {if (math.abs (size.height -targetheight) <Mindiff) {Optimalsize = size; Mindiff = math.abs (size.height -targetheight); }}} return Optimalsize; } public void SurfaceChanged (Surface Holder, Int Format, int W, int H) {// 크기가 알려져 있으므로 카메라 매개 변수를 설정하고 미리보기를 시작합니다. Camera.Parameters 매개 변수 = McAmera.getParameters (); List <size> size = parameters.getSupportedPreviewSizes (); size Optimalsize = getOptimalPreviewSize (크기, w, h); Parameters.setPreviewSize (OptimalSize.Width, OptimalSize.Height); McAmera.setParameters (매개 변수); if (previewCallback! = null) {McAmera.setPreviewCallwitHbuffer (previewCallback); camera.size size = parameters.getpreviewsize (); 바이트 [] data = new Byte [size.width* size.height* im McAmera.addcallbackbuffer (데이터); } mcamera.startPreview (); }}以上就是本文的全部内容 以上就是本文的全部内容, 希望对大家的学习有所帮助, 也希望大家多多支持武林网。