动态人脸识别与身份证上的头像如何对比,看是不是同一个人?
【人脸实时比对与身份证比对判断是否是一个人的Android Demo】
关于此项目的需求
经常有这种需求,比如住宾馆、开证明,银行卡提款等
要验证这个人跟身份证是同一个人的需求,我们暂且叫做《人证比对》需求。那么这里一定牵涉到人脸的识别,识别出人脸,然后实时的拿到人脸,再去跟身份证的头像做比对。比对出一个结果值来,如果这个结果值特别像一个人,那么我们就认为它是一个人。(本文用Android
程序实现)实现身份证与人脸实时比对判断是否是一个人的Android Demo.
项目运行截图:
关于身份证读卡:
身份证读卡
第一个就是要读取到身份证信息。拿到照片数据、身份证数据(比如身份证号码、年龄、性别、出生年月等)。这个设备就叫做身份证读卡器(比如
我们这个项目用的是《云从科技》的机器,集成了身份证读卡器,实际上是买的华视读卡器设备(提供了AndroidDemo 我们在这里封装成了
读卡器Libarary也叫 读卡器单独的module 、或者叫sdk)。
项目结构:
项目解释:
app module 依赖libraries 目录下的FaceVerifyModel和ReadIDCardModel。我们对身份证读卡的sdk做了简单的封装。我们无需理会读卡的具体过程,我可以再本片文章做简单的解释,以便你更快的理解我封装的sdk运行原理读卡原理。
关于sdk的封装代码简单解释:
要一直读卡,那么一定会有一个子线程while(true)一直读卡,直到程序停止,app退出,那么这个线程结束。我们要用一个线程控制。。
private class AlwaysReadCardRunnable implements Runnable { @Override
public void run() {
HSIDCardInfo icCardInfo; while (isAutoReadCard) { synchronized (hsOtgApi) { //读取成功阻塞3秒
SystemClock.sleep(4 * 100); if (hsOtgApi.Authenticate(200, 200) != 1) {
Log.i(TAG, "卡认证失败"); //SystemClock.sleep(1 * 1000);
SystemClock.sleep(1 * 1000);
} else {
icCardInfo = new HSIDCardInfo();
ReadCardEvent cardEvent = new ReadCardEvent(); if (hsOtgApi.ReadCard(icCardInfo, 200, 1300) == 1) { int ret = hsOtgApi.Unpack(filepath, icCardInfo.getwltdata());// 照片解码
if (ret != 0) {
Log.i(TAG, "unzip success");
}
cardEvent.setCardInfo(icCardInfo);
EventBus.getDefault().post(cardEvent);
Log.i(TAG, "读卡成功");
SystemClock.sleep(5 * 100);
} else{
Log.i(TAG, "读卡shibai");
} //SystemClock.sleep(3 * 1000);
}
}
}
}
}
Demo使用方法:
Activity的创建后初始化此sdk
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); new VerifyPresenter((VerifyContract.View) fragment, new VerifyModel()); IDCardSDK.getInstance().initSDK(getHandler(), this);
}
关于IdCardBean
public class IdCardBean { private String name; private String gender; private String people;//民族;
private String from;//
private String address; private String idNumber; private String department; private String endDate; private String birthDay;//生日
app项目中用 Eventbus 得到 身份证读卡信息。
@Subscribe
public void onEventMainThread(ReadCardEvent readCardEvent) {
isStartMatch = true;
startMatchTime = System.currentTimeMillis();
Log.i(TAG, "检测成功,并且读取到身份证信息");
HSIDCardInfo cardInfo = readCardEvent.getCardInfo();
idCardBean = IdCardConvertUtils.converToIdCardBean(cardInfo);
mPresenter.getRealItemBeanByIdCard(idCardBean);
Log.i("lixiaodaoaaa", "file path is " + FileConstant.ID_CARD_HEAD_FILE_PATH);
Bitmap bitmapFromPath = FileUtils.getBitmapFromPath(FileConstant.ID_CARD_HEAD_FILE_PATH);
ivPeopleHead.setImageBitmap(bitmapFromPath);
}
关于 IdCardConvertUtils
这个是类型转化类,实现类的转化 读取身份证信息。
/*
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
Author : lixiaodaoaaa
Date : 2019-08-11
Time : 17:13
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
*/public class IdCardConvertUtils {
public static IdCardBean converToIdCardBean(HSIDCardInfo cardInfo) {
IdCardBean idCardBean = new IdCardBean(); if (null != cardInfo) { String name = cardInfo.getPeopleName(); String gender = cardInfo.getSex(); String people = cardInfo.getPeople(); String birthDay = DateFormatterUtils.toBirthDay(cardInfo.getBirthDay()); String address = cardInfo.getAddr(); String cardNumber = cardInfo.getIDCard(); String department = cardInfo.getDepartment(); String endDate = cardInfo.getEndDate();
idCardBean.setName(name);
idCardBean.setGender(gender);
idCardBean.setPeople(people);
idCardBean.setBirthDay(birthDay);
idCardBean.setAddress(address);
idCardBean.setIdNumber(cardNumber);
idCardBean.setDepartment(department);
idCardBean.setEndDate(endDate); return idCardBean;
} return null;
}
}
demo中概述
实现实时图像(人脸图像)
读取身份证信息。
Demo下载:联系v : lixiaodaoaaa
2017-03-01 · 诚信经营,以人为本,客户致上!
2019-06-05