Ir al contenido

El contrato de Pose

Una Pose es un fotograma de puntos del cuerpo. Todo el motor confía en que las poses cumplen este contrato; si escribes tu propio PoseProvider, eres tú quien debe respetarlo.

public struct Pose: Sendable {
public var points: [Joint: CGPoint]
public var timestamp: TimeInterval
public var imageSize: CGSize?
public var confidence: [Joint: Double]
}
  1. Píxeles de imagen, con y hacia abajo. El origen está arriba a la izquierda, como en UIKit. No uses coordenadas normalizadas (0…1) ni el origen abajo de Vision.
  2. Lados anatómicos. .leftElbow es el codo izquierdo real del paciente. Con la cámara frontal la imagen está espejada, así que el adaptador debe intercambiar izquierda y derecha antes de construir la pose.
  3. Solo puntos confiables. Las articulaciones con baja confianza se omiten del diccionario. Una articulación ausente significa «no la veo», y el motor la trata así: no mide, no castiga y avisa que falta.
  4. confidence es opcional. Si tu detector no da confianza, deja el diccionario vacío; las métricas de confianza saldrán nil.

Joint sigue los 19 puntos del detector 2D de cuerpo de Vision:

Zona Articulaciones
Cabeza nose, leftEye, rightEye, leftEar, rightEar
Línea media neck, root (centro de la cadera)
Brazos leftShoulder, rightShoulder, leftElbow, rightElbow, leftWrist, rightWrist
Piernas leftHip, rightHip, leftKnee, rightKnee, leftAnkle, rightAnkle

Para no escribir side == .left ? .leftKnee : .rightKnee, usa los atajos:

Joint.knee(.left) // .leftKnee
Joint.shoulder(side) // según el lado
BodySide.right.opposite // .left
if let elbow = pose[.rightElbow] {
print(elbow) // CGPoint en píxeles
}
pose.confidence(of: [.rightShoulder, .rightElbow, .rightWrist])
// La confianza más baja entre las que se ven, o nil

imageSize permite dibujar los puntos encima de la vista de cámara escalándolos al tamaño de la vista.