Integración de reconocimiento facial sin conexión de Android Baidu y adaptación de pantalla horizontal

Este artículo es solo para registrar el proceso para la conveniencia de una rápida integración y uso la próxima vez, sin entrar en discusiones técnicas.

Dirección de reconocimiento facial de Baidu:

Reconocimiento facial_Reconocimiento facial_Precisión 99,99%_Prueba gratuita-Baidu AI Open Platform

En segundo lugar, hay algunas cosas a tener en cuenta: la demostración predeterminada de Baidu es solo para dispositivos con pantallas verticales, como teléfonos móviles o tabletas. Pero no es compatible con el simulador, así que no lo intente en el simulador.

No hay mucho que decir, comience los pasos de integración:

1. Registrar la aplicación para obtener el entorno

1. Después de abrir la URL anterior, elija usar inmediatamente, después de iniciar sesión, primero registre una aplicación

2. Agregue un dispositivo autorizado, número de serie sdk-add de identificación sin conexión de implementación localizada

3. Después de crear un solo dispositivo, habrá dos métodos de activación, uno es la activación en línea y el otro es la activación fuera de línea. Para facilitarme el uso de la activación en línea, después de hacer clic, ingrese el código de activación en el dispositivo para activar.

4. Le sugiero que vaya aquí para descargar la demostración oficial sin importar el reconocimiento facial comercial que haga.

De esta manera, la demostración que descarga es relativamente completa, incluidos los códigos de activación (activación sin conexión, activación en línea, activación de aplicaciones), puertas, asistencia, pago, finanzas, verificación de testigos, análisis de comportamiento de conducción, detección de atención y ocho atributos El modo puede ser utilizado para casi todo tipo de escenarios de negocios. Además, hay dos códigos para el registro de rostros y la gestión de la base de datos de rostros, que se puede decir que son muy completos, y la interfaz de usuario no está mal, puede usar directamente el código de CV.

La interfaz es la siguiente: 

El código no central es fácil de entender, puede mirar el código en combinación con la interfaz.

2. Integrar código en proyectos existentes

1. Entorno integrado

Primero integre el módulo facelibray, no importa en qué escena se encuentre, este es el más básico, como importar.

 Método de importación:

1. Copie los archivos debajo de lib en el código de muestra a la biblioteca debajo de su aplicación

2. Agregue el siguiente código en build.gradle en la aplicación

3. Copie facelibray al proyecto del proyecto

4. Modifique settings.gradle de la siguiente manera

5. Agregue el siguiente código en build.gradle en la aplicación

 De esta manera, el módulo principal y lib están listos. El siguiente paso es analizar sus necesidades.

Hay estas bibliotecas en la demostración de ejemplo.

  1. módulo de asistencia de la biblioteca de asistencia
  2. módulo de atributo attrbutelibrary
  3. módulo de comportamiento de conducción drivermonitorlibrary
  4. módulo financiero de la biblioteca financiera
  5. módulo de puerta gatelibrary
  6. módulo de atención de la biblioteca de miradas
  7. módulo de verificación de autenticación de la biblioteca de identificación
  8. módulo de pago de la biblioteca de pago
  9. registro de rostros de registerlibrary y módulo de gestión de rostros

Depende según sea necesario, los pasos de dependencia son los mismos que los del módulo principal anterior

 3. El código para la activación en línea es el siguiente 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) {

            }
        });
    }

El init es para obtener el código de activación del sp local, si no, salta a la página de activación. Esto es relativamente simple, así que no diré mucho.

4. Después de activar e ingresar a su página de inicio, lo mejor es inicializar la cámara

@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;
        }
    }

Estos códigos se pueden copiar en su demo.

5. Saltar a la página de función correspondiente

@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;
        }
    }

Así es como los clics en sus propios botones saltan a las distintas páginas de escena.

Recuerda agregar permisos

<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" />

Problema de procesamiento de pantalla horizontal:

1. Registro de rostros:

Fui a FaceRegisterNewActivity para configurar dinámicamente el ancho y el alto del control de la cámara circular de acuerdo con el tamaño de la pantalla.

En segundo lugar, debido a que Baidu recopila retratos, la recopilación tiene éxito antes de que reaccione, por lo que agregué un control de cuenta regresiva, que en realidad es un control de texto ordinario en medio del control de captura. Luego use timer+timerTask+handler para hacerlo

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. Escenario empresarial:

Vaya a cada escena, por ejemplo, aquí está la página de asistencia, si comenta lo siguiente, puede mostrar toda la pantalla en horizontal, y el resto no es más que ajustar el ancho y alto de los pequeños controles.

 @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, grabemos esto primero. Básicamente, esto se puede hacer. Cuando el dispositivo Android está fuera de línea, el registro de rostros se realiza en el cliente y se administra la base de datos de rostros y la asistencia.

Mi creación personal, si hay alguna similitud es pura coincidencia, o contáctame para hacer cambios. Por favor reimprimir o combinación de CV para indicar la fuente, ¡gracias! (Si tiene alguna pregunta o error, indíquelo, mi QQ: 752231513)

Supongo que te gusta

Origin blog.csdn.net/qq_30548105/article/details/120566366
Recomendado
Clasificación