人臉實時比對與身份證比對判斷是否是壹個人的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);
}
關於IdCardBeanpublic 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