前幾天虹軟推出了 Android ArcFace 2.2版本的SDK,相比於2.1版本,2.2版本中的變化以下:bash
在連續的視頻幀中,當一我的臉進入視頻畫面直到離開,其faceId不變。ide
在門禁應用場景下,若一我的長時間停留在畫面中,藉助faceId的功能,在此人的人臉特徵提取成功後,可再也不對此人的後續人臉信息進行處理。ui
faceId在VIDEO模式下有意義;
faceId在IMAGE模式下無效。spa
支持的顏色格式以下:
Windows: GRAY、DEPTH_U1六、NV2一、NV十二、I420
Android: GRAY、DEPTH_U1六、NV21
注:若圖像數據的顏色格式不在上述列表中,必須對圖像數據進行格式轉換。線程
單目攝像頭檢測流程code
注意:在Windows平臺下,若經過OpenCV獲取IR攝像頭的圖像數據,因爲其顏色格式爲BGR_24
,不能用於IR活體檢測,須要轉成GRAY
(或IR活體檢測接口支持的其餘顏色格式),但BGR_24
數據可直接用於人臉檢測。orm
雙目攝像頭檢測流程cdn
人臉檢測結果信息調整 :若RGB攝像頭和IR攝像頭的成像不一致(存在偏移、旋轉、鏡像等問題),須要將傳遞給IR活體檢測的人臉信息(人臉框、人臉角度)進行調整。視頻
在雙目的畫面有明顯的不一致的狀況時,若咱們直接把RGB攝像頭的人臉檢測結果用於IR活體檢測,頗有可能會報81925(人臉置信度低)錯誤。原來,攝像頭回傳的數據和咱們直接看到的畫面極可能是不同的,咱們看到的畫面多是通過處理的(縮放、旋轉、鏡像等)。blog
nv21 -> YuvImage -> jpg bytes -> bitmap -> ImageView複製代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Override
public void onPreview(final byte[] nv21, Camera camera) {
......
//30幀一次,把幀數據顯示到界面上(要是每幀都作就太卡了),若仍是影響UI請放到子線程處理
if (index++ % 30 == 0) {
YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, previewSize.width, previewSize.height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);
byte[] bytes = baos.toByteArray();
ivFrame.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
}
......
}
|
1. RGB和IR攝像頭圖像數據的其中一個被左右鏡像
對於這種狀況,咱們在將RGB數據的人臉檢測結果用於IR活體檢測時,須要將其人臉框(rect)進行左右鏡像調整。(Android demo中已提供左右鏡像的代碼):
複製代碼
/**
* 人臉框水平鏡像
*
* @param rect 人臉框
* @return 水平鏡像後的人臉框
*/
private Rect mirrorRectHorizontal(Rect rect) {
Rect newRect = new Rect(rect);
newRect.right = previewSize.width - rect.left;
newRect.left = previewSize.width - rect.right;
return newRect;
}複製代碼
2. RGB和IR攝像頭圖像數據均被鏡像或均未被鏡像
對於這種狀況,RGB數據的人臉檢測結果用於IR活體檢測時,不須要進行鏡像調整。
3. RGB和IR攝像頭圖像數據有旋轉關係
如有旋轉關係,咱們不只要旋轉人臉信息(FaceInfo)中的人臉框(rect),還須要修改人臉角度(orient)。不然IR活體檢測將沒法解析人臉,報81925錯誤。
(Android demo中已提供將orient單次旋轉90度的代碼):
/**
* 獲取逆時針旋轉90度後的人臉角度
*
* @param orient 人臉角度信息,即{@link FaceInfo#orient}屬性,由{@link FaceEngine#detectFaces(byte[], int, int, int, List)}接口獲取
* @return 旋轉後的人臉角度
*/
private int rotateOrient(int orient) {
switch (orient) {
case FaceEngine.ASF_OC_0:
return FaceEngine.ASF_OC_90;
case FaceEngine.ASF_OC_90:
return FaceEngine.ASF_OC_180;
case FaceEngine.ASF_OC_180:
return FaceEngine.ASF_OC_270;
case FaceEngine.ASF_OC_270:
return FaceEngine.ASF_OC_0;
default:
throw new IllegalArgumentException("unsupported orient '" + orient + "'");
}
}複製代碼
若須要下載虹軟sdk,能夠到官網:
https://ai.arcsoft.com.cn/ucenter/user/reg?utm_source=juejin&utm_medium=referral