Kotlin 利用Google的face-detection实现人脸比对

引入库

···
/**
* 用于检测人脸存在不存在
*/
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: 人脸检测完成============>" )
    }

}

···
这是在使用外接摄像头实现人脸签到的时候用到的一点逻辑,也希望能帮助需要的你

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容