ZKHB虹膜识别

最近添加了该款虹膜的识别,要实现该功能,提前是你要有这款虹膜产品。
今天只是说一下虹膜识别中的一些方法,怎么识别的,具体的工作都在各厂商自己封装的库中。首先,我们要添加该厂商提供的库,主要是虹膜识别的算法的库,大大小小的大约有快十个库。实现虹膜识别,我们需要虹膜专用设别的摄像头。
在OnCreate()中,我们需要设置好摄像头、初始化识别界面、语音、初始化虹膜。这里设置摄像头是因为,该模块不支持双摄像头工作。
1、 EnumDeviceType.getCurrentDevice().setCameraId(1);由于我们自己的设备原本就有一个摄像头,所以这里必须先给他设置好要用的摄像头,摄像头都是用Id去设置的,默认的都是0。
2、设置好两眼的距离,以及初始化界面布局,这里用的是ProgressBar来显示进度:

private void screenUiAdjust() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
    int screenWidth = metrics.widthPixels; // 获取屏幕的宽
    Configuration mConfiguration = this.getResources().getConfiguration();
    int ori = mConfiguration.orientation;// 获取屏幕方向
    if (ori == Configuration.ORIENTATION_LANDSCAPE) {   // 如果是横屏,预览区域的  宽为当前屏幕宽的80%,根据设备的不同可以动态再进行适配
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        hor_scale = 0.6f;
        eyeViewWidth = (int) (screenWidth * hor_scale);
        // 由于图像是16:9的图像
        eyeViewHeight = (int) (eyeViewWidth / 1.777f);
        // 在480*270的分辨率下,双眼相对于左上角的坐标点为(140,110),(340,110) ps:固定坐标点,修改需要咨询虹霸开发人员
        float x = (float) eyeViewWidth / IKALGConstant.IK_DISPLAY_IMG_WIDTH;
        float y = (float) eyeViewHeight / IKALGConstant.IK_DISPLAY_IMG_HEIGHT;
        DecimalFormat df = new DecimalFormat("0.00");
        int transWid = (screenWidth - eyeViewWidth)/2;
        eyeX1 = Float.parseFloat(df.format(x)) * EnumDeviceType.getCurrentDevice().getDefaultLeftIrisCol()+ transWid;
        eyeX2 = Float.parseFloat(df.format(x)) * EnumDeviceType.getCurrentDevice().getDefaultRightIrisCol()+ transWid;
        eyeHeight = Float.parseFloat(df.format(y)) * EnumDeviceType.getCurrentDevice().getDefaultLeftIrisRow();
    } else if (ori == Configuration.ORIENTATION_PORTRAIT) { // 竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        hor_scale = 1.0f;
        eyeViewWidth = screenWidth;// 如果是竖屏,预览区域的宽为屏幕的宽
        // 由于图像是16:9的图像
        eyeViewHeight = (int) (eyeViewWidth / 1.777f);
        // 在480*270的分辨率下,双眼的坐标点为(140,110),(340,110) ps:固定坐标点,修改需要咨询虹霸开发人员
        float x = (float) eyeViewWidth / IKALGConstant.IK_DISPLAY_IMG_WIDTH;
        float y = (float) eyeViewHeight / IKALGConstant.IK_DISPLAY_IMG_HEIGHT;
        DecimalFormat df = new DecimalFormat("0.00");
        eyeX1 = Float.parseFloat(df.format(x)) * EnumDeviceType.getCurrentDevice().getDefaultLeftIrisCol();
        eyeX2 = Float.parseFloat(df.format(x)) * EnumDeviceType.getCurrentDevice().getDefaultRightIrisCol();
        eyeHeight = Float.parseFloat(df.format(y)) * EnumDeviceType.getCurrentDevice().getDefaultLeftIrisRow();
    }
    
    requestWindowFeature(Window.FEATURE_NO_TITLE); // 全屏,不出现图标
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
}

以上就是设置两眼在屏幕中的位置。

    private void initUI() {
    svCamera = (SurfaceView) findViewById(R.id.iv_camera);
    LayoutParams svParams = svCamera.getLayoutParams();
    svParams.width = eyeViewWidth;
    svParams.height = eyeViewHeight;
    svCamera.setLayoutParams(svParams);
    holder = svCamera.getHolder();
    holder.addCallback(surfaceCallback);
    matrix = new Matrix();

    progressBar = (RoundProgressBar) findViewById(R.id.roundProgress);
    progressBar.setXAndY(eyeX1, eyeX2, eyeHeight);// 设置双眼progressbar的位置
    progressBar.setHorScale(hor_scale);
    // Init button
    mIrisRegisterBtn = (Button) findViewById(R.id.btn_register);
    mIrisRegisterBtn.setOnClickListener(this);
    mIrisIdenBtn = (Button) findViewById(R.id.btn_scan);
    mIrisIdenBtn.setOnClickListener(this);
    mIrisCaptureBtn = (Button) findViewById(R.id.btn_capture);
    mIrisCaptureBtn.setOnClickListener(this);

    mResultTextViewEnrRecFinal = (TextView) findViewById(R.id.ie_final_result);
    et_userName = (EditText) findViewById(R.id.et_userName);
    previewParaUpdated = false;
}‘

这里还是使用SurfaceView来展示摄像画面,并生成SurfaceHolder。
3、接下来就是最重要的一步了,初始化虹膜模块

  private void initIrisData() {
    irisLeftData = new FeatureList(maxFeatureCount, "L");
    irisRightData = new FeatureList(maxFeatureCount, "R");

    // 2017.09.05 10:25修改,从数据库查询所有特征文件
    leftEyeList = (ArrayList<IrisUserInfo>) sqliteDataBase.queryLeftFeature();

    rightEyeList = (ArrayList<IrisUserInfo>) sqliteDataBase.queryRightFeature();

    if (leftEyeList.size() == 0 || leftEyeList == null
        && rightEyeList.size() == 0 || rightEyeList == null) {
        return;
    }

    for (int i = 0; i < leftEyeList.size(); i++) {
        irisLeftData.irisput(new Person(leftEyeList.get(i).m_UserName), EnumEyeType.LEFT,
                new Portrait(1), leftEyeList.get(i).m_LeftTemplate);
    }

    for (int i = 0; i < rightEyeList.size(); i++) {
        irisRightData.irisput(new Person(rightEyeList.get(i).m_UserName), EnumEyeType.RIGHT,
                new Portrait(1), rightEyeList.get(i).m_RightTemplate);
    }

    mIrisPresenter.setIrisData(irisLeftData, irisRightData, faceData);//需要把特征传入jar包,以便识别
}

后面的将人的虹膜特征传入Jar包是为了后续的识别。

接下来就是注册识别的工作了,这些工作各厂商都会给出相应的接口或者DEMO,主要是注册成功后和识别成功后多数据的处理。这些数据基本都是byte数组,如果需要上传至服务器,建议最好使用Base64对其进行编码,不然传输过程中,有些特殊字符会出现问题。

    原文作者:andy_XJ
    原文地址: https://www.jianshu.com/p/4193a1fe8fe5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞