Android开发中人脸识别(静态)

作者: drawthink | 来源:发表于2017-06-03 16:03 被阅读3264次

    微信: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));
        }
    }
    

    就这样,完了。文章中如果有错误,望大家多多指正。

    相关文章

      网友评论

      • 王增辉:不知道楼主有没有做过兼容性测试,很多国产ROM上检测不到人脸
        drawthink:写了个小demo,只是在我手机上跑了跑,确实没做多少兼容性测试。
      • lchad:另外,你介绍的这种方法只能识别双眼距离大于20 像素的图片
      • 十七的样子:感觉有部分代码哪里看过,而且这只是人脸检测,并不是识别。识别的话,基于google service有一个,开源的seetaface一个。都是有脸部特征值返回的。
        drawthink: @十七的样子 学习了。
      • 不二小姐的不二先生:不知道楼主有没有人脸识别解锁的源码
      • a5d1d19ffcda:这个叫人脸检测,人脸识别是face recognition
      • drawthink:写的时候忘了,
        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图片是同一张。

      本文标题:Android开发中人脸识别(静态)

      本文链接:https://www.haomeiwen.com/subject/yefmfxtx.html