【问题标题】: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())
    )
    

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

    【讨论】:

    【解决方案2】:

    请在CameraX qrcode scanner detect wrong 中查看我的回答。基本上你可以使用CoordinateTransform 将坐标从一个CameraX UseCase 转换到另一个。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        相关资源
        最近更新 更多