将 Firebase MLKit 边界框坐标转换为屏幕视图坐标

Translate Firebase MLKit Bounding box coordinates to screen view coordinates

我正在使用 FirebaseVision 对象检测从 CameraX 相机预览中检测事物。它正在检测找到的东西,但我正在尝试绘制通过相机预览检测到的项目的边界框。这样做时,firebase 返回的边界框不是针对图像本身的,不是预览视图,因为它们出现在错误的位置。

我从 firebase 取回的图像大小是 1200x1600,预览大小是 2425x1440

如何将从 firebase 返回的边界框转换为正确的屏幕坐标?

我最后做的是拍摄相机拍摄的图像尺寸,将 width/height 除以视图 width/height 得到比例尺寸

if(isPortraitMode()){
    _scaleY = overlayView.height.toFloat() / imageWidth.toFloat()
    _scaleX = overlayView.width.toFloat() / imageHeight.toFloat()
}else{
    _scaleY = overlayView.height.toFloat() / imageHeight.toFloat()
    _scaleX = overlayView.width.toFloat() / imageWidth.toFloat()
}

现在我有了比例尺,然后我可以通过 firebase 检测器获取边界框 return 并通过比例尺转换 x 和 y 坐标

private fun translateX(x: Float): Float = x * _scaleX
private fun translateY(y: Float): Float = y * _scaleY

private fun translateRect(rect: Rect) = RectF(
    translateX(rect.left.toFloat()),
    translateY(rect.top.toFloat()),
    translateX(rect.right.toFloat()),
    translateY(rect.bottom.toFloat())
)

然后为您提供缩放后的矩形坐标,然后您可以在屏幕上绘制该坐标

请参阅我在 CameraX qrcode scanner detect wrong. Basically you can use CoordinateTransform 中的回答,将坐标从一个 CameraX UseCase 转换为另一个。

感谢@tyczj,

你的回答帮助我找到了我的解决方案,让我补充一下如果有人像我一样使用前置摄像头进行人脸检测你需要反转 x 轴,例如:

val previewSize = overlayView.width.toFloat()
val newLeft = if (isFrontCamera) previewSize - (rect.right * scaleX) else rect.left * scaleX
val newRight = if (isFrontCamera) previewSize - (rect.left * scaleX) else rect.right * scaleX