Android 如何绘制一个矩形到面的位置?

Android 如何绘制一个矩形到面的位置?,android,android-camera,face-detection,Android,Android Camera,Face Detection,我正在制作一个人脸检测应用程序,在相机预览的每一帧中,我都会得到该帧上的所有人脸。它工作得很好,我得到了所有的脸,每个脸都有地标的位置 现在,我在每一帧上所接收到的位置上画一个矩形。我有一个问题,我的矩形与面不匹配 以下是一个屏幕截图: 我想我收到的位置是图像,而不是屏幕上 这是我得到的职位代码: .addOnSuccessListener { val faceId = ArrayList<Int>()

我正在制作一个人脸检测应用程序,在相机预览的每一帧中,我都会得到该帧上的所有人脸。它工作得很好,我得到了所有的脸,每个脸都有地标的位置

现在,我在每一帧上所接收到的位置上画一个矩形。我有一个问题,我的矩形与面不匹配

以下是一个屏幕截图:

我想我收到的位置是图像,而不是屏幕上

这是我得到的职位代码:

.addOnSuccessListener {
                    val faceId = ArrayList<Int>()
                    //get all face
                    for (i in it) {

                        // landmark (mouth, ears, eyes, cheeks, and nose available)
                        drawLandmarkRect(i)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.BOTTOM_MOUTH)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.LEFT_EAR)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.RIGHT_EAR)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.NOSE_BASE)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.LEFT_MOUTH)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.RIGHT_MOUTH)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.LEFT_CHEEK)
                        drawLandmarkPosition(i, FirebaseVisionFaceLandmark.RIGHT_CHEEK)

                    }
                    activity.graphicOverlay.drawAgain()
                    activity.checkMlCallback = 1
                    imageYUV.close()
                }
这是我画的代码:

class GraphicOverlay(context: Context=): View(context) {

private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
var pX = ArrayList<Float>()
var pY = ArrayList<Float>()
var rect = ArrayList<Rect>()

override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    drawCircle(canvas); 
    drawRect(canvas)
    }
}

fun drawCircle(canvas: Canvas){
    for (item in 0 until pX.size){
        canvas.drawCircle(pX[item], pY[item], 5f, paint)
    }
}

fun drawRect(canvas: Canvas){
    paint.apply {
        strokeWidth = 3f
        style = Paint.Style.STROKE
        color = Color.parseColor("#fdc51162")
    }
    for (item in rect){
        canvas.drawRect(item, paint)
    }
}

fun drawAgain(){
    postInvalidate()
  }
}
类GraphicOverlay(上下文:上下文=):视图(上下文){
私有val paint=paint(paint.ANTI_别名_标志)
var pX=ArrayList()
var pY=ArrayList()
var rect=ArrayList()
覆盖onDraw(画布:画布){
super.onDraw(画布)
画圈(帆布);
drawRect(画布)
}
}
趣味画圈(画布:画布){
用于(0中的项目直到像素大小){
画布.画圈(pX[项目]、pY[项目]、5f、油漆)
}
}
趣味drawRect(画布:画布){
涂{
冲程宽度=3f
style=Paint.style.STROKE
color=color.parseColor(#fdc51162“)
}
for(矩形中的项目){
canvas.drawRect(项目、油漆)
}
}
又来了{
后验证日期()
}
}

我该怎么做?

您可以使用画布在面上绘制矩形 检查,它可能适合您。

已解决:

问题是,在创建newInstance ImageReader时,i分区宽度、高度和数字为:

imageReader = ImageReader.newInstance(camOutputSizeWidth/quality, camOutputSizeHeight/quality, ImageFormat.YUV_420_888, 1)
imageReader = ImageReader.newInstance(camOutputSizeWidth/quality, camOutputSizeHeight/quality, ImageFormat.YUV_420_888, 1)