知道沒有妹紙,你們是不會看的。先放效果圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNhZWZjFTOmVWYzE2NxETMjljMwETZzkzMllDNyUGN08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
最近,項目中需要用到人臉識别,苦于無奈,各種百度,google有關Android開發中人臉識别的内容,最終發現Android官方自帶的FaceDetector可以實作這個功能,就拿來試試手。這個類在android.media包下
使用
需要注意:
在識别圖檔中的人臉時,人臉必須是基本露出五官的正臉,側臉很難識别出來。(但根據自己多次測試,發現貌似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));
}
}複制代碼
就這樣,完了。文章中如果有錯誤,望大家多多指正。