Android中ML Kit人脸检测边界框缩放匹配相机预览问题排查
问题:ML Kit人脸检测边界框缩放计算错误排查
问题概述
我在Android应用中使用ML Kit人脸检测结合Camera 2库开发,目前功能可正常运行,能获取相机预览中的人脸边界框,但对比ML Kit官方示例应用,发现边界框的缩放计算存在问题——预览里的边界框无法完整覆盖面部(比如双耳、下巴区域),仅能随人脸左右移动。
缩放计算核心代码
private fun drawAdjustedFaceBoundBox(canvas: Canvas) { val myPaint = Paint() myPaint.color = Color.rgb(220, 249, 10) myPaint.strokeWidth = 5f myPaint.style = Paint.Style.STROKE if (analyzedImageSize.width != 0 && analyzedImageSize.height != 0) { val horizontalScaleFactor = previewScreenSize.width / analyzedImageSize.width.toFloat() val verticalScaleFactor = previewScreenSize.height / analyzedImageSize.height.toFloat() val adjustedBoundRect = RectF() adjustedBoundRect.top = (objectBound.top * verticalScaleFactor) + surfaceTop.toFloat() adjustedBoundRect.left = objectBound.left * horizontalScaleFactor adjustedBoundRect.right = objectBound.right * horizontalScaleFactor adjustedBoundRect.bottom = (objectBound.bottom * verticalScaleFactor) + surfaceTop.toFloat() val adjustedMirrorObjectBound = RectF(adjustedBoundRect) if (mirrorCoordinates) { val originalRight = adjustedBoundRect.right val originalLeft = adjustedBoundRect.left // 前置摄像头需镜像坐标 adjustedMirrorObjectBound.left = (previewScreenSize.width - originalRight) adjustedMirrorObjectBound.right = (previewScreenSize.width - originalLeft) } canvas.drawRect(adjustedMirrorObjectBound, myPaint) } }
实现逻辑说明
- ML Kit分析的图像尺寸为480640,相机预览窗口尺寸为10802131,使用前置摄像头
- 分别计算X轴(horizontalScaleFactor)和Y轴(verticalScaleFactor)的缩放因子,将原始边界框的坐标值与对应因子相乘
surfaceTop.toFloat()代表屏幕顶部到相机预览视图的距离,当前值为0- 针对前置摄像头场景,在缩放计算完成后对坐标进行镜像处理
效果对比
- 我的应用预览边界框:

- ML Kit示例应用边界框:

- 应用实际运行效果:

相关代码仓库
- 我的代码仓库(请查看dev分支)
- ML Kit官方示例仓库的人脸检测实现
内容的提问来源于stack exchange,提问作者Chathuranga Shan Jayarathna
相关产品推荐
相关产品推荐

