如何绘制一个矩形到脸的位置?
How to draw a Rectangle to position of face?
我正在制作一个人脸检测应用程序,通过相机预览中的每一帧,我都能得到该帧上的所有面孔。它运作良好,我得到了所有面孔以及每张面孔的地标位置。
现在,我在每一帧收到的位置上绘制一个矩形。我有问题,我的矩形与面不匹配
这是截图:
我认为我收到的位置是图像,而不是屏幕上的。
这是我获得位置的代码:
.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()
}
这是函数代码 drawLandmarkRect
, drawLandmarkPosition
:
fun drawLandmarkRect(face: FirebaseVisionFace){
activity.graphicOverlay.rect.add(face.boundingBox)
}
fun drawLandmarkPosition(face: FirebaseVisionFace, idLandmark: Int){
val pos = face.getLandmark(idLandmark)?.position
pos?.let{
activity.graphicOverlay.pX.add(it.x)
activity.graphicOverlay.pY.add(it.y)
}
}
这是我画的代码:
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()
}
}
我该怎么办?
可以用Canvas在脸上画矩形
检查 ,它可能适合你。
已爱:
问题是创建新实例 ImageReader 时我用数字划分宽度、高度:
imageReader = ImageReader.newInstance(camOutputSizeWidth/quality, camOutputSizeHeight/quality, ImageFormat.YUV_420_888, 1)
我正在制作一个人脸检测应用程序,通过相机预览中的每一帧,我都能得到该帧上的所有面孔。它运作良好,我得到了所有面孔以及每张面孔的地标位置。
现在,我在每一帧收到的位置上绘制一个矩形。我有问题,我的矩形与面不匹配
这是截图:
我认为我收到的位置是图像,而不是屏幕上的。
这是我获得位置的代码:
.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()
}
这是函数代码 drawLandmarkRect
, drawLandmarkPosition
:
fun drawLandmarkRect(face: FirebaseVisionFace){
activity.graphicOverlay.rect.add(face.boundingBox)
}
fun drawLandmarkPosition(face: FirebaseVisionFace, idLandmark: Int){
val pos = face.getLandmark(idLandmark)?.position
pos?.let{
activity.graphicOverlay.pX.add(it.x)
activity.graphicOverlay.pY.add(it.y)
}
}
这是我画的代码:
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()
}
}
我该怎么办?
可以用Canvas在脸上画矩形
检查
已爱:
问题是创建新实例 ImageReader 时我用数字划分宽度、高度:
imageReader = ImageReader.newInstance(camOutputSizeWidth/quality, camOutputSizeHeight/quality, ImageFormat.YUV_420_888, 1)