我正在使用FirebaseVision对象检测来从CameraX相机预览中检测事物。它正在检测发现的东西,但是我试图在摄像机预览上绘制检测到的项目的边界框。这样,firebase所返回的边界框并不是针对图像本身,而不是预览 View ,因为它们显示在错误的位置。

我从firebase获得的图像大小是1200x1600,预览大小是2425x1440
如何将Firebase返回的边界框转换为正确的屏幕坐标?

最佳答案

我最后要做的是我拍摄了相机拍摄的图像大小,将宽度/高度除以 View 的宽度/高度以得到比例尺大小

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检测器带回边界框,并按比例尺转换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())
)

然后会给您缩放后的rect坐标,然后在屏幕上绘制

08-18 05:13