|
|
@@ -25,6 +25,7 @@ import com.grkj.iscs_mars.util.log.LogUtil
|
|
|
import com.grkj.iscs_mars.view.activity.test.face.arcsoft.CameraHelper
|
|
|
import com.grkj.iscs_mars.view.activity.test.face.arcsoft.CameraListener
|
|
|
import com.grkj.iscs_mars.view.activity.test.face.arcsoft.NV21ToBitmap
|
|
|
+import com.grkj.iscs_mars.view.widget.FaceOverlayView
|
|
|
|
|
|
object ArcSoftUtil {
|
|
|
private var cameraHelper: CameraHelper? = null
|
|
|
@@ -79,10 +80,10 @@ object ArcSoftUtil {
|
|
|
afCode = faceEngine!!.init(
|
|
|
context,
|
|
|
DetectMode.ASF_DETECT_MODE_VIDEO,
|
|
|
- DetectFaceOrientPriority.valueOf("ASF_OP_0_ONLY"),
|
|
|
+ DetectFaceOrientPriority.ASF_OP_0_ONLY,
|
|
|
16,
|
|
|
1,
|
|
|
- FaceEngine.ASF_FACE_DETECT or FaceEngine.ASF_AGE or FaceEngine.ASF_FACE3DANGLE or FaceEngine.ASF_GENDER or FaceEngine.ASF_LIVENESS
|
|
|
+ FaceEngine.ASF_FACE_DETECT or FaceEngine.ASF_AGE or FaceEngine.ASF_FACE3DANGLE or FaceEngine.ASF_GENDER or FaceEngine.ASF_LIVENESS or FaceEngine.ASF_FACE_RECOGNITION
|
|
|
)
|
|
|
LogUtil.i("initEngine: init: $afCode")
|
|
|
if (afCode != ErrorInfo.MOK) {
|
|
|
@@ -97,11 +98,11 @@ object ArcSoftUtil {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @JvmOverloads
|
|
|
fun initCamera(
|
|
|
context: Context,
|
|
|
windowManager: WindowManager,
|
|
|
preview: View,
|
|
|
+ faceOverlayView: FaceOverlayView?,
|
|
|
needCheckCenter: Boolean = false,
|
|
|
callBack: (Bitmap?, Int, Boolean) -> Unit
|
|
|
) {
|
|
|
@@ -117,6 +118,7 @@ object ArcSoftUtil {
|
|
|
) {
|
|
|
LogUtil.i("onCameraOpened: $cameraId $displayOrientation $isMirror")
|
|
|
previewSize = camera.parameters.previewSize
|
|
|
+ faceOverlayView?.setCameraPreviewSize(previewSize!!.width, previewSize!!.height)
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -129,52 +131,53 @@ object ArcSoftUtil {
|
|
|
FaceEngine.CP_PAF_NV21,
|
|
|
faceInfoList
|
|
|
)
|
|
|
- if (code == ErrorInfo.MOK && faceInfoList.isNotEmpty()) {
|
|
|
- code = faceEngine!!.process(
|
|
|
- nv21,
|
|
|
+ faceOverlayView?.setFaceRect(faceInfoList.map { it.rect })
|
|
|
+ if (!needCheckCenter || (faceInfoList[0].rect.isInCenterArea(
|
|
|
previewSize!!.width,
|
|
|
- previewSize!!.height,
|
|
|
- FaceEngine.CP_PAF_NV21,
|
|
|
- faceInfoList,
|
|
|
- processMask
|
|
|
- )
|
|
|
- if (code != ErrorInfo.MOK) {
|
|
|
+ previewSize!!.height
|
|
|
+ ))
|
|
|
+ ) {
|
|
|
+ if (code == ErrorInfo.MOK && faceInfoList.isNotEmpty()) {
|
|
|
+ code = faceEngine!!.process(
|
|
|
+ nv21,
|
|
|
+ previewSize!!.width,
|
|
|
+ previewSize!!.height,
|
|
|
+ FaceEngine.CP_PAF_NV21,
|
|
|
+ faceInfoList,
|
|
|
+ processMask
|
|
|
+ )
|
|
|
+ if (code != ErrorInfo.MOK) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else {
|
|
|
return
|
|
|
}
|
|
|
- } else {
|
|
|
- return
|
|
|
- }
|
|
|
|
|
|
- val ageInfoList: List<AgeInfo> = ArrayList()
|
|
|
- val genderInfoList: List<GenderInfo> = ArrayList()
|
|
|
- val face3DAngleList: List<Face3DAngle> = ArrayList()
|
|
|
- val faceLivenessInfoList: List<LivenessInfo> = ArrayList()
|
|
|
- val ageCode = faceEngine!!.getAge(ageInfoList)
|
|
|
- val genderCode = faceEngine!!.getGender(genderInfoList)
|
|
|
- val face3DAngleCode = faceEngine!!.getFace3DAngle(face3DAngleList)
|
|
|
- val livenessCode = faceEngine!!.getLiveness(faceLivenessInfoList)
|
|
|
-
|
|
|
- // 有其中一个的错误码不为ErrorInfo.MOK,return
|
|
|
- if ((ageCode or genderCode or face3DAngleCode or livenessCode) != ErrorInfo.MOK) {
|
|
|
- LogUtil.d("人脸检测结果:年龄、性别、角度、获取验证失败")
|
|
|
- return
|
|
|
- }
|
|
|
+ val ageInfoList: List<AgeInfo> = ArrayList()
|
|
|
+ val genderInfoList: List<GenderInfo> = ArrayList()
|
|
|
+ val face3DAngleList: List<Face3DAngle> = ArrayList()
|
|
|
+ val faceLivenessInfoList: List<LivenessInfo> = ArrayList()
|
|
|
+ val ageCode = faceEngine!!.getAge(ageInfoList)
|
|
|
+ val genderCode = faceEngine!!.getGender(genderInfoList)
|
|
|
+ val face3DAngleCode = faceEngine!!.getFace3DAngle(face3DAngleList)
|
|
|
+ val livenessCode = faceEngine!!.getLiveness(faceLivenessInfoList)
|
|
|
+
|
|
|
+ // 有其中一个的错误码不为ErrorInfo.MOK,return
|
|
|
+ if ((ageCode or genderCode or face3DAngleCode or livenessCode) != ErrorInfo.MOK) {
|
|
|
+ LogUtil.d("人脸检测结果:年龄、性别、角度、获取验证失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- // 自己加的,必须有活体检测
|
|
|
- if (faceLivenessInfoList.none { it.liveness == LivenessInfo.ALIVE }) {
|
|
|
- callBack(null, faceInfoList.size, false)
|
|
|
- return
|
|
|
- }
|
|
|
- val bitmap = NV21ToBitmap(context).nv21ToBitmap(
|
|
|
- nv21,
|
|
|
- previewSize!!.width,
|
|
|
- previewSize!!.height
|
|
|
- )
|
|
|
- if (!needCheckCenter || (faceInfoList[0].rect.isInCenterArea(
|
|
|
+ // 自己加的,必须有活体检测
|
|
|
+ if (faceLivenessInfoList.none { it.liveness == LivenessInfo.ALIVE }) {
|
|
|
+ callBack(null, faceInfoList.size, false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ val bitmap = NV21ToBitmap(context).nv21ToBitmap(
|
|
|
+ nv21,
|
|
|
previewSize!!.width,
|
|
|
previewSize!!.height
|
|
|
- ))
|
|
|
- ) {
|
|
|
+ )
|
|
|
LogUtil.d("人脸检测结果-识别结果 : ${bitmap == null} - $faceInfoList")
|
|
|
callBack(bitmap, faceInfoList.size, true)
|
|
|
}
|
|
|
@@ -211,7 +214,7 @@ object ArcSoftUtil {
|
|
|
callBack: (Bitmap?, Int, Boolean) -> Unit
|
|
|
) {
|
|
|
initEngine(context)
|
|
|
- initCamera(context, windowManager, preview, false, callBack)
|
|
|
+ initCamera(context, windowManager, preview, null, false, callBack)
|
|
|
}
|
|
|
|
|
|
fun stop() {
|