|
|
@@ -24,9 +24,12 @@ import com.arcsoft.face.enums.DetectFaceOrientPriority
|
|
|
import com.arcsoft.face.enums.DetectMode
|
|
|
import com.arcsoft.face.enums.ExtractType
|
|
|
import com.grkj.shared.config.Constants
|
|
|
+import com.grkj.shared.utils.extension.expandToPadCenter
|
|
|
+import com.grkj.shared.utils.extension.isInCenterArea
|
|
|
import com.grkj.shared.utils.face.arcsoft.CameraHelper
|
|
|
import com.grkj.shared.utils.face.arcsoft.CameraListener
|
|
|
import com.grkj.shared.utils.face.arcsoft.NV21ToBitmap
|
|
|
+import com.sik.sikimage.CropImageUtils
|
|
|
import org.slf4j.Logger
|
|
|
import org.slf4j.LoggerFactory
|
|
|
|
|
|
@@ -48,6 +51,7 @@ object ArcSoftUtil {
|
|
|
private const val ACTION_REQUEST_PERMISSIONS: Int = 0x001
|
|
|
var isActivated = false
|
|
|
private var isInit = false
|
|
|
+ var inDetecting = false
|
|
|
|
|
|
/**
|
|
|
* 所需的所有权限信息
|
|
|
@@ -93,7 +97,7 @@ object ArcSoftUtil {
|
|
|
faceEngine = FaceEngine()
|
|
|
afCode = faceEngine!!.init(
|
|
|
context,
|
|
|
- DetectMode.ASF_DETECT_MODE_IMAGE,
|
|
|
+ DetectMode.ASF_DETECT_MODE_VIDEO,
|
|
|
DetectFaceOrientPriority.ASF_OP_0_ONLY,
|
|
|
1,
|
|
|
FaceEngine.ASF_FACE_DETECT or FaceEngine.ASF_AGE or FaceEngine.ASF_MASK_DETECT or FaceEngine.ASF_GENDER or FaceEngine.ASF_LIVENESS or FaceEngine.ASF_FACE_RECOGNITION
|
|
|
@@ -112,10 +116,12 @@ object ArcSoftUtil {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @JvmOverloads
|
|
|
fun initCamera(
|
|
|
context: Context,
|
|
|
windowManager: WindowManager,
|
|
|
preview: View,
|
|
|
+ needCheckCenter: Boolean = false,
|
|
|
callBack: (Bitmap?, Int, Boolean) -> Unit
|
|
|
) {
|
|
|
val metrics = DisplayMetrics()
|
|
|
@@ -134,6 +140,10 @@ object ArcSoftUtil {
|
|
|
|
|
|
|
|
|
override fun onPreview(nv21: ByteArray?, camera: Camera?) {
|
|
|
+ if (inDetecting) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ inDetecting = true
|
|
|
val faceInfoList: List<FaceInfo> = ArrayList()
|
|
|
var code = faceEngine!!.detectFaces(
|
|
|
nv21,
|
|
|
@@ -152,9 +162,11 @@ object ArcSoftUtil {
|
|
|
processMask
|
|
|
)
|
|
|
if (code != ErrorInfo.MOK) {
|
|
|
+ inDetecting = false
|
|
|
return
|
|
|
}
|
|
|
} else {
|
|
|
+ inDetecting = false
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -169,26 +181,37 @@ object ArcSoftUtil {
|
|
|
// 有其中一个的错误码不为ErrorInfo.MOK,return
|
|
|
if ((ageCode or genderCode or livenessCode) != ErrorInfo.MOK) {
|
|
|
logger.debug("人脸检测结果:年龄、性别、角度、获取验证失败")
|
|
|
+ inDetecting = false
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 自己加的,必须有活体检测
|
|
|
if (faceLivenessInfoList.none { it.liveness == LivenessInfo.ALIVE }) {
|
|
|
callBack(null, faceInfoList.size, false)
|
|
|
+ inDetecting = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (!needCheckCenter || (faceInfoList[0].rect.isInCenterArea(
|
|
|
+ previewSize!!.width,
|
|
|
+ previewSize!!.height
|
|
|
+ ))
|
|
|
+ ) {
|
|
|
+ val bitmap = NV21ToBitmap(context).nv21ToBitmap(
|
|
|
+ nv21,
|
|
|
+ previewSize!!.width,
|
|
|
+ previewSize!!.height
|
|
|
+ )
|
|
|
+ val faceRect = faceInfoList[0].rect.expandToPadCenter()
|
|
|
+ logger.debug("人脸检测结果-识别结果 : ${bitmap == null} - $faceInfoList")
|
|
|
+ callBack(bitmap, faceInfoList.size, true)
|
|
|
+ bitmap?.let {
|
|
|
+ val faceBitmap = CropImageUtils.cropBitmap(bitmap, faceRect)
|
|
|
+ callBack(faceBitmap, faceInfoList.size, true)
|
|
|
+ } ?: callBack(null, faceInfoList.size, true)
|
|
|
+ } else {
|
|
|
+ inDetecting = false
|
|
|
return
|
|
|
}
|
|
|
- val bitmap = NV21ToBitmap(context).nv21ToBitmap(
|
|
|
- nv21,
|
|
|
- previewSize!!.width,
|
|
|
- previewSize!!.height
|
|
|
- )
|
|
|
-// val faceRect = faceInfoList[0].rect
|
|
|
- logger.debug("人脸检测结果-识别结果 : ${bitmap == null} - $faceInfoList")
|
|
|
- callBack(bitmap, faceInfoList.size, true)
|
|
|
-// bitmap?.let {
|
|
|
-// val faceBitmap = CropImageUtils.cropBitmap(bitmap, faceRect)
|
|
|
-// callBack(faceBitmap, faceInfoList.size, true)
|
|
|
-// } ?: callBack(null, faceInfoList.size, true)
|
|
|
}
|
|
|
|
|
|
override fun onCameraClosed() {
|
|
|
@@ -222,7 +245,7 @@ object ArcSoftUtil {
|
|
|
callBack: (Bitmap?, Int, Boolean) -> Unit
|
|
|
) {
|
|
|
initEngine(context)
|
|
|
- initCamera(context, windowManager, preview, callBack)
|
|
|
+ initCamera(context, windowManager, preview, false, callBack)
|
|
|
}
|
|
|
|
|
|
fun stop() {
|