使用 Camera X 和 ML Kit 实现本博客中表达的人脸检测,并使用自定义叠加层。 只有当面部位于边界框中时,才会启用快门按钮。
Expected result video and Starter source code with CameraX included
在 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/