天天看點

android 動态人臉識别碼,Android開發中人臉識别(靜态)

知道沒有妹紙,你們是不會看的。先放效果圖

android 動态人臉識别碼,Android開發中人臉識别(靜态)

最近,項目中需要用到人臉識别,苦于無奈,各種百度,google有關Android開發中人臉識别的内容,最終發現Android官方自帶的FaceDetector可以實作這個功能,就拿來試試手。這個類在android.media包下

android 動态人臉識别碼,Android開發中人臉識别(靜态)

使用

需要注意:

在識别圖檔中的人臉時,人臉必須是基本露出五官的正臉,側臉很難識别出來。(但根據自己多次測試,發現貌似google的FaceDetector人臉識别算法是基于人眼的識别。如有錯誤,請大家指正)

1.建立一個FaceDetector

width:所需要識别圖檔的寬

height:所需要識别圖檔的高

maxFaces:所需要識别的最大臉數 FaceDetector (int width, int height, int maxFaces)複制代碼

2.開始識别,并将識别的人臉資料存放到Faces[]數組中。

bitmap:所需要識别的圖檔

faces:存儲所有識别到的臉

#注意在建構被識别圖檔Bitmap時,圖檔品質一定要設定為Bitmap.Config.RGB_565,否則無法識别。 findFaces (Bitmap bitmap,Face[] faces)複制代碼

直接開始撸代碼

将圖檔識别的功能封裝到自定義ImageView中,将識别出來的人臉用方框在圖上畫出來。 public class FaceView extends ImageView {

public static final String TAG = "FaceView";

private int imageWidth, imageHeight;

private FaceDetector mFaceDetector;

private int maxFace = 3;

private Bitmap mFaceImage;

private FaceDetector.Face[] mFaces = new FaceDetector.Face[maxFace];

private int mFactFaces;

private float myEyesDistance;

public FaceView(Context context) {

super(context);

init();

}

public FaceView(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

BitmapFactory.Options mOptions = new BitmapFactory.Options();

mOptions.inPreferredConfig = Bitmap.Config.RGB_565;//一定是 565,其他識别不了。

//拿到需要識别的圖檔

mFaceImage = BitmapFactory.decodeResource(getResources(), R.mipmap.image, mOptions);

imageWidth = mFaceImage.getWidth();

imageHeight = mFaceImage.getHeight();

//建立FaceDetector

mFaceDetector = new FaceDetector(imageWidth, imageHeight, maxFace);

//開始檢測,并将檢測到的人臉存到mFaces數組中

mFactFaces = mFaceDetector.findFaces(mFaceImage, mFaces);

Log.e(TAG, "檢測到人臉數:" + mFactFaces);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Paint mPaint = new Paint();

mPaint.setColor(Color.GREEN);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(2);

//對每個人臉開始畫框

for (int i = 0; i < mFactFaces; i++) {

FaceDetector.Face face = mFaces[i];

PointF mPoint = new PointF();

face.getMidPoint(mPoint);

myEyesDistance = face.eyesDistance();//得到人臉中心點和眼間距離參數

canvas.drawRect(

mPoint.x - myEyesDistance,

mPoint.y - myEyesDistance,

mPoint.x + myEyesDistance,

(float) (mPoint.y + myEyesDistance * 1.5),

mPaint);

}

}

}複制代碼

然後在布局檔案 activity_static 中直接使用該FaceView。 <?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:src="@mipmap/image">

複制代碼

Activity中使用布局檔案 public class StaticActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_static);

}

}複制代碼

也可以直接 public class StaticActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(new FaceView(this));

}

}複制代碼

就這樣,完了。文章中如果有錯誤,望大家多多指正。