Android camera实时预览 实时处理,人脸识别示例

Android camera实时预览 实时处理,人脸识别示例,第1张

概述Androidcamera实时预览实时处理,面部认证。预览 *** 作是网友共享的代码,我在继承SurfaceView的CameraSurfaceView中加入了帧监听事件,每次预览监听前五个数据帧,在处理做一个面部识别。

AndroID camera实时预览 实时处理,面部认证。

预览 *** 作是网友共享的代码,我在继承SurfaceVIEw 的CameraSurfaceVIEw 中加入了帧监听事件,每次预览监听前五个数据帧,在处理做一个面部识别。

先看目录关系

自定义控件CameraSurfaceVIEw.java 自定义接口方法CameraInterface.java CameraActivity预览界面。

CameraSurfaceVIEw.Java

package com.centaur.camera.prevIEw;import androID.content.Context;import androID.graphics.Bitmap;import androID.graphics.BitmapFactory;import androID.graphics.ImageFormat;import androID.graphics.Matrix;import androID.graphics.PixelFormat;import androID.graphics.Rect;import androID.graphics.YuvImage;import androID.harDWare.Camera;import androID.util.AttributeSet;import androID.util.Log;import androID.vIEw.SurfaceHolder;import androID.vIEw.SurfaceVIEw;import com.centaur.camera.camera.CameraInterface;import java.io.ByteArrayOutputStream;/** * Created by Tianchaoxiong on 2017/1/16. */public class CameraSurfaceVIEw extends SurfaceVIEw implements SurfaceHolder.Callback,Camera.PrevIEwCallback{  private static final int FACENUM = 5;  private static final String TAG = "yanzi";  CameraInterface mCameraInterface;  Context mContext;  SurfaceHolder mSurfaceHolder;  private boolean isFinish;  //传输五个bitmap数组  Bitmap [] bitmaps = new Bitmap[5];  int number = 0;//作为计数器用  OnFaceCollectListener onFaceCollectListener = null;  public CameraSurfaceVIEw(Context context,AttributeSet attrs) {    super(context,attrs);    mContext = context;    mSurfaceHolder = getHolder();    mSurfaceHolder.setFormat(PixelFormat.transparent);//translucent半透明 transparent透明    mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    mSurfaceHolder.addCallback(this);  }  @OverrIDe  public voID surfaceCreated(SurfaceHolder surfaceHolder) {    Log.i(TAG,"surfaceCreated...");  }  @OverrIDe  public voID surfaceChanged(SurfaceHolder surfaceHolder,int i,int i1,int i2) {    Log.i(TAG,"surfaceChanged...");  }  @OverrIDe  public voID surfaceDestroyed(SurfaceHolder surfaceHolder) {    Log.i(TAG,"surfaceDestroyed...");    CameraInterface.getInstance().doStopCamera();  }  public SurfaceHolder getSurfaceHolder(){    return mSurfaceHolder;  }  /**   * 收集五张图片 监听器   */  public static interface OnFaceCollectListener {    /**     * 收集五张face     * @param bitmaps 返回的五张脸的数组     */    voID OnFaceCollected(Bitmap[] bitmaps);    /**     * face重新绘制     * @param isstart 是否重新收集     */    voID OnFaceCollectStart(boolean isstart);  }  /**   * 设置面部的监听器   * @param onFaceCollectListener   */  public voID setonFaceCollectListener(OnFaceCollectListener onFaceCollectListener){    if(onFaceCollectListener!=null){      this.onFaceCollectListener = onFaceCollectListener;    }  }  /***   * 想在这里做一个监听处理 收五侦 传输出去   * @param bytes   * @param camera   */  @OverrIDe  public voID onPrevIEwFrame(byte[] bytes,Camera camera) {    if(number<FACENUM){      //收集      //判断监听器 开始      if(onFaceCollectListener!=null){        onFaceCollectListener.OnFaceCollectStart(true);        //有byte数组转为bitmap        bitmaps[number] = byte2bitmap(bytes,camera);        Log.d("ceshiTian","********收集了"+number+"个************");        number = number+1;        if(number==5){          Log.d("ceshiTian","********收集够5个************");          //提交          onFaceCollectListener.OnFaceCollected(bitmaps);        }      }    }else {      //不做 *** 作      onFaceCollectListener.OnFaceCollectStart(false);      onFaceCollectListener.OnFaceCollected(null);    }  }  private Bitmap byte2bitmap(byte[] bytes,Camera camera) {    Bitmap bitmap = null;    Camera.Size size = camera.getParameters().getPrevIEwSize(); // 获取预览大小    final int w = size.wIDth; // 宽度    final int h = size.height;    final YuvImage image = new YuvImage(bytes,ImageFormat.NV21,w,h,null);    ByteArrayOutputStream os = new ByteArrayOutputStream(bytes.length);    if (!image.compresstoJpeg(new Rect(0,h),100,os)) {      return null;    }    byte[] tmp = os.toByteArray();    bitmap = BitmapFactory.decodeByteArray(tmp,tmp.length);    Matrix matrix = new Matrix();    matrix.setRotate(-90);    bitmap = Bitmap.createBitmap(bitmap,bitmap.getWIDth(),bitmap.getHeight(),matrix,true);    return bitmap;  }}

CameraInterface.java

package com.centaur.camera.camera;import androID.graphics.Bitmap;import androID.graphics.BitmapFactory;import androID.graphics.ImageFormat;import androID.graphics.Matrix;import androID.graphics.PixelFormat;import androID.graphics.Rect;import androID.graphics.YuvImage;import androID.harDWare.Camera;import androID.util.Log;import androID.vIEw.SurfaceHolder;import com.centaur.camera.util.CamParaUtil;import com.centaur.camera.util.ImageUtil;import com.centaur.util.fileUtils;import java.io.IOException;import java.util.List;/** * Created by Tianchaoxiong on 2017/1/16. */public class CameraInterface {  private static final String TAG = "Tianchaoxiong";  private Camera mCamera;  private Camera.Parameters mParams;  private boolean isPrevIEwing = false;  private float mPreviwRate = -1f;  private static CameraInterface mCameraInterface;  public interface CamOpenOverCallback {    public voID cameraHasOpened();  }  private CameraInterface() {  }  public static synchronized CameraInterface getInstance() {    if (mCameraInterface == null) {      mCameraInterface = new CameraInterface();    }    return mCameraInterface;  }  /**   * 打开Camera   *   * @param callback   */  public voID doOpenCamera(CamOpenOverCallback callback) {    Log.i(TAG,"Camera open....");    mCamera = Camera.open(1);    Log.i(TAG,"Camera open over....");    callback.cameraHasOpened();  }  /**   * 开启预览   *   * @param holder   * @param prevIEwRate   */  public voID doStartPrevIEw(SurfaceHolder holder,float prevIEwRate,Camera.PrevIEwCallback prevIEwCallback) {    Log.i(TAG,"doStartPrevIEw...");    if (isPrevIEwing) {      mCamera.stopPrevIEw();      return;    }    if (mCamera != null) {      mParams = mCamera.getParameters();      mParams.setPictureFormat(PixelFormat.JPEG);//设置拍照后存储的图片格式      //对支持的图片的大小的一个收集      CamParaUtil.getInstance().printSupportPictureSize(mParams);      CamParaUtil.getInstance().printSupportPrevIEwSize(mParams);      //设置PrevIEwSize和PictureSize      Camera.Size pictureSize = CamParaUtil.getInstance().getPropPictureSize(          mParams.getSupportedPictureSizes(),prevIEwRate,800);      mParams.setPictureSize(pictureSize.wIDth,pictureSize.height);      Camera.Size prevIEwSize = CamParaUtil.getInstance().getPropPrevIEwSize(          mParams.getSupportedPrevIEwSizes(),800);      mParams.setPrevIEwSize(prevIEwSize.wIDth,prevIEwSize.height);      mCamera.setdisplayOrIEntation(90);      CamParaUtil.getInstance().printSupportFocusMode(mParams);      List<String> focusModes = mParams.getSupportedFocusModes();      if (focusModes.contains("continuous-vIDeo")) {        mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);      }      mCamera.setParameters(mParams);  //参数设置完毕      try {        mCamera.setPrevIEwdisplay(holder);        mCamera.setPrevIEwCallback(prevIEwCallback);        mCamera.startPrevIEw();//开启预览      } catch (IOException e) {        // Todo auto-generated catch block        e.printstacktrace();      }      isPrevIEwing = true;      mPreviwRate = prevIEwRate;      mParams = mCamera.getParameters(); //重新get一次      Log.i(TAG,"最终设置:PrevIEwSize--With = " + mParams.getPrevIEwSize().wIDth          + "Height = " + mParams.getPrevIEwSize().height);      Log.i(TAG,"最终设置:PictureSize--With = " + mParams.getPictureSize().wIDth          + "Height = " + mParams.getPictureSize().height);    }  }  /**   * 停止预览,释放Camera   */  public voID doStopCamera() {    if (null != mCamera) {      mCamera.setPrevIEwCallback(null);      mCamera.stopPrevIEw();      isPrevIEwing = false;      mPreviwRate = -1f;      mCamera.release();      mCamera = null;    }  }  /**   * 拍照   */  public voID doTakePicture() {    if (isPrevIEwing && (mCamera != null)) {      Log.d("fileUtils","程序运行到这里了111");      mCamera.takePicture(mShutterCallback,null,mJpegPictureCallback);    }  }  /*为了实现拍照的快门声音及拍照保存照片需要下面三个回调变量*/  Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback()      //快门按下的回调,在这里我们可以设置类似播放“咔嚓”声之类的 *** 作。默认的就是咔嚓。  {    public voID onShutter() {      // Todo auto-generated method stub      Log.i(TAG,"myShutterCallback:onShutter...");    }  };  /*  Camera.PictureCallback mRawCallback = new Camera.PictureCallback()        // 拍摄的未压缩原数据的回调,可以为null    {      public voID onPictureTaken(byte[] data,Camera camera) {        // Todo auto-generated method stub        Log.i(TAG,"myRawCallback:onPictureTaken...");      }    };*/  Camera.PictureCallback mJpegPictureCallback = new Camera.PictureCallback()      //对jpeg图像数据的回调,最重要的一个回调  {    public voID onPictureTaken(byte[] data,Camera camera) {      Log.d("fileUtils","程序运行到这里了222");      // Todo auto-generated method stub      Log.i(TAG,"myJpegCallback:onPictureTaken...");      Bitmap b = null;      if (null != data) {        b = BitmapFactory.decodeByteArray(data,data.length);//data是字节数据,将其解析成位图        mCamera.stopPrevIEw();        isPrevIEwing = false;        Log.d("fileUtils","程序运行到这里了333");      }      //保存图片到sdcard      if (null != b) {        Log.d("fileUtils","程序运行到这里了444");        //设置FOCUS_MODE_CONTINUOUS_VIDEO)之后,myParam.set("rotation",90)失效。        //图片竟然不能旋转了,故这里要旋转下        Log.d("fileUtils","程序运行到这里了");        Bitmap rotaBitmap = ImageUtil.getRotateBitmap(b,-90.0f);        fileUtils.savePaiZhaoBitmap(rotaBitmap);      }    }  };}

CameraActivity

package com.centaur.camera.Activity;import androID.content.Intent;import androID.graphics.Bitmap;import androID.graphics.Point;import androID.os.Bundle;import androID.os.Environment;import androID.os.Handler;import androID.support.v7.app.AppCompatActivity;import androID.util.Log;import androID.vIEw.SurfaceHolder;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.Imagebutton;import androID.Widget.TextVIEw;import com.centaur.camera.camera.CameraInterface;import com.centaur.camera.prevIEw.CameraSurfaceVIEw;import com.centaur.camera.util.displayUtil;import com.centaur.testutil.R;import com.centaur.testutil.ShowPic;import com.centaur.util.DetecteSDK;import com.centaur.util.DetecteSeeta;public class CameraActivity extends AppCompatActivity implements CameraSurfaceVIEw.OnFaceCollectListener,CameraInterface.CamOpenOverCallback{  private static final String TAG = "CameraActivity";  private float recLen = 0;  long te;  float prevIEwRate = -1f;  DetecteSDK detecteSDK;  DetecteSeeta detecteSeeta;  Bitmap bmp;  Bitmap bitmapfianl;  private Imagebutton shutterBtn;  private TextVIEw textVIEw;  private CameraSurfaceVIEw surfaceVIEw = null;  @OverrIDe  protected voID onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    Thread openThread = new Thread(){      @OverrIDe      public voID run() {        CameraInterface.getInstance().doOpenCamera(CameraActivity.this);      }    };    openThread.start();    te = System.currentTimeMillis();    setContentVIEw(R.layout.activity_camera);    initVIEw();    initVIEwParams();    surfaceVIEw.setonFaceCollectListener(this);    shutterBtn.setonClickListener(new BtnListeners());    TimeHandler.postDelayed(TimeRunnable,500);  }  /**   * 回调方法   * activity中的视图和 interface中的代码实现绑定   */  @OverrIDe  public voID cameraHasOpened() {    SurfaceHolder holder = surfaceVIEw.getSurfaceHolder();    CameraInterface.getInstance().doStartPrevIEw(holder,surfaceVIEw );  }  @OverrIDe  protected voID onDestroy() {    // Todo auto-generated method stub    super.onDestroy();    CameraInterface.getInstance().doStopCamera();    Log.d("RunTime","onDestroy:time:"+te);    TimeHandler.removeCallbacks(TimeRunnable);  }  @OverrIDe  protected voID onPause() {    // Todo auto-generated method stub    super.onPause();    CameraInterface.getInstance().doStopCamera();    te = System.currentTimeMillis()-te;    Log.d("RunTime","onPause:time:"+te);    TimeHandler.removeCallbacks(TimeRunnable);  }  Handler TimeHandler = new Handler();  Runnable TimeRunnable = new Runnable() {    @OverrIDe    public voID run() {      recLen+=500;      textVIEw.setText("检测时间:" + recLen/1000+"秒");      TimeHandler.postDelayed(this,500);    }  };  private voID initVIEw(){    surfaceVIEw = (CameraSurfaceVIEw)findVIEwByID(R.ID.camera_surfacevIEw);    shutterBtn = (Imagebutton)findVIEwByID(R.ID.btn_shutter);    textVIEw = (TextVIEw) findVIEwByID(R.ID.time);  }  private voID initVIEwParams(){    VIEwGroup.LayoutParams params = surfaceVIEw.getLayoutParams();    Point p = displayUtil.getScreenMetrics(this);    params.wIDth = p.x;    params.height = p.y;    prevIEwRate = displayUtil.getScreenRate(this); //默认全屏的比例预览    surfaceVIEw.setLayoutParams(params);    //手动设置拍照Imagebutton的大小为120dip×120dip,原图片大小是64×64    VIEwGroup.LayoutParams p2 = shutterBtn.getLayoutParams();    p2.wIDth = displayUtil.dip2px(this,80);    p2.height = displayUtil.dip2px(this,80);    shutterBtn.setLayoutParams(p2);  }  /**   * 自建   * @param bitmaps 返回的五张脸的数组   */  @OverrIDe  public voID OnFaceCollected(Bitmap[] bitmaps) {  }  /**   * 自建   * @param isstart 是否重新收集   */  @OverrIDe  public voID OnFaceCollectStart(boolean isstart) {    if(isstart){      Log.d("CameraActivity","开始收集");    }  }  private class BtnListeners implements VIEw.OnClickListener {    @OverrIDe    public voID onClick(VIEw v) {      // Todo auto-generated method stub      switch(v.getID()){        case R.ID.btn_shutter:          CameraInterface.getInstance().doTakePicture();          Intent intent =new Intent(CameraActivity.this,ShowPic.class);          // 默认一个暂存的路径 /FaceDetection/useso/Pictures/Tmp/tmp.png          String FolderPath = "/FaceDetection/useso/Pictures/Tmp/tmp.png";          String path = Environment.getExternalStorageDirectory()+FolderPath;          intent.putExtra("picpath",path);          startActivity(intent);          finish();          break;        default:break;      }    }  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android camera实时预览 实时处理,人脸识别示例全部内容,希望文章能够帮你解决Android camera实时预览 实时处理,人脸识别示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存