android - 使用 Camera X 和 ML Kit 进行人脸检测和跟踪 - Android

标签 android kotlin face-detection android-camerax google-mlkit

使用 Camera X 和 ML Kit 实现本博客中表达的人脸检测,并使用自定义叠加层。 只有当面部位于边界框中时,才会启用快门按钮。

Expected result video and Starter source code with CameraX included

https://medium.com/onfido-tech/face-detection-and-tracking-on-android-using-ml-kit-part-1-fbee4200d174

enter image description here

在 Android 相机 X 代码实验室之后,我可以捕捉图像和视频。 尽管 ML Kit 边界框实现需要图形叠加层。

class OverlayPosition(var x: Float, var y: Float, var r: Float)

class OverlayView @JvmOverloads constructor(
    context: Context?,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    private val paint: Paint = Paint()
    private var holePaint: Paint = Paint()
    private var bitmap: Bitmap? = null
    private var layer: Canvas? = null
    private var border: Paint = Paint()

    //position of hole
    var holePosition: OverlayPosition = OverlayPosition(0.0f, 0.0f, 0.0f)
        set(value) {
            field = value
            //redraw
            this.invalidate()
        }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        if (bitmap == null) {
            configureBitmap()
        }


        //draw background
        layer?.drawRect(0.0f, 0.0f, width.toFloat(), height.toFloat(), paint)
        //draw hole
        layer?.drawCircle((width / 2).toFloat(), (height / 4).toFloat(), 400f, border)
        layer?.drawCircle((width / 2).toFloat(), (height / 4).toFloat(), 400f, holePaint)
        //draw bitmap
        canvas.drawBitmap(bitmap!!, 0.0f, 0.0f, paint);
    }

    private fun configureBitmap() {
        //create bitmap and layer
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        layer = Canvas(bitmap!!)
    }

    init {
        //configure background color
        val backgroundAlpha = 0.8
        paint.color = ColorUtils.setAlphaComponent(context?.let {
            ContextCompat.getColor(
                it,
                R.color.overlay
            )
        }!!, (255 * backgroundAlpha).toInt())

        border.color = Color.parseColor("#FFFFFF")
        border.strokeWidth = 30F
        border.style = Paint.Style.STROKE
        border.isAntiAlias = true
        border.isDither = true

        //configure hole color & mode
        holePaint.color = ContextCompat.getColor(context, android.R.color.transparent)

        holePaint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
    }
}

最佳答案

CameraX 团队提供了一个 GitHub code sample关于如何使用 ML Kit 检测对象并在 Preview 上绘制叠加层。请看一下,让我知道这是否适合您。 API 称为 MLKitAnalyzer .

关于android - 使用 Camera X 和 ML Kit 进行人脸检测和跟踪 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74372171/

相关文章:

android - 屏幕旋转时如何防止WebView自动刷新

java - org.apache.commons.collections.ArrayStack 已经添加到输出中。请删除重复的副本

android - RecyclerView - 在 notifiyItemInserted(0) 之后保持在 0 位置

android - Gradle - Windows 中缓存库的位置

java - 使用 openImaj API 库进行人脸对齐

iphone - iphone sdk的眨眼检测

Java/Android - 从 Firebase 将 ArrayList 作为对象加载时出错

java - 如何从房间数据库读取所有值并显示到recyclerview中?

java - 在 Kotlin 中定义 log TAG 常量的最佳方法是什么?

c++ - 从图像中检测和提取人脸