美文网首页
Android . 百度人脸识别使用

Android . 百度人脸识别使用

作者: MorningandSun | 来源:发表于2019-12-16 11:47 被阅读0次

    1.按照官网的注册进行之后,设置应用信息 完成后下载sdk
    2.按照文档进行接入 如果出现包重复的情况 在facesdk 的build.gradle文件中 将 compile 改为compileOnly 即可

           compileOnly files('libs/facesdk.jar')
            compileOnly files('libs/baidu_license.jar')
            compileOnly files('libs/ast.jar')
    

    3.下载demo 导入你的项目中 我使用的类为

    public class Face_Login_Activity extends BaseActivity<ActivityFaceLoginBinding> {
        private ActivityFaceLoginBinding activityFaceLoginBinding;
    
        private final static int MSG_INITVIEW = 1001;
        private final static int MSG_DETECTTIME = 1002;
        private final static int MSG_INITWAVE = 1003;
        private boolean mGoodDetect = false;
        private static final double ANGLE = 15;
        private boolean mDetectStoped = false;
        private Handler mHandler;
        private String mCurTips;
        private boolean mDetectTime = true;
        //  private ProgressBar mProgress;
        private boolean mUploading = false;
        private long mLastTipsTime = 0;
        private int mDetectCount = 0;
        private int mCurFaceId = -1;
    
        private FaceDetectManager faceDetectManager;
        private DetectRegionProcessor cropProcessor = new DetectRegionProcessor();
        private WaveHelper mWaveHelper;
        private WaveView mWaveview;
        private int mBorderColor = Color.parseColor("#28FFFFFF");
        private int mBorderWidth = 0;
        private int mScreenW;
        private int mScreenH;
        @Override
        public int getLayout() {
            return R.layout.activity_face_login;
        }
    
        @Override
        protected void initView(ActivityFaceLoginBinding bindView) {
            activityFaceLoginBinding=bindView;
            faceDetectManager = new FaceDetectManager(this);
            initScreen();
            mHandler = new InnerHandler(this);
            mHandler.sendEmptyMessageDelayed(MSG_INITVIEW, 500);
    
            final CameraImageSource cameraImageSource = new CameraImageSource(this);
            cameraImageSource.setPreviewView(activityFaceLoginBinding.previewView);
    
            faceDetectManager.setImageSource(cameraImageSource);
            faceDetectManager.setOnFaceDetectListener(new FaceDetectManager.OnFaceDetectListener() {
                @Override
                public void onDetectFace(final int retCode, FaceInfo[] infos, ImageFrame frame) {
    
                    if (mUploading) {
                        //   Log.d("DetectLoginActivity", "is uploading ,not detect time");
                        return;
                    }
                    //  Log.d("DetectLoginActivity", "retCode is:" + retCode);
                    String str = "";
                    if (retCode == 0) {
                        if (infos != null && infos[0] != null) {
                            FaceInfo info = infos[0];
                            boolean distance = false;
                            if (info != null && frame != null) {
                                if (info.mWidth >= (0.9 * frame.getWidth())) {
                                    distance = false;
                                    str = getResources().getString(R.string.detect_zoom_out);
                                } else if (info.mWidth <= 0.4 * frame.getWidth()) {
                                    distance = false;
                                    str = getResources().getString(R.string.detect_zoom_in);
                                } else {
                                    distance = true;
                                }
                            }
                            boolean headUpDown;
                            if (info != null) {
                                if (info.headPose[0] >= ANGLE) {
                                    headUpDown = false;
                                    str = getResources().getString(R.string.detect_head_up);
                                } else if (info.headPose[0] <= -ANGLE) {
                                    headUpDown = false;
                                    str = getResources().getString(R.string.detect_head_down);
                                } else {
                                    headUpDown = true;
                                }
    
                                boolean headLeftRight;
                                if (info.headPose[1] >= ANGLE) {
                                    headLeftRight = false;
                                    str = getResources().getString(R.string.detect_head_left);
                                } else if (info.headPose[1] <= -ANGLE) {
                                    headLeftRight = false;
                                    str = getResources().getString(R.string.detect_head_right);
                                } else {
                                    headLeftRight = true;
                                }
    
                                if (distance && headUpDown && headLeftRight) {
                                    mGoodDetect = true;
                                } else {
                                    mGoodDetect = false;
                                }
    
                            }
                        }
                    } else if (retCode == 1) {
                        str = getResources().getString(R.string.detect_head_up);
                    } else if (retCode == 2) {
                        str = getResources().getString(R.string.detect_head_down);
                    } else if (retCode == 3) {
                        str = getResources().getString(R.string.detect_head_left);
                    } else if (retCode == 4) {
                        str = getResources().getString(R.string.detect_head_right);
                    } else if (retCode == 5) {
                        str = getResources().getString(R.string.detect_low_light);
                    } else if (retCode == 6) {
                        str = getResources().getString(R.string.detect_face_in);
                    } else if (retCode == 7) {
                        str = getResources().getString(R.string.detect_face_in);
                    } else if (retCode == 10) {
                        str = getResources().getString(R.string.detect_keep);
                    } else if (retCode == 11) {
                        str = getResources().getString(R.string.detect_occ_right_eye);
                    } else if (retCode == 12) {
                        str = getResources().getString(R.string.detect_occ_left_eye);
                    } else if (retCode == 13) {
                        str = getResources().getString(R.string.detect_occ_nose);
                    } else if (retCode == 14) {
                        str = getResources().getString(R.string.detect_occ_mouth);
                    } else if (retCode == 15) {
                        str = getResources().getString(R.string.detect_right_contour);
                    } else if (retCode == 16) {
                        str = getResources().getString(R.string.detect_left_contour);
                    } else if (retCode == 17) {
                        str = getResources().getString(R.string.detect_chin_contour);
                    }
    
                    boolean faceChanged = true;
                    if (infos != null && infos[0] != null) {
                        Log.d("DetectLogin", "face id is:" + infos[0].face_id);
                        if (infos[0].face_id == mCurFaceId) {
                            faceChanged = false;
                        } else {
                            faceChanged = true;
                        }
                        mCurFaceId = infos[0].face_id;
                    }
    
                    if (faceChanged) {
                        showProgressBar(false);
                        onRefreshSuccessView(false);
                    }
    
                    final int resultCode = retCode;
                    if (!(mGoodDetect && retCode == 0)) {
                        if (faceChanged) {
                            showProgressBar(false);
                            onRefreshSuccessView(false);
                        }
                    }
    
                    if (retCode == 6 || retCode == 7 || retCode < 0) {
                        activityFaceLoginBinding.rectView.processDrawState(true);
                    } else {
                        activityFaceLoginBinding.rectView.processDrawState(false);
                    }
    
                    mCurTips = str;
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if ((System.currentTimeMillis() - mLastTipsTime) > 1000) {
                                activityFaceLoginBinding.nameTextView.setText(mCurTips);
                                mLastTipsTime = System.currentTimeMillis();
                            }
                            if (mGoodDetect && resultCode == 0) {
                                activityFaceLoginBinding.nameTextView.setText("");
                                onRefreshSuccessView(true);
                                showProgressBar(true);
                            }
                        }
                    });
    
                    if (infos == null) {
                        mGoodDetect = false;
                    }
    
    
                }
            });
            faceDetectManager.setOnTrackListener(new FaceFilter.OnTrackListener() {
                @Override
                public void onTrack(FaceFilter.TrackedModel trackedModel) {
                    if (trackedModel.meetCriteria() && mGoodDetect) {
                        upload(trackedModel);
                        mGoodDetect = false;
                    }
                }
            });
    
            cameraImageSource.getCameraControl().setPermissionCallback(new PermissionCallback() {
                @Override
                public boolean onRequestPermission() {
                    ActivityCompat.requestPermissions(Face_Login_Activity.this,
                            new String[]{Manifest.permission.CAMERA}, 100);
                    return true;
                }
            });
    
            activityFaceLoginBinding.rectView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    start();
                    activityFaceLoginBinding.rectView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
            ICameraControl control = cameraImageSource.getCameraControl();
            control.setPreviewView(activityFaceLoginBinding.previewView);
            // 设置检测裁剪处理器
            faceDetectManager.addPreProcessor(cropProcessor);
    
            int orientation = getResources().getConfiguration().orientation;
            boolean isPortrait = (orientation == Configuration.ORIENTATION_PORTRAIT);
    
            if (isPortrait) {
                activityFaceLoginBinding.previewView.setScaleType(PreviewView.ScaleType.FIT_WIDTH);
            } else {
                activityFaceLoginBinding.previewView.setScaleType(PreviewView.ScaleType.FIT_HEIGHT);
            }
            int rotation = getWindowManager().getDefaultDisplay().getRotation();
            cameraImageSource.getCameraControl().setDisplayOrientation(rotation);
    
            activityFaceLoginBinding.successImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (activityFaceLoginBinding.successImage.getTag() == null) {
                        Rect rect = activityFaceLoginBinding.rectView.getFaceRoundRect();
                        RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) activityFaceLoginBinding.successImage.getLayoutParams();
                        int w = (int) getResources().getDimension(R.dimen.dp_45);
                        rlp.setMargins(
                                rect.centerX() - (w / 2),
                                rect.top - (w / 2),
                                0,
                                0);
                        activityFaceLoginBinding.successImage.setLayoutParams(rlp);
                        activityFaceLoginBinding.successImage.setTag("setlayout");
                    }
                    activityFaceLoginBinding. successImage.setVisibility(View.GONE);
    
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                        activityFaceLoginBinding.successImage.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        activityFaceLoginBinding.successImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
                }
            });
    
            init();
        }
    
        @Override
        protected void setVM() {
        }
    
        @Override
        protected void setListener() {
            activityFaceLoginBinding.closeIv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
        }
    
        private void initScreen() {
            WindowManager manager = getWindowManager();
            DisplayMetrics outMetrics = new DisplayMetrics();
            manager.getDefaultDisplay().getMetrics(outMetrics);
            mScreenW = outMetrics.widthPixels;
            mScreenH = outMetrics.heightPixels;
        }
    
        @Override
        protected void initData() {
    
        }
    
        private void initWaveview(Rect rect) {
            RelativeLayout.LayoutParams waveParams = new RelativeLayout.LayoutParams(
                    rect.width(), rect.height());
    
            waveParams.setMargins(rect.left, rect.top, rect.left, rect.top);
            waveParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
            waveParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    
            mWaveview = new WaveView(this);
            activityFaceLoginBinding.rootView.addView(mWaveview, waveParams);
    
            mWaveHelper = new WaveHelper(mWaveview);
    
            mWaveview.setShapeType(WaveView.ShapeType.CIRCLE);
            mWaveview.setWaveColor(
                    Color.parseColor("#28FFFFFF"),
                    Color.parseColor("#3cFFFFFF"));
    
            mBorderColor = Color.parseColor("#28f16d7a");
            mWaveview.setBorder(mBorderWidth, mBorderColor);
        }
    
        private void visibleView() {
            activityFaceLoginBinding.cameraLayout.setVisibility(View.INVISIBLE);
        }
    
        private void initBrightness() {
            int brightness = BrightnessTools.getScreenBrightness(this);
            if (brightness < 200) {
                BrightnessTools.setBrightness(this, 200);
            }
        }
    
        private void init() {
            FaceSDKManager.getInstance().getFaceTracker(this).set_min_face_size(200);
            FaceSDKManager.getInstance().getFaceTracker(this).set_isCheckQuality(true);
            // 该角度为商学,左右,偏头的角度的阀值,大于将无法检测出人脸,为了在1:n的时候分数高,注册尽量使用比较正的人脸,可自行条件角度
            FaceSDKManager.getInstance().getFaceTracker(this).set_eulur_angle_thr(15, 15, 15);
            FaceSDKManager.getInstance().getFaceTracker(this).set_isVerifyLive(true);
    
            initBrightness();
        }
        private void start() {
    
            Rect dRect = activityFaceLoginBinding.rectView.getFaceRoundRect();
    
            int preGap = getResources().getDimensionPixelOffset(R.dimen.dp_50);
            int w = getResources().getDimensionPixelOffset(R.dimen.dp_2);
    
            int orientation = getResources().getConfiguration().orientation;
            boolean isPortrait = (orientation == Configuration.ORIENTATION_PORTRAIT);
            if (isPortrait) {
                // 检测区域矩形宽度
                int rWidth = mScreenW - 2 * preGap;
                // 圆框宽度
                int dRectW = dRect.width();
                // 检测矩形和圆框偏移
                int h = (rWidth - dRectW) / 2;
                //  Log.d("liujinhui hi is:", " h is:" + h + "d is:" + (dRect.left - 150));
                int rLeft = w;
                int rRight = rWidth - w;
                int rTop = dRect.top - h - preGap + w;
                int rBottom = rTop + rWidth - w;
    
                //  Log.d("liujinhui", " rLeft is:" + rLeft + "rRight is:" + rRight + "rTop is:" + rTop + "rBottom is:" + rBottom);
                RectF newDetectedRect = new RectF(rLeft, rTop, rRight, rBottom);
                cropProcessor.setDetectedRect(newDetectedRect);
            } else {
                int rLeft = mScreenW / 2 - mScreenH / 2 + w;
                int rRight = mScreenW / 2 + mScreenH / 2 + w;
                int rTop = 0;
                int rBottom = mScreenH;
    
                RectF newDetectedRect = new RectF(rLeft, rTop, rRight, rBottom);
                cropProcessor.setDetectedRect(newDetectedRect);
            }
    
    
            faceDetectManager.start();
            initWaveview(dRect);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            faceDetectManager.stop();
            mDetectStoped = true;
            onRefreshSuccessView(false);
            if (mWaveview != null) {
                mWaveview.setVisibility(View.GONE);
                mWaveHelper.cancel();
            }
        }
    
        /**
         *
         * image    是   string  图像base64编码,每次仅支持单张图片,图片编码后大小不超过10M
         * 返回登录认证的参数给客户端
         * @param model
         */
        private void upload(FaceFilter.TrackedModel model) {
            if (mUploading) {
                Log.d("liujinhui", "is uploading");
                return;
            }
            mUploading = true;
    
            if (model.getEvent() != FaceFilter.Event.OnLeave) {
                mDetectCount++;
    
                try {
                    final Bitmap face = model.cropFace();
                    final File file = File.createTempFile(UUID.randomUUID().toString() + "", ".jpg");
                    ImageUtil.resize(face, file, 200, 200);
                    ImageSaveUtil.saveCameraBitmap(this, face, "head_tmp.jpg");
                
                    String base64Img = "";
                    try {
                        byte[] buf = readFile(file);
                        base64Img = new String(Base64.encode(buf, Base64.NO_WRAP));
                        //此处获得base64的人脸图片 将图片传递给后台即可。
                        Intent intent=new Intent();
                        intent.putExtra("face_img",base64Img);
                        setResult(0,intent);
                        finish();
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ArrayIndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            } else {
                onRefreshSuccessView(false);
                showProgressBar(false);
                mUploading = false;
            }
        }
    
        private void showProgressBar(final boolean show) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (show) {
                        if (mWaveview != null) {
                            mWaveview.setVisibility(View.VISIBLE);
                            mWaveHelper.start();
                        }
                    } else {
                        if (mWaveview != null) {
                            mWaveview.setVisibility(View.GONE);
                            mWaveHelper.cancel();
                        }
                    }
    
                }
            });
        }
    
        private void deleteFace(File file) {
            if (file != null && file.exists()) {
                file.delete();
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if (mWaveview != null) {
                mWaveHelper.cancel();
                mWaveview.setVisibility(View.GONE);
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            mDetectTime = true;
            if (mDetectStoped) {
                faceDetectManager.start();
                mDetectStoped = false;
            }
    
        }
    
        private void onRefreshSuccessView(final boolean isShow) {
    
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activityFaceLoginBinding.successImage.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);
                }
            });
        }
    
        private static class InnerHandler extends Handler {
            private WeakReference<Face_Login_Activity> mWeakReference;
    
            public InnerHandler(Face_Login_Activity activity) {
                super();
                this.mWeakReference = new WeakReference<Face_Login_Activity>(activity);
            }
    
            @Override
            public void handleMessage(Message msg) {
                if (mWeakReference == null || mWeakReference.get() == null) {
                    return;
                }
                Face_Login_Activity activity = mWeakReference.get();
                if (activity == null) {
                    return;
                }
                if (msg == null) {
                    return;
    
                }
                switch (msg.what) {
                    case MSG_INITVIEW:
                        activity.visibleView();
                        break;
                    case MSG_DETECTTIME:
                        activity.mDetectTime = true;
                        break;
                    default:
                        break;
                }
            }
        }
    
    
    }
    

    相关文章

      网友评论

          本文标题:Android . 百度人脸识别使用

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