微信:hi222999
QQ群:103267029
知道没有妹纸,你们是不会看的。
先放效果图
最近,项目中需要用到人脸识别,苦于无奈,各种百度,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"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.drawthink.facerecognition.FaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:src="@mipmap/image">
</com.drawthink.facerecognition.FaceView>
</RelativeLayout>
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));
}
}
就这样,完了。文章中如果有错误,望大家多多指正。
网友评论
多了个点在后面
mFaceImage = BitmapFactory.decodeResource(getResources(), R.mipmap.image, mOptions);
R.mipmap.image要跟
<com.drawthink.facerecognition.FaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:src="@mipmap/image">
</com.drawthink.facerecognition.FaceView>
FaceView的src图片是同一张。