引入库
···
/**
* 用于检测人脸存在不存在
*/
implementation("com.google.mlkit:face-detection:16.0.5")
···
人脸与照片实时比对
class FaceAnalyzer: ImageAnalysis.Analyzer {
private var faceDetector = FaceDetection.getClient()
private var faceListener: FaceDetectorListener? = null
@SuppressLint("UnsafeOptInUsageError")
override fun analyze(imageproxy: ImageProxy) {
// 将 ImageProxy 转换为 InputImage
val mediaImage = imageproxy.image
if (mediaImage != null) {
val inputImage = InputImage.fromMediaImage(mediaImage, imageproxy.imageInfo.rotationDegrees)
Log.d("FaceAnalyzer", "inputImage:${inputImage.width}")
// 使用 ML Kit 进行人脸检测
faceDetector.process(inputImage)
.addOnSuccessListener { faces ->
// 成功检测到人脸
if (faces.isNotEmpty()) {
Log.d("FaceAnalyzer", "检测到人脸!")
faceListener?.faceListenerSuccess(imageproxy)
} else {
Log.d("FaceAnalyzer", "没有检测到人脸。")
faceListener?.faceListenerFail("没有检测到人脸")
}
}
.addOnFailureListener { e ->
Log.e("FaceAnalyzer", "人脸检测失败", e)
faceListener?.faceListenerFail(e.message)
}
.addOnCompleteListener {
faceListener?.faceListenerComplete()
// 释放 ImageProxy,防止内存泄漏
imageproxy.close()
}
} else {
imageproxy.close()
}
}
fun setFaceDetectorListener(listener: FaceDetectorListener){
faceListener = listener
}
fun closeFaceDetector() {
faceDetector.close()
}
fun createFaceDetector() {
faceDetector = FaceDetection.getClient()
}
// 监听人脸信息回调
interface FaceDetectorListener {
fun faceListenerSuccess(imageProxy: ImageProxy)
fun faceListenerFail(errMessage: String?)
fun faceListenerComplete()
}
}
利用照片截取每一帧
// 截取每一帧
private var imageAnalysis: ImageAnalysis? = null
// 人脸分析
private val faceAnalyzer: FaceAnalyzer by lazy { FaceAnalyzer() }
// 是否存在人脸信息
private var hasFace = false
private var faceBitmap: Bitmap? = null
创建分析器
// 创建 ImageAnalysis 用于分析每一帧
imageAnalysis = ImageAnalysis.Builder()
.setTargetRotation(ROTATION_90)
.setTargetResolution(Size(1280,720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) // 只保留最新的帧,丢弃旧的帧。
.setImageQueueDepth(10) // 设置图像队列的深度(缓冲区大小)
.build()
imageAnalysis?.setAnalyzer(ContextCompat.getMainExecutor(this), faceAnalyzer)
处理监听回调
···
faceAnalyzer.setFaceDetectorListener(faceListener)
/**
* 人脸检测回调
*/
private val faceListener: FaceAnalyzer.FaceDetectorListener = object : FaceAnalyzer.FaceDetectorListener{
override fun faceListenerSuccess(imageProxy: ImageProxy) {
Log.e(TAG, "faceListenerFail: 人脸检测成功============>" )
runOnUiThread {
faceBitmap = bitmap
hasFace = true
}
}
override fun faceListenerFail(errMessage: String?) {
Log.e(TAG, "faceListenerFail: 人脸检测失败============>$errMessage" )
faceBitmap = null
hasFace = false
}
override fun faceListenerComplete() {
Log.e(TAG, "faceListenerFail: 人脸检测完成============>" )
}
}
···
这是在使用外接摄像头实现人脸签到的时候用到的一点逻辑,也希望能帮助需要的你