【问题标题】:Translate Firebase MLKit Bounding box coordinates to screen view coordinates将 Firebase MLKit 边界框坐标转换为屏幕视图坐标
【发布时间】:2020-02-27 03:46:10
【问题描述】:
我正在使用FirebaseVision 对象检测从CameraX 相机预览中检测事物。它正在检测找到的东西,但我正在尝试绘制通过相机预览检测到的项目的边界框。这样做时,firebase 返回的边界框不是图像本身,也不是它们出现在错误位置的预览视图。
我从 firebase 得到的图片尺寸是1200x1600,预览尺寸是2425x1440
如何将从 firebase 返回的边界框转换为正确的屏幕坐标?
【问题讨论】:
标签:
android
firebase-mlkit
android-camerax
【解决方案1】:
我最终做的是获取相机拍摄的图像大小,将宽度/高度除以视图宽度/高度以获得比例大小
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())
)
然后为您提供缩放的矩形坐标,然后您将其绘制在屏幕上
【解决方案3】:
谢谢@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