You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用LifecycleCameraController时ML Kit Analyzer在横屏模式下返回错误的boundingBox坐标

使用LifecycleCameraController时ML Kit Analyzer在横屏模式下返回错误的boundingBox坐标

我最近在做一个用LifecycleCameraController搭配ML Kit Analyzer实现的简易条码扫描器,本来想在预览画面上直接给检测到的条码画个 bounding 矩形,而且已经设置了COORDINATE_SYSTEM_VIEW_REFERENCED坐标系统,但遇到个头疼的问题——横屏模式下,ML Kit 返回的boundingBox坐标完全不对,画出来的框根本不在条码位置上。

折腾了好一阵子,总结了几个可能的解决方向,你可以试试:

  • 先检查横竖屏配置与控制器的生命周期:确保你的Activity/Fragment配置了正确的android:configChanges(比如orientation|screenSize),或者在横竖屏切换时重新初始化LifecycleCameraController。有时候配置变化后控制器没有更新,会用旧的屏幕参数计算坐标。
  • 手动补偿设备旋转角度:虽然用了VIEW_REFERENCED坐标系统,但ML Kit的坐标转换有时候不会自动处理横屏的旋转偏移。你可以通过设备的旋转角度来校正boundingBox:
    // 获取当前设备的旋转角度
    val display = requireContext().display
    val rotation = display?.rotation ?: Surface.ROTATION_0
    
    // 根据旋转方向校正矩形坐标(假设originalRect是ML Kit返回的boundingBox)
    val previewView = findViewById<PreviewView>(R.id.preview_view)
    val correctedRect = when(rotation) {
        Surface.ROTATION_90 -> RectF(
            originalRect.top,
            previewView.width - originalRect.right,
            originalRect.bottom,
            previewView.width - originalRect.left
        )
        Surface.ROTATION_180 -> RectF(
            previewView.width - originalRect.right,
            previewView.height - originalRect.bottom,
            previewView.width - originalRect.left,
            previewView.height - originalRect.top
        )
        Surface.ROTATION_270 -> RectF(
            previewView.height - originalRect.bottom,
            originalRect.left,
            previewView.height - originalRect.top,
            originalRect.right
        )
        else -> originalRect
    }
    
  • 考虑预览View的缩放偏移:如果你的PreviewView用了ScaleType.FIT_CENTER这类缩放模式,实际显示的画面和相机输出的帧存在缩放比例差,这时候需要把boundingBox的坐标按缩放比例换算到View的坐标系上。可以通过PreviewView.getScaleMatrix()获取缩放矩阵,再对矩形进行变换。
  • 确认Analyzer的配置时机:确保是在LifecycleCameraController绑定生命周期之后再设置Analyzer,并且在横竖屏切换时重新设置,避免旧的Analyzer实例使用了错误的屏幕参数。

如果这些方法都试过还是有问题,建议你打印一下横竖屏时屏幕的宽高、ML Kit返回的boundingBox原始值,对比一下就能更快定位到坐标偏移的具体原因了。

备注:内容来源于stack exchange,提问作者Michael Wolz

火山引擎 最新活动