ML-Kit Android 姿态检测地标坐标匹配与预览

问题描述 投票:0回答:1

我正在尝试通过 Jetpack Compose 在 Android 应用程序上使用 ML-Kit 姿势检测的结果在地标上绘制点。

首先,我使用从分析器获得的纯坐标来绘制点(红点)。坐标代表图像的较小比例和屏幕左上角绘制的点。

我观察到处理后的图像 (

processImage
) 尺寸已缩放至 640x480。这是分析器代码。

class PoseAnalyzer(
    private val onSuccess: (result: AnalyzeResultData) -> Unit,
): ImageAnalysis.Analyzer {
    private val options = PoseDetectorOptions.Builder()
        .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
        .build()

    private val poseDetector = PoseDetection.getClient(options)

    @ExperimentalGetImage
    override fun analyze(imageProxy: ImageProxy) {
        val mediaImage = imageProxy.image
        if (mediaImage != null) {
            val rotationDegrees = imageProxy.imageInfo.rotationDegrees
            val processImage = InputImage.fromMediaImage(mediaImage, rotationDegrees)
            poseDetector.process(processImage)
                .addOnSuccessListener { pose ->
                    val result = AnalyzeResultData(pose, processImage.toSizeData())
                    onSuccess(result)
                }
                .addOnFailureListener {
                }
                .addOnCompleteListener {
                    imageProxy.close()
                }
        }
    }
}

然后我使用下面的代码根据预览尺寸(1080x2125)缩放坐标。

private fun scaleAndGetOffset(
        point: SizeData,
        analyzedImage: SizeData,
        screenSize: SizeData,
        cameraSelector: CameraSelector,
    ): Offset {
        val rateX = screenSize.x/analyzedImage.x
        val rateY = screenSize.y/analyzedImage.y
        return Offset(
            x = if (cameraSelector == CameraSelector.DEFAULT_BACK_CAMERA) point.x * rateX else screenSize.x-point.x * rateX,
            y = point.y * rateY
        )
}

点位置不正确。

如何获取或转换与预览相匹配的分析仪坐标?

android android-jetpack-compose coordinates google-mlkit pose-detection
1个回答
0
投票

在映射与前置摄像头一起使用的坐标时,我处理了类似的问题。以下是我的代码,您可以应用:

private fun coordinateMapping(
    points: List<PointF>,
    imageHeight: Int,
    scale: Float
): List<PointF> {
    return points.map { point ->
        PointF(
            (imageHeight - point.x) * scale,
            point.y * scale
        )
    }
}

imageWidth = 640,imageHeight = 480(ML Kit处理后的图像尺寸)。 x 坐标映射为 (imageHeight - point.x) *scale 而不是 (imageWidth - point.x) *scale,因为用于 ML Kit 处理的相机图像向右旋转 90 度。 对于每个点,您需要进一步调整映射

mappingX = x - (imageHeight * (2125/640) - screenWidth) / 2

,因为根据您屏幕的宽高比,预览图像的宽度侧已被稍微裁剪。 如果您需要更多信息请再次询问我

© www.soinside.com 2019 - 2024. All rights reserved.