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

tyc*_*czj 10 android firebase-mlkit android-camerax

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

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

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

tyc*_*czj 6

我最终做的是将相机拍摄的图像尺寸,将宽度/高度除以视图宽度/高度以获得比例尺寸

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()
}
Run Code Online (Sandbox Code Playgroud)

现在我有了比例尺,然后我可以通过 firebase 检测器返回边界框并按比例尺平移 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())
)
Run Code Online (Sandbox Code Playgroud)

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