Skip to content
  • P
    Projects
  • G
    Groups
  • S
    Snippets
  • Help

android / dayu

  • This project
    • Loading...
  • Sign in
Go to a project
  • Project
  • Repository
  • Issues 0
  • Merge Requests 0
  • Pipelines
  • Wiki
  • Snippets
  • Members
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Files
  • Commits
  • Branches
  • Tags
  • Contributors
  • Graph
  • Compare
  • Charts
Switch branch/tag
  • dayu
  • ..
  • util
  • IDetection.java
Find file
Normal viewHistoryPermalink
IDetection.java 6.55 KB
Newer Older
罗翻's avatar
增加人脸识别
5b0d1c4f
 
罗翻 committed 7 years ago
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
package com.megvii.idcardlib.util;

import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;

import com.megvii.idcardlib.R;
import com.megvii.livenessdetection.Detector;
import com.megvii.livenessdetection.Detector.DetectionType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/**
 * 实体验证工具类
 */
public class IDetection {

罗翻's avatar
处理工单前增加活体检测
33d53e1f
 
罗翻 committed 6 years ago
25 26 27 28 29 30 31 32 33 34 35 36
    private View rootView;
    private Context mContext;

    public View[] mAnimViews;
    private int num = 3;// 动作数量
    private HashMap<Integer, Drawable> mDrawableCache;
    public int mCurShowIndex = -1;// 现在底部展示试图的索引值
    public ArrayList<Detector.DetectionType> mDetectionSteps;// 活体检测动作列表

    public IDetection(Context mContext, View view) {
        this.mContext = mContext;
        this.rootView = view;
罗翻's avatar
处理工单前增加活体检测
31d44116
 
罗翻 committed 6 years ago
37
        mDrawableCache = new HashMap<>();
罗翻's avatar
处理工单前增加活体检测
33d53e1f
 
罗翻 committed 6 years ago
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
    }

    public void animationInit() {
        int[] reses = {R.drawable.liveness_head_pitch, R.drawable.liveness_head_yaw,
                R.drawable.liveness_mouth_open_closed, R.drawable.liveness_eye_open_closed};
        for (int oneRes : reses) {
            mDrawableCache.put(oneRes, (mContext.getResources().getDrawable(oneRes)));
        }
    }

    public void viewsInit() {
        mAnimViews = new View[2];
        mAnimViews[0] = (rootView.findViewById(R.id.liveness_layout_first_layout));
        mAnimViews[1] = (rootView.findViewById(R.id.liveness_layout_second_layout));
        for (View tmpView : mAnimViews) {
            tmpView.setVisibility(View.INVISIBLE);
        }
    }

    public void changeType(final Detector.DetectionType detectiontype, long timeout) {
        Animation animationIN = AnimationUtils.loadAnimation(mContext, R.anim.liveness_rightin);
        Animation animationOut = AnimationUtils.loadAnimation(mContext, R.anim.liveness_leftout);

        if (mCurShowIndex != -1) // 已经存在layout 需要移除之
        {
            mAnimViews[mCurShowIndex].setVisibility(View.INVISIBLE);
            mAnimViews[mCurShowIndex].setAnimation(animationOut);
        } else {
            mAnimViews[0].setVisibility(View.INVISIBLE);
            mAnimViews[0].startAnimation(animationOut);
        }

        mCurShowIndex = mCurShowIndex == -1 ? 0 : (mCurShowIndex == 0 ? 1 : 0);
        initAnim(detectiontype, mAnimViews[mCurShowIndex]);
        mAnimViews[mCurShowIndex].setVisibility(View.VISIBLE);
        mAnimViews[mCurShowIndex].startAnimation(animationIN);
    }

    TextView detectionNameText;
    String detectionNameStr;

    private void initAnim(Detector.DetectionType detectiontype, View layoutView) {
        ImageView tmpImageView = (ImageView) layoutView.findViewById(R.id.detection_step_image);
        tmpImageView.setImageDrawable(getDrawRes(detectiontype));

        ((AnimationDrawable) tmpImageView.getDrawable()).start();
        detectionNameText = (TextView) layoutView.findViewById(R.id.detection_step_name);
        detectionNameStr = getDetectionName(detectiontype);
        detectionNameText.setText(detectionNameStr);
    }

    public void checkFaceTooLarge(boolean isLarge) {
        if (detectionNameStr != null && detectionNameText != null) {
            if (isLarge && !detectionNameText.getText().toString().equals(mContext.getString(R.string.face_too_large))) {
                detectionNameText.setText(R.string.face_too_large);
            } else if (!isLarge && detectionNameText.getText().toString().equals(mContext.getString(R.string.face_too_large))) {
                detectionNameText.setText(detectionNameStr);
            }
        }
    }

    private Drawable getDrawRes(Detector.DetectionType detectionType) {
        int resID = -1;
        switch (detectionType) {
            case POS_PITCH:
            case POS_PITCH_UP:
            case POS_PITCH_DOWN:
                resID = R.drawable.liveness_head_pitch;
                break;
            case POS_YAW_LEFT:
            case POS_YAW_RIGHT:
            case POS_YAW:
                resID = R.drawable.liveness_head_yaw;
                break;
            case MOUTH:
                resID = R.drawable.liveness_mouth_open_closed;
                break;
            case BLINK:
                resID = R.drawable.liveness_eye_open_closed;
                break;
        }
        Drawable cachedDrawAble = mDrawableCache.get(resID);
        if (cachedDrawAble != null)
            return cachedDrawAble;
        else {
            Drawable drawable = mContext.getResources().getDrawable(resID);
            mDrawableCache.put(resID, (drawable));
            return drawable;
        }
    }

    private String getDetectionName(Detector.DetectionType detectionType) {
        String detectionName = null;
        switch (detectionType) {
            case POS_PITCH:
                detectionName = mContext.getString(R.string.meglive_pitch);
                break;
            case POS_YAW:
                detectionName = mContext.getString(R.string.meglive_yaw);
                break;
            case MOUTH:
                detectionName = mContext.getString(R.string.meglive_mouth_open_closed);
                break;
            case BLINK:
                detectionName = mContext.getString(R.string.meglive_eye_open_closed);
                break;
            case POS_YAW_LEFT:
                detectionName = mContext.getString(R.string.meglive_pos_yaw_left);
                break;
            case POS_YAW_RIGHT:
                detectionName = mContext.getString(R.string.meglive_pos_yaw_right);
                break;
        }
        return detectionName;
    }

    public void setNum(int n) {
        num = n;
    }

    /**
     * 初始化检测动作
     */
    public void detectionTypeInit() {
        ArrayList<DetectionType> tmpTypes = new ArrayList<>();
        tmpTypes.add(Detector.DetectionType.BLINK);// 眨眼
        tmpTypes.add(Detector.DetectionType.MOUTH);// 张嘴
        tmpTypes.add(Detector.DetectionType.POS_PITCH);// 缓慢点头
        tmpTypes.add(Detector.DetectionType.POS_YAW);// 左右摇头
        Collections.shuffle(tmpTypes);// 打乱顺序
        mDetectionSteps = new ArrayList<>(num);
        for (int i = 0; i < num; i++) {
            mDetectionSteps.add(tmpTypes.get(i));
        }
    }

    public void onDestroy() {
        rootView = null;
        mContext = null;
        if (mDrawableCache != null) {
            mDrawableCache.clear();
        }
    }
罗翻's avatar
增加人脸识别
5b0d1c4f
 
罗翻 committed 7 years ago
181
}