Intégration de la reconnaissance faciale hors ligne Android Baidu et adaptation horizontale de l'écran

Cet article est juste pour enregistrer le processus pour la commodité d'une intégration rapide et d'une utilisation la prochaine fois, sans entrer dans des discussions techniques

Adresse de reconnaissance faciale de Baidu :

Reconnaissance faciale_Reconnaissance faciale_Précision 99,99 %_Essai gratuit-Baidu AI Open Platform

Deuxièmement, il y a quelques points à noter : la démo par défaut de Baidu est uniquement pour les appareils avec des écrans verticaux, tels que les téléphones portables ou les tablettes. Mais il ne prend pas en charge le simulateur, alors ne l'essayez pas sur le simulateur.

Pas grand chose à dire, lancez les étapes d'intégration :

1. Enregistrez l'application pour obtenir l'environnement

1. Après avoir ouvert l'URL ci-dessus, choisissez d'utiliser immédiatement, après vous être connecté, enregistrez d'abord une application

2. Ajouter un appareil autorisé, déploiement localisé-identification hors ligne sdk-add numéro de série

3. Après avoir créé un seul appareil, il y aura deux méthodes d'activation, l'une est l'activation en ligne et l'autre est l'activation hors ligne. Afin de me faciliter l'utilisation de l'activation en ligne, après avoir cliqué, entrez le code d'activation sur l'appareil à activer.

4. Je vous suggère d'aller ici pour télécharger la démo officielle, peu importe la reconnaissance faciale de votre entreprise.

De cette façon, la démo que vous téléchargez est relativement complète, y compris les codes d'activation (activation hors ligne, activation en ligne, activation de l'application), les portes, la présence, le paiement, les finances, la vérification des témoins, l'analyse du comportement de conduite, la détection de l'attention et huit attributs. Le mode peut être utilisé pour presque tous les types de scénarios commerciaux. De plus, il existe deux codes pour l'enregistrement des visages et la gestion de la base de données des visages, qui peuvent être considérés comme très complets, et l'interface utilisateur n'est pas mauvaise, vous pouvez directement coder le CV.

L'interface est la suivante : 

Le code non essentiel est facile à comprendre, vous pouvez regarder le code en combinaison avec l'interface.

2. Intégrer le code dans les projets existants

1. Environnement intégré

Intégrez d'abord le module facelibray, peu importe dans quelle scène vous vous trouvez, c'est le plus basique, comme l'import.

 Méthode d'importation :

1. Copiez les fichiers sous lib dans l'exemple de code vers la bibliothèque sous votre application

2. Ajoutez le code suivant sous build.gradle sous app

3. Copiez facelibray dans le projet de projet

4. Modifiez settings.gradle comme suit

5. Ajoutez le code suivant sous build.gradle sous app

 De cette façon, le module principal et la bibliothèque sont tous terminés. La prochaine étape consiste à examiner vos besoins.

Il y a ces bibliothèques dans l'exemple de démonstration

  1. module de présence à la bibliothèque
  2. module d'attribut attrbutelibrary
  3. module de comportement de conduite de la bibliothèque de moniteurs de conduite
  4. module financier de la bibliothèque des finances
  5. module de porte gatelibrary
  6. module d'attention gazelibrary
  7. module de vérification d'authentification d'identifierlibrary
  8. module de paiement de bibliothèque de paiement
  9. module d'enregistrement et de gestion des visages de la bibliothèque de registres

Selon les besoins, les étapes de dépendance sont les mêmes que le module principal ci-dessus

 3. Le code d'activation en ligne est le suivant startActivity :

private void initLicense() {
        FaceSDKManager.getInstance().init(mContext, new SdkInitListener() {
            @Override
            public void initStart() {

            }

            public void initLicenseSuccess() {

                TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                        /**
                         *要执行的操作
                         */
                        startActivity(new Intent(mContext, MainActivity.class));
                        finish();
                    }
                };
                Timer timer = new Timer();
                timer.schedule(task, 2000);
            }

            @Override
            public void initLicenseFail(int errorCode, String msg) {
                TimerTask task = new TimerTask() {
                    @Override
                    public void run() {
                        /**
                         *要执行的操作
                         */
                        startActivity(new Intent(mContext, ActivitionActivity.class));
                        finish();
                    }
                };
                Timer timer = new Timer();
                timer.schedule(task, 2000);
            }

            @Override
            public void initModelSuccess() {
            }

            @Override
            public void initModelFail(int errorCode, String msg) {

            }
        });
    }

L'init consiste à obtenir le code d'activation du sp local, sinon, passez à la page d'activation. C'est relativement simple, donc je ne dirai pas grand chose.

4. Après avoir activé et accédé à votre page d'accueil, il est préférable d'initialiser la caméra

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        mContext = this;
        initView();

        initRGBCheck();
}
private void initRGBCheck(){
        if (isSetCameraId()){
            return;
        }
        int mCameraNum = Camera.getNumberOfCameras();
        ToastUtils.toast(mContext,mCameraNum+"个");
        if (mCameraNum > 1){
            try {
                mCamera = new Camera[mCameraNum];
                previewTextures = new PreviewTexture[mCameraNum];
                mCamera[0] = Camera.open(0);
                previewTextures[0] = new PreviewTexture(this, checkRBGTexture);
                previewTextures[0].setCamera(mCamera[0], PREFER_WIDTH, PREFER_HEIGHT);
                mCamera[0].setPreviewCallback(new Camera.PreviewCallback() {
                    @Override
                    public void onPreviewFrame(byte[] data, Camera camera) {
                        int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
                        if (check == 1){
                            setRgbCameraId(0);
                        }
                        release(0);
                    }
                });
            }catch (Exception e){
                e.printStackTrace();
            }
            try {
                mCamera[1] = Camera.open(1);
                previewTextures[1] = new PreviewTexture(this, checkNIRTexture);
                previewTextures[1].setCamera(mCamera[1], PREFER_WIDTH, PREFER_HEIGHT);
                mCamera[1].setPreviewCallback(new Camera.PreviewCallback() {
                    @Override
                    public void onPreviewFrame(byte[] data, Camera camera) {
                        int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
                        if (check == 1){
                            setRgbCameraId(1);
                        }
                        release(1);
                    }
                });
            }catch (Exception e){
                e.printStackTrace();
            }
        } else {
            setRgbCameraId(0);
        }
    }

    private void setRgbCameraId(int index){
        com.baidu.idl.main.facesdk.attendancelibrary.model.SingleBaseConfig.getBaseConfig().setRBGCameraId(index);
        com.baidu.idl.main.facesdk.registerlibrary.user.model.SingleBaseConfig.getBaseConfig().setRBGCameraId(index);

        AttendanceConfigUtils.modityJson();
        RegisterConfigUtils.modityJson();

    }
    private boolean isSetCameraId(){
        if (com.baidu.idl.main.facesdk.attendancelibrary.
                        model.SingleBaseConfig.getBaseConfig().getRBGCameraId() == -1 ||
                com.baidu.idl.main.facesdk.registerlibrary.user.model.
                        SingleBaseConfig.getBaseConfig().getRBGCameraId() == -1){
            return false;
        }else {
            return true;
        }
    }

Ces codes peuvent être copiés dans sa démo.

5. Aller à la page de fonction correspondante

@Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.home_checkRl:
                mLiveType = com.baidu.idl.main.facesdk.attendancelibrary.model.SingleBaseConfig.getBaseConfig().getType();
                // 考勤模块
                judgeLiveType(mLiveType,
                        FaceRGBAttendanceActivity.class,
                        FaceNIRAttendanceActivity.class,
                        FaceDepthAttendanceActivity.class,
                        FaceRGBNirDepthAttendanceActivity.class);
                break;
            case R.id.relative_register: // 人脸注册
                dismissPopupWindow();
                SharedPreferences sharedPreferences = this.getSharedPreferences("type", MODE_PRIVATE);
                mLiveType = sharedPreferences.getInt("type", 0);
                com.baidu.idl.main.facesdk.registerlibrary.user.manager.FaceSDKManager.getInstance().setActiveLog();
                judgeLiveType(mLiveType, FaceRegisterNewActivity.class, FaceRegisterNewNIRActivity.class,
                        FaceRegisterNewDepthActivity.class, FaceRegisterNewRgbNirDepthActivity.class);
                break;
        }
    }


    private void judgeLiveType(int type, Class<?> rgbCls, Class<?> nirCls, Class<?> depthCls, Class<?> rndCls) {
        switch (type) {
            case 0: { // 不使用活体
                startActivity(new Intent(HomeActivity.this, rgbCls));
                break;
            }

            case 1: { // RGB活体
                startActivity(new Intent(HomeActivity.this, rgbCls));
                break;
            }

            case 2: { // NIR活体
                startActivity(new Intent(HomeActivity.this, nirCls));
                break;
            }

            case 3: { // 深度活体
                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
                judgeCameraType(cameraType, depthCls);
                break;
            }

            case 4: { // rgb+nir+depth活体
                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
                judgeCameraType(cameraType, rndCls);
            }
        }
    }

    private void judgeCameraType(int cameraType, Class<?> depthCls) {
        switch (cameraType) {
            case 1: { // pro
                startActivity(new Intent(HomeActivity.this, depthCls));
                break;
            }

            case 2: { // atlas
                startActivity(new Intent(HomeActivity.this, depthCls));
                break;
            }

            case 6: { // Pico
                //  startActivity(new Intent(HomeActivity.this,
                // PicoFaceDepthLivenessActivity.class));
                break;
            }

            default:
                startActivity(new Intent(HomeActivity.this, depthCls));
                break;
        }
    }

C'est ainsi que les clics sur leurs propres boutons sautent vers les différentes pages de scène.

N'oubliez pas d'ajouter des autorisations

<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.hardware.camera.autofocus" />
    <uses-permission
        android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.camera.front"
        android:required="true" />
    <uses-feature
        android:name="android.hardware.camera.front.autofocus"
        android:required="true" />

Problème de traitement d'écran horizontal :

1. Enregistrement du visage :

Je suis allé à FaceRegisterNewActivity pour définir dynamiquement la largeur et la hauteur du contrôle circulaire de la caméra en fonction de la taille de l'écran.

Deuxièmement, parce que Baidu collectionne les portraits, la collection réussit avant de réagir, j'ai donc ajouté un contrôle de compte à rebours, qui est en fait un contrôle de texte ordinaire au milieu du contrôle de capture. Ensuite, utilisez timer + timerTask + handler pour le faire

private void initView() {
        tvNum=findViewById(R.id.tv_num); //这是我自己加的倒计时控件,在镜头中心
        mAutoTexturePreviewView = findViewById(R.id.auto_camera_preview_view);
        mFaceRoundProView = findViewById(R.id.round_view);

        // 屏幕的宽
        int displayWidth = DensityUtils.getDisplayWidth(FaceRegisterNewActivity.this);
        // 屏幕的高
        int displayHeight = DensityUtils.getDisplayHeight(FaceRegisterNewActivity.this);

        int min=Math.min(displayWidth,displayHeight);

        ViewGroup.LayoutParams lp1 = mAutoTexturePreviewView.getLayoutParams();
        lp1.width=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        lp1.height=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        mAutoTexturePreviewView.setLayoutParams(lp1);

        ViewGroup.LayoutParams lp2 = mFaceRoundProView.getLayoutParams();
        lp2.width=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        lp2.height=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        mAutoTexturePreviewView.setLayoutParams(lp2);

        ViewGroup.LayoutParams lp3 = tvNum.getLayoutParams();
        lp3.width=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        lp3.height=min-DensityUtils.dip2px(FaceRegisterNewActivity.this,30);
        mAutoTexturePreviewView.setLayoutParams(lp3);
        tvNum.setText("3");
        tvNum.setVisibility(View.VISIBLE);

        ....
}

2. Scénario commercial :

Allez à chaque scène, par exemple, voici la page de présence, si vous commentez ce qui suit, vous pouvez afficher tout l'écran horizontalement, et le reste n'est rien de plus que d'ajuster la largeur et la hauteur des petits contrôles

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        initListener();
        FaceSDKManager.getInstance().initDataBases(this);
        setContentView(R.layout.activity_face_rgb_attendancelibrary);
        initView();
        // 屏幕的宽
//        int displayWidth = DensityUtils.getDisplayWidth(mContext);
        // 屏幕的高
//        int displayHeight = DensityUtils.getDisplayHeight(mContext);
        // 当屏幕的宽大于屏幕宽时
//        if (displayHeight < displayWidth) {
//            // 获取高
//            int height = displayHeight;
//            // 获取宽
//            int width = (int) (displayHeight * ((9.0f / 16.0f)));
//            // 设置布局的宽和高
//            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
//            // 设置布局居中
//            params.gravity = Gravity.CENTER;
//            relativeLayout.setLayoutParams(params);
//        }
    }

Ok, enregistrons ceci en premier. Ceux-ci peuvent essentiellement être faits. Lorsque l'appareil Android est hors ligne, l'enregistrement des visages est effectué sur le client, et la base de données des visages et la présence sont gérées.

Ma création personnelle, s'il y a une similitude, c'est purement fortuite, ou contactez-moi pour apporter des modifications. Veuillez réimprimer ou combiner votre CV pour indiquer la source, merci ! (Si vous avez des questions ou des erreurs, veuillez les signaler, mon QQ : 752231513)

Je suppose que tu aimes

Origine blog.csdn.net/qq_30548105/article/details/120566366
conseillé
Classement