最近添加了该款虹膜的识别,要实现该功能,提前是你要有这款虹膜产品。
今天只是说一下虹膜识别中的一些方法,怎么识别的,具体的工作都在各厂商自己封装的库中。首先,我们要添加该厂商提供的库,主要是虹膜识别的算法的库,大大小小的大约有快十个库。实现虹膜识别,我们需要虹膜专用设别的摄像头。
在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对其进行编码,不然传输过程中,有些特殊字符会出现问题。