欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中的人臉檢測(cè)的示例代碼(靜態(tài)和動(dòng)態(tài))

 更新時(shí)間:2018年01月10日 13:38:00   作者:DBOY  
本篇文章主要介紹了Android中的人臉檢測(cè)的示例代碼(靜態(tài)和動(dòng)態(tài)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

(1)背景。

Google 于2006年8月收購(gòu)Neven Vision 公司 (該公司擁有10多項(xiàng)應(yīng)用于移動(dòng)設(shè)備領(lǐng)域的圖像識(shí)別的專利),以此獲得了圖像識(shí)別的技術(shù),并加入到android中。Android 中的人臉識(shí)別技術(shù),用到的底層庫(kù):android/external/neven/,framework 層:frameworks/base/media/java/android/media/FaceDetector.java。

Java 層接口的限制:A,只能接受Bitmap 格式的數(shù)據(jù);B,只能識(shí)別雙眼距離大于20 像素的人臉像(當(dāng)然,這個(gè)可在framework層中修改);C,只能檢測(cè)出人臉的位置(雙眼的中心點(diǎn)及距離),不能對(duì)人臉進(jìn)行匹配(查找指定的臉譜)。

人臉識(shí)別技術(shù)的應(yīng)用:A,為Camera 添加人臉識(shí)別的功能,使得Camera 的取景器上能標(biāo)識(shí)出人臉?lè)秶蝗绻布С?,可以?duì)人臉進(jìn)行對(duì)焦。B,為相冊(cè)程序添加按人臉?biāo)饕鄡?cè)的功能,按人臉?biāo)饕鄡?cè),按人臉?lè)纸M,搜索相冊(cè)。

(2)Neven庫(kù)給上層提供的主要方法:

A,android.media.FaceDetector .FaceDetector(int width, int height, int maxFaces):Creates a FaceDetector, configured with the size of the images to be analysed and the maximum number of faces that can be detected. These parameters cannot be changed once the object is constructed.

B,int android.media.FaceDetector .findFaces(Bitmap bitmap, Face [] faces):Finds all the faces found in a given Bitmap . The supplied array is populated with FaceDetector.Face s for each face found. The bitmap must be in 565 format (for now).

(3) 靜態(tài)圖片處理代碼實(shí)例:

通過(guò)對(duì)位圖的處理,捕獲位圖中的人臉,并以綠框顯示,有多個(gè)人臉就提示多個(gè)綠框。首先新建一個(gè)activity,由于位圖資源會(huì)用代碼顯示出來(lái),所以不需在layout中使用widget。

package com.example.mydetect2; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.PointF;  
import android.media.FaceDetector; //人臉識(shí)別的關(guān)鍵類 
import android.media.FaceDetector.Face;  
import android.view.View;  
 
public class MainActivity2 extends Activity { 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.activity_main_activity2); 
    setContentView(new myView(this));  //使用自建的view來(lái)顯示 
    Log.i("zhangcheng","MainActivity2 run here"); 
  } 
 
  private class myView extends View{ 
    private int imageWidth, imageHeight; 
    private int numberOfFace = 5;    //最大檢測(cè)的人臉數(shù) 
    private FaceDetector myFaceDetect; //人臉識(shí)別類的實(shí)例 
    private FaceDetector.Face[] myFace; //存儲(chǔ)多張人臉的數(shù)組變量 
    float myEyesDistance;      //兩眼之間的距離 
    int numberOfFaceDetected;    //實(shí)際檢測(cè)到的人臉數(shù) 
    Bitmap myBitmap; 
 
    public myView(Context context){   //view類的構(gòu)造函數(shù),必須有 
      super(context);  
      BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();  
      BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; //構(gòu)造位圖生成的參數(shù),必須為565。類名+enum 
      myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baby, BitmapFactoryOptionsbfo);   
      imageWidth = myBitmap.getWidth();  
      imageHeight = myBitmap.getHeight();  
      myFace = new FaceDetector.Face[numberOfFace];    //分配人臉數(shù)組空間 
      myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);  
      numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);  //FaceDetector 構(gòu)造實(shí)例并解析人臉 
      Log.i("zhangcheng","numberOfFaceDetected is " + numberOfFaceDetected); 
    } 
     
    protected void onDraw(Canvas canvas){      //override函數(shù),必有 
      canvas.drawBitmap(myBitmap, 0, 0, null);  //畫出位圖  
      Paint myPaint = new Paint();  
      myPaint.setColor(Color.GREEN);  
      myPaint.setStyle(Paint.Style.STROKE);  
      myPaint.setStrokeWidth(3);     //設(shè)置位圖上paint操作的參數(shù) 
 
      for(int i=0; i < numberOfFaceDetected; i++){ 
        Face face = myFace[i]; 
        PointF myMidPoint = new PointF();  
        face.getMidPoint(myMidPoint);  
        myEyesDistance = face.eyesDistance();  //得到人臉中心點(diǎn)和眼間距離參數(shù),并對(duì)每個(gè)人臉進(jìn)行畫框 
        canvas.drawRect(      //矩形框的位置參數(shù) 
            (int)(myMidPoint.x - myEyesDistance),  
            (int)(myMidPoint.y - myEyesDistance),  
            (int)(myMidPoint.x + myEyesDistance),  
            (int)(myMidPoint.y + myEyesDistance),  
            myPaint); 
      } 
    } 
  } 
} 

以上為activity,工程的xml文件沒有什么特殊地方。最后得到的結(jié)果如下,圖片資源是png的也可以。

(4) 動(dòng)態(tài)預(yù)覽識(shí)別人臉代碼實(shí)例

該過(guò)程用于后臺(tái)工作,沒有界面也沒有預(yù)覽。所以沒有采用上面那種處理位圖資源的方式。Import的類就不列出了,核心的代碼和流程如下:

A,打開攝像頭,獲得初步攝像頭回調(diào)數(shù)據(jù),用到是setpreviewcallback

protected Camera mCameraDevice = null;// 攝像頭對(duì)象實(shí)例
private long mScanBeginTime = 0;  // 掃描開始時(shí)間
private long mScanEndTime = 0;  // 掃描結(jié)束時(shí)間
private long mSpecPreviewTime = 0;  // 掃描持續(xù)時(shí)間
private int orientionOfCamera ;  //前置攝像頭layout角度
int numberOfFaceDetected;  //最終識(shí)別人臉數(shù)目
public void startFaceDetection() { 
    try { 
        mCameraDevice = Camera.open(1);   //打開前置 
        if (mCameraDevice != null) 
          Log.i(TAG, "open cameradevice success! "); 
      } catch (Exception e) {       //Exception代替很多具體的異常 
        mCameraDevice = null; 
        Log.w(TAG, "open cameraFail"); 
        mHandler.postDelayed(r,5000);  //如果攝像頭被占用,人眼識(shí)別每5秒檢測(cè)看有沒有釋放前置 
        return; 
    }  
       
    Log.i(TAG, "startFaceDetection"); 
    Camera.Parameters parameters = mCameraDevice.getParameters(); 
    setCameraDisplayOrientation(1,mCameraDevice);       //設(shè)置預(yù)覽方向  
       
    mCameraDevice.setPreviewCallback(new PreviewCallback(){ 
      public void onPreviewFrame(byte[] data, Camera camera){ 
        mScanEndTime = System.currentTimeMillis();  //記錄攝像頭返回?cái)?shù)據(jù)的時(shí)間 
        mSpecPreviewTime = mScanEndTime - mScanBeginTime; //從onPreviewFrame獲取攝像頭數(shù)據(jù)的時(shí)間 
        Log.i(TAG, "onPreviewFrame and mSpecPreviewTime = " + String.valueOf(mSpecPreviewTime)); 
        Camera.Size localSize = camera.getParameters().getPreviewSize(); //獲得預(yù)覽分辨率 
        YuvImage localYuvImage = new YuvImage(data, 17, localSize.width, localSize.height, null); 
        ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); 
        localYuvImage.compressToJpeg(new Rect(0, 0, localSize.width, localSize.height), 80, localByteArrayOutputStream);  //把攝像頭回調(diào)數(shù)據(jù)轉(zhuǎn)成YUV,再按圖像尺寸壓縮成JPEG,從輸出流中轉(zhuǎn)成數(shù)組 
        byte[] arrayOfByte = localByteArrayOutputStream.toByteArray(); 
        CameraRelease();  //及早釋放camera資源,避免影響camera設(shè)備的正常調(diào)用 
        StoreByteImage(arrayOfByte); 
      } 
    }); 
 
    mCameraDevice.startPreview();     //該語(yǔ)句可放在回調(diào)后面,當(dāng)執(zhí)行到這里,調(diào)用前面的setPreviewCallback 
    mScanBeginTime = System.currentTimeMillis();// 記錄下系統(tǒng)開始掃描的時(shí)間 
  } 

B,設(shè)置預(yù)覽方向的函數(shù)說(shuō)明,該函數(shù)比較重要,因?yàn)榉较蛑苯佑绊慴itmap構(gòu)造時(shí)的矩陣旋轉(zhuǎn)角度,影響最終人臉識(shí)別的成功與否

public void setCameraDisplayOrientation(int paramInt, Camera paramCamera){ 
    CameraInfo info = new CameraInfo(); 
    Camera.getCameraInfo(paramInt, info); 
    int rotation = ((WindowManager)getSystemService("window")).getDefaultDisplay().getRotation(); //獲得顯示器件角度 
    int degrees = 0; 
    Log.i(TAG,"getRotation's rotation is " + String.valueOf(rotation)); 
    switch (rotation) { 
      case Surface.ROTATION_0: degrees = 0; break; 
      case Surface.ROTATION_90: degrees = 90; break; 
      case Surface.ROTATION_180: degrees = 180; break; 
      case Surface.ROTATION_270: degrees = 270; break; 
    } 
 
    orientionOfCamera = info.orientation;   //獲得攝像頭的安裝旋轉(zhuǎn)角度 
    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
    } 
    paramCamera.setDisplayOrientation(result); //注意前后置的處理,前置是映象畫面,該段是SDK文檔的標(biāo)準(zhǔn)DEMO 
  } 

C,對(duì)攝像頭回調(diào)數(shù)據(jù)進(jìn)行轉(zhuǎn)換并最終解成BITMAP后再人臉識(shí)別的過(guò)程

public void StoreByteImage(byte[] paramArrayOfByte){ 
    mSpecStopTime = System.currentTimeMillis(); 
    mSpecCameraTime = mSpecStopTime - mScanBeginTime; 
            
    Log.i(TAG, "StoreByteImage and mSpecCameraTime is " + String.valueOf(mSpecCameraTime)); 
 
    BitmapFactory.Options localOptions = new BitmapFactory.Options(); 
      Bitmap localBitmap1 = BitmapFactory.decodeByteArray(paramArrayOfByte, 0, paramArrayOfByte.length, localOptions); 
      int i = localBitmap1.getWidth(); 
      int j = localBitmap1.getHeight();  //從上步解出的JPEG數(shù)組中接出BMP,即RAW->JPEG->BMP 
      Matrix localMatrix = new Matrix(); 
      //int k = cameraResOr; 
      Bitmap localBitmap2 = null; 
      FaceDetector localFaceDetector = null; 
 
    switch(orientionOfCamera){  //根據(jù)前置安裝旋轉(zhuǎn)的角度來(lái)重新構(gòu)造BMP 
      case 0: 
        localFaceDetector = new FaceDetector(i, j, 1); 
            localMatrix.postRotate(0.0F, i / 2, j / 2); 
            localBitmap2 = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565); 
        break; 
      case 90: 
        localFaceDetector = new FaceDetector(j, i, 1);  //長(zhǎng)寬互換 
            localMatrix.postRotate(-270.0F, j / 2, i / 2); //正90度的話就反方向轉(zhuǎn)270度,一樣效果 
            localBitmap2 = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565); 
        break;            
      case 180: 
        localFaceDetector = new FaceDetector(i, j, 1); 
            localMatrix.postRotate(-180.0F, i / 2, j / 2); 
            localBitmap2 = Bitmap.createBitmap(i, j, Bitmap.Config.RGB_565); 
        break; 
      case 270: 
        localFaceDetector = new FaceDetector(j, i, 1); 
            localMatrix.postRotate(-90.0F, j / 2, i / 2); 
            localBitmap2 = Bitmap.createBitmap(j, i, Bitmap.Config.RGB_565); //localBitmap2應(yīng)是沒有數(shù)據(jù)的 
        break; 
    } 
 
    FaceDetector.Face[] arrayOfFace = new FaceDetector.Face[1]; 
      Paint localPaint1 = new Paint(); 
      Paint localPaint2 = new Paint(); 
    localPaint1.setDither(true); 
      localPaint2.setColor(-65536); 
      localPaint2.setStyle(Paint.Style.STROKE); 
      localPaint2.setStrokeWidth(2.0F); 
      Canvas localCanvas = new Canvas(); 
      localCanvas.setBitmap(localBitmap2); 
      localCanvas.setMatrix(localMatrix); 
      localCanvas.drawBitmap(localBitmap1, 0.0F, 0.0F, localPaint1); //該處將localBitmap1和localBitmap2關(guān)聯(lián)(可不要?) 
 
    numberOfFaceDetected = localFaceDetector.findFaces(localBitmap2, arrayOfFace); //返回識(shí)臉的結(jié)果 
      localBitmap2.recycle(); 
      localBitmap1.recycle();  //釋放位圖資源 
 
    FaceDetectDeal(numberOfFaceDetected); 
  } 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • RxJava 1升級(jí)到RxJava 2過(guò)程中踩過(guò)的一些“坑”

    RxJava 1升級(jí)到RxJava 2過(guò)程中踩過(guò)的一些“坑”

    RxJava2相比RxJava1,它的改動(dòng)還是很大的,那么下面這篇文章主要給大家總結(jié)了在RxJava 1升級(jí)到RxJava 2過(guò)程中踩過(guò)的一些“坑”,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下來(lái)要一起看看吧。
    2017-05-05
  • 使用SurfaceView實(shí)現(xiàn)視頻彈幕

    使用SurfaceView實(shí)現(xiàn)視頻彈幕

    這篇文章主要為大家詳細(xì)介紹了使用SurfaceView實(shí)現(xiàn)視頻彈幕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android開發(fā)之自定義刮刮卡實(shí)現(xiàn)代碼

    Android開發(fā)之自定義刮刮卡實(shí)現(xiàn)代碼

    本篇文章主要介紹了Android開發(fā)之自定義刮刮卡實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 淺析Android Service中實(shí)現(xiàn)彈出對(duì)話框的坑

    淺析Android Service中實(shí)現(xiàn)彈出對(duì)話框的坑

    這篇文章主要介紹了Android Service中實(shí)現(xiàn)彈出對(duì)話框的坑,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Android用于校驗(yàn)集合參數(shù)的小封裝示例

    Android用于校驗(yàn)集合參數(shù)的小封裝示例

    本篇文章主要介紹了Android-用于校驗(yàn)集合參數(shù)的小封裝示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Android開源組件SlidingMenu側(cè)滑菜單使用介紹

    Android開源組件SlidingMenu側(cè)滑菜單使用介紹

    這篇文章主要介紹了Android開源組件SlidingMenu側(cè)滑菜單使用介紹,本文給出了SlidingMenu的項(xiàng)目地址、使用代碼、使用配置、常用的一些屬性設(shè)置中文注解等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Android實(shí)現(xiàn)視圖輪播效果

    Android實(shí)現(xiàn)視圖輪播效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)視圖輪播效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android開屏頁(yè)倒計(jì)時(shí)功能實(shí)現(xiàn)的詳細(xì)教程

    Android開屏頁(yè)倒計(jì)時(shí)功能實(shí)現(xiàn)的詳細(xì)教程

    本篇文章主要介紹了Android實(shí)現(xiàn)開屏頁(yè)倒計(jì)時(shí)功能實(shí)現(xiàn)的詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 淺析安卓(Android)的性能優(yōu)化

    淺析安卓(Android)的性能優(yōu)化

    性能優(yōu)化是一個(gè)大的范疇,如果有人問(wèn)你在Android中如何做性能優(yōu)化的,也許都不知道從哪開始說(shuō)起。那么這篇文章我們從布局優(yōu)化和內(nèi)存優(yōu)化兩個(gè)方面來(lái)展開說(shuō)如何進(jìn)行Android的性能優(yōu)化。
    2016-08-08
  • Android ViewPager實(shí)現(xiàn)滑動(dòng)指示條功能

    Android ViewPager實(shí)現(xiàn)滑動(dòng)指示條功能

    這篇文章主要介紹了Android-ViewPager實(shí)現(xiàn)滑動(dòng)指示條功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論