我正在尝试通过 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
)
}
点位置不正确。
如何获取或转换与预览相匹配的分析仪坐标?
在映射与前置摄像头一起使用的坐标时,我处理了类似的问题。以下是我的代码,您可以应用:
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
,因为根据您屏幕的宽高比,预览图像的宽度侧已被稍微裁剪。 如果您需要更多信息请再次询问我