我正在使用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坐标,然后在屏幕上绘制