Saltar a contenido

Casos de Uso para Pruebas Automatizadas de UI - Sistema de Posturografía

Índice

  1. Información General
  2. Calibración del Sistema
  3. Vista Anterior (Frente)
  4. Vista Posterior (Espalda)
  5. Vista Lateral Derecha (Perfil Derecho)
  6. Vista Lateral Izquierda (Perfil Izquierda)
  7. Valores de Referencia Diagnóstica
  8. Estructura de Archivos .mat

Información General

Factor de Calibración (FC)

  • Definición: Conversión de píxeles a centímetros
  • Cálculo: FC = 10 / D12 donde D12 es la distancia en píxeles entre dos puntos de la grilla separados 10 cm
  • Uso: Todas las mediciones en píxeles se multiplican por FC para obtener centímetros

Líneas de Referencia (LRV - Línea de Referencia Vertical)

  • LRV Horizontal (Hx1, Hy1, Hx2, Hy2): Línea horizontal a nivel de maleolos
  • LRV Vertical (Vx1, Vy1, Vx2, Vy2): Línea vertical perpendicular que pasa por el punto medio de los maleolos
  • Uso: Todas las mediciones de desviación se calculan respecto a estas líneas

Calibración del Sistema

Secuencia de Calibración

  1. Cargar Imagen
  2. Botón: TagAbrirImagen
  3. Formato: JPG
  4. Resultado: Imagen cargada en axes1

  5. Calibrar con Grilla

  6. Botón: TagCalibracion (o TagCalibracionGrilla)
  7. Acción: Click en dos puntos de la grilla separados 10 cm
  8. Coordenadas ejemplo:
    Punto 1: (X1, Y1) = (100, 500)
    Punto 2: (X2, Y2) = (200, 500)
    
  9. Cálculo:
    D12 = sqrt((X1-X2)^2 + (Y1-Y2)^2)
    FC = 10 / D12
    
  10. Valor esperado FC: ~0.1 (típico para distancia de 100 píxeles = 10 cm)

  11. Importar Marcadores

  12. Botón: TagImportarMarcadores (o TagMarcadores)
  13. Archivo: Marcadores_ID_ML_*.mat
  14. Estructura del archivo:

    - cell_res: array Nx4 donde cada fila contiene:
      [nombre_marcador, ?, X_coordenada, Y_coordenada]
    - ID: identificador del sujeto
    

  15. Trazar Rectas de Referencia

  16. Botón: TagRectasRef (o ReferenciasTag)
  17. Horizontal (Maleolos):

    • Click en maleolo derecho externo
    • Click en maleolo izquierdo externo
    • Guarda: (Hx1, Hy1, Hx2, Hy2)
    • Calcula distancia de maleolos en cm: DistanciaMaleolos = FC * sqrt((Hx1-Hx2)^2 + (Hy1-Hy2)^2)
  18. Vertical (LRV):

    • Calcula punto medio: p1x = Hx1 + (sqrt((Hx1-Hx2)^2 + (Hy1-Hy2)^2) / 2)
    • Traza vertical desde p1y = Hy1 hasta p2y = p1y - (200/FC)
    • Guarda: (Vx1, Vy1, Vx2, Vy2)

Vista Anterior (Frente)

Archivo MATLAB

InterfazMedicionFrenteJulio2024v2 (1).m

Marcadores Utilizados

Marcador Descripción Uso
Tragus Der. / Lóbulo Oreja Der. Oreja derecha Inclinación cabeza
Tragus Izq. / Lóbulo Oreja Izq. Oreja izquierda Inclinación cabeza
Eminencia Frontal Media Frente Rotación cabeza
Espina Nasal Nariz Rotación cabeza
Punto Mentoniano Mentón Rotación cabeza
Punto Acromion Der. Hombro derecho Inclinación hombros
Punto Acromion Izq. Hombro izquierdo Inclinación hombros
Escotadura Esternal Horquilla esternal Rotación tronco
Apéndice Xifoides Xifoides Rotación tronco
Punto Sínfisis Pubiana Pubis Rotación tronco
Espina Iliaca Anterosuperior Der. Cadera derecha Inclinación pelvis
Espina Iliaca Anterosuperior Izq. Cadera izquierda Inclinación pelvis
Centro Rotula Der. Rótula derecha Ángulo Q
Centro Rotula Izq. Rótula izquierda Ángulo Q
TAT Der Tuberosidad tibial anterior derecha Ángulo Q
TAT Izq Tuberosidad tibial anterior izquierda Ángulo Q

Workflow - Vista Anterior

1. Región Cérvico-Cefálica

Botón: TagCervicoCefalico_Callback

Cálculos:

  1. Inclinación de Cabeza (Línea entre tragus/lóbulos)

    Marcadores: 'Tragus Der.' (o 'Lóbulo Oreja Der.'), 'Tragus Izq.' (o 'Lóbulo Oreja Izq.')
    
    X1 = matXY(Tragus_Izq, 1)
    Y1 = matXY(Tragus_Izq, 2)
    X2 = matXY(Tragus_Der, 1)
    Y2 = matXY(Tragus_Der, 2)
    
    # Trazar línea entre puntos
    
    # Calcular ángulo:
    Si Y1 < Y2:  # Cae a la derecha
        A = [X2-X1, Y1-Y1]
        B = [X2-X1, Y2-Y1]
        gradosCC = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si gradosCC > 2: diagnóstico = 'derecha'
        Sino: diagnóstico = 'neutro'
    Sino:  # Cae a la izquierda
        A = [X1-X2, Y2-Y2]
        B = [X1-X2, Y1-Y2]
        gradosCC = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si abs(gradosCC) > 2: diagnóstico = 'izquierda'
        Sino: diagnóstico = 'neutro'
    

  2. Rotación Eminencia Frontal Media

    Marcador: 'Eminencia Frontal Media'
    
    XEFM = matXY(EFM, 1)
    DISTANCIAEMFCM = FC * (Vx1 - XEFM)
    
    Si DISTANCIAEMFCM > 1: diagnóstico = 'derecha'
    Si DISTANCIAEMFCM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

  3. Rotación Espina Nasal

    Marcador: 'Espina Nasal'
    
    XEN = matXY(EN, 1)
    DISTANCIAENCM = FC * (Vx1 - XEN)
    
    Si DISTANCIAENCM > 1: diagnóstico = 'derecha'
    Si DISTANCIAENCM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

  4. Rotación Punto Mentoniano

    Marcador: 'Punto Mentoniano'
    
    XPM = matXY(PM, 1)
    DISTANCIAPMCM = FC * (Vx1 - XPM)
    
    Si DISTANCIAPMCM > 1: diagnóstico = 'derecha'
    Si DISTANCIAPMCM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

Resultados Esperados:

Región: Cervico - cefálica
Variables:
  - Ángulo de inclinación cabeza [°]: gradosCC
  - Rotación Eminencia Frontal Media [cm]: DISTANCIAEMFCM
  - Rotación Espina Nasal [cm]: DISTANCIAENCM
  - Rotación Punto Mentoniano [cm]: DISTANCIAPMCM

2. Región Tronco-Columna

Botón: TagTroncoColumna

Cálculos:

  1. Rotación Escotadura Esternal

    Marcador: 'Escotadura Esternal'
    
    XEE = matXY(EE, 1)
    DISTANCIAEECM = FC * (Vx1 - XEE)
    
    Si DISTANCIAEECM > 1: diagnóstico = 'derecha'
    Si DISTANCIAEECM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

  2. Rotación Apéndice Xifoides

    Marcador: 'Apéndice Xifoides'
    
    XAX = matXY(AX, 1)
    DISTANCIAAXCM = FC * (Vx1 - XAX)
    
    Si DISTANCIAAXCM > 1: diagnóstico = 'derecha'
    Si DISTANCIAAXCM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

  3. Rotación Sínfisis Pubiana

    Marcador: 'Punto Sínfisis Pubiana'
    
    XPSP = matXY(PSP, 1)
    DISTANCIAPSPCM = FC * (Vx1 - XPSP)
    
    Si DISTANCIAPSPCM > 1: diagnóstico = 'derecha'
    Si DISTANCIAPSPCM < -1: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

  4. Inclinación de Tronco (Línea entre PSP y EE)

    Marcadores: 'Escotadura Esternal', 'Punto Sínfisis Pubiana'
    
    # Trazar línea entre XPSP, YPSP y XEE, YEE
    
    A = [XEE-XPSP, YEE-YPSP]
    B = [XPSP-XPSP, YEE-YPSP]
    gradosTronco = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    Si gradosTronco > 2:
        Si XEE < Vx1: diagnóstico = 'derecha'
        Sino: diagnóstico = 'izquierda'
    Sino: diagnóstico = 'neutro'
    

Resultados Esperados:

Región: Tronco - Columna
Variables:
  - Rotación Escotadura Esternal [cm]: DISTANCIAEECM
  - Rotación Apéndice Xifoides [cm]: DISTANCIAAXCM
  - Rotación Sínfisis Pubiana [cm]: DISTANCIAPSPCM
  - Ángulo de Inclinación Tronco [°]: gradosTronco

3. Cintura Escapular - Miembro Superior

Botón: TagHombroMSuperior

Cálculos:

  1. Inclinación de Hombros (Línea entre acromions)
    Marcadores: 'Punto Acromion Der.', 'Punto Acromion Izq.'
    
    X1 = matXY(AcromionDer, 1)  # Hombro derecho (izquierda de la foto)
    Y1 = matXY(AcromionDer, 2)
    X2 = matXY(AcromionIzq, 1)  # Hombro izquierdo (derecha de la foto)
    Y2 = matXY(AcromionIzq, 2)
    
    # Trazar línea entre puntos
    
    # Y1 derecho, Y2 izquierdo, el valor menor está más arriba
    Si Y2 < Y1:  # Cae a la derecha
        A = [X1-X2, Y2-Y2]
        B = [X1-X2, Y1-Y2]
        gradosHombros = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si gradosHombros > 2: diagnóstico = 'derecha'
        Sino: diagnóstico = 'neutro'
    Sino:  # Cae a la izquierda
        A = [X2-X1, Y1-Y1]
        B = [X2-X1, Y2-Y1]
        gradosHombros = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si abs(gradosHombros) > 2: diagnóstico = 'izquierda'
        Sino: diagnóstico = 'neutro'
    

Resultados Esperados:

Región: C. Escapular - M. Superior
Variables:
  - Ángulo de Inclinación hombros [°]: gradosHombros

4. Cintura Pélvica - Miembro Inferior

Botón: TagPelvisMInferior

Cálculos:

  1. Inclinación de Pelvis (Línea entre espinas iliacas)

    Marcadores: 'Espina Iliaca Anterosuperior Izq.', 'Espina Iliaca Anterosuperior Der.'
    
    X1 = matXY(EIAS_Izq, 1)  # Izquierda de la foto
    Y1 = matXY(EIAS_Izq, 2)
    X2 = matXY(EIAS_Der, 1)  # Derecha de la foto
    Y2 = matXY(EIAS_Der, 2)
    
    # Trazar línea entre puntos
    
    # Y1 es izquierdo, Y2 es derecho
    Si Y1 < Y2:  # Cae a la derecha, positivo
        A = [X2-X1, Y1-Y1]
        B = [X2-X1, Y2-Y1]
        gradosPMI = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si gradosPMI > 2: diagnóstico = 'derecha'
        Sino: diagnóstico = 'neutro'
    Sino:  # Cae a la izquierda, negativo
        A = [X1-X2, Y2-Y2]
        B = [X1-X2, Y1-Y2]
        gradosPMI = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si abs(gradosPMI) > 2: diagnóstico = 'izquierda'
        Sino: diagnóstico = 'neutro'
    

  2. Ángulo Q Derecho (Ángulo entre EIAS, Rótula y TAT)

    Marcadores: 'Espina Iliaca Anterosuperior Der.', 'Centro Rotula Der.', 'TAT Der'
    
    # Trazar líneas:
    # - Línea 1: TAT Der -> Centro Rotula Der (amarillo)
    # - Línea 2: Centro Rotula Der -> EIAS Der (amarillo)
    
    A = [TATDerX - RotulaDerX, TATDerY - RotulaDerY]
    B = [EspIliDerX - RotulaDerX, EspIliDerY - RotulaDerY]
    
    anguloQDerecho = abs(180 - rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))))
    
    Si anguloQDerecho > 6 Y anguloQDerecho < 27:
        diagnóstico = 'normal'
    Si anguloQDerecho >= 27:
        diagnóstico = 'aumentado'
    Si anguloQDerecho <= 6:
        diagnóstico = 'disminuido'
    

  3. Ángulo Q Izquierdo (Ángulo entre EIAS, Rótula y TAT)

    Marcadores: 'Espina Iliaca Anterosuperior Izq.', 'Centro Rotula Izq.', 'TAT Izq'
    
    # Trazar líneas:
    # - Línea 1: TAT Izq -> Centro Rotula Izq (amarillo)
    # - Línea 2: Centro Rotula Izq -> EIAS Izq (amarillo)
    
    A = [TATIzqX - RotulaIzqX, TATIzqY - RotulaIzqY]
    B = [EspIliIzqX - RotulaIzqX, EspIliIzqY - RotulaIzqY]
    
    anguloQIzquierdo = abs(180 - rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))))
    
    Si anguloQIzquierdo > 6 Y anguloQIzquierdo < 27:
        diagnóstico = 'normal'
    Si anguloQIzquierdo >= 27:
        diagnóstico = 'aumentado'
    Si anguloQIzquierdo <= 6:
        diagnóstico = 'disminuido'
    

  4. Medidas Manuales de Miembro Inferior

  5. Botón: TagMedidas
  6. ListBox: Seleccionar 'Condilos' o 'Gemelos'
  7. Acción: Click en dos puntos para medir distancia horizontal

    DistanciaLista = x2 - x1
    DistanciaListaCM = FC * DistanciaLista
    

  8. Diagnóstico de Miembro Inferior (Genu Varo/Valgo)

    # Basado en: DistanciaCondilos, DistanciaGemelos, DistanciaMaleolos
    
    Si DistanciaMaleolos < 1:
        Si DistanciaCondilos < 1:
            diagnóstico = 'Neutro'
        Sino:
            diagnóstico = 'Genu Varo'
    Sino:
        Si DistanciaMaleolos > DistanciaCondilos:
            diagnóstico = 'Genu Valgo'
        Sino:
            diagnóstico = 'Genu Varo'
    

Resultados Esperados:

Región: C. Pélvica - M. Inferior
Variables:
  - Ángulo de Inclinación Pelvis [°]: gradosPMI
  - Distancia Cóndilos [cm]: DistanciaCondilos
  - Distancia Gemelos [cm]: DistanciaGemelos
  - Distancia Maléolos [cm]: DistanciaMaleolos
  - Ángulo Q Derecho [°]: anguloQDerecho
  - Ángulo Q Izquierdo [°]: anguloQIzquierdo


Vista Posterior (Espalda)

Archivo MATLAB

InterfazMedicionEspaldaJulio2024v2 (1).m

Marcadores Utilizados

Marcador Descripción Uso
Tragus Der. Oreja derecha Inclinación cabeza
Tragus Izq. Oreja izquierda Inclinación cabeza
Lóbulo Izq Lóbulo oreja izquierda Inclinación cabeza (alternativo)
Lóbulo Der Lóbulo oreja derecha Inclinación cabeza (alternativo)
Punto Interno Espina Omóplato Izq (línea medial) Escápula izquierda superior Asimetría escapular
Ángulo Inferior Omóplato Izq Escápula izquierda inferior Asimetría escapular
Punto Interno Espina Omóplato Der (línea medial) Escápula derecha superior Asimetría escapular
Ángulo Inferior Omóplato Der Escápula derecha inferior Asimetría escapular
Cervical 7 Vértebra C7 Desbalance coronal
Torácica 3 Vértebra T3 Desbalance coronal
Torácica 7 Vértebra T7 Desbalance coronal
Torácica 12 Vértebra T12 Desbalance coronal
Lumbar 5 Vértebra L5 Desbalance coronal
Espina iliaca posterosuperior izquierda EIPS izquierda Inclinación pelvis
Espina iliaca posterosuperior derecha EIPS derecha Inclinación pelvis
Calcáneo Izq Calcáneo izquierdo Ángulo calcáneo
Aquiles Izq Tendón Aquiles izquierdo Ángulo calcáneo
Calcáneo Der Calcáneo derecho Ángulo calcáneo
Aquiles Der Tendón Aquiles derecho Ángulo calcáneo

Workflow - Vista Posterior

1. Región Cérvico-Cefálica

Botón: TagCervicoCefalica

Cálculos:

  1. Distancias de Tragus a LVR
    Marcador: 'Tragus Izq.'
    
    X1 = matXY(Tragus_Izq, 1)
    Dizqcm = FC * abs(Vx1 - X1)
    
    Marcador: 'Tragus Der.'
    
    X2 = matXY(Tragus_Der, 1)
    Ddercm = FC * abs(Vx1 - X2)
    
    # Calcular ángulo entre tragus:
    angulo_tragus = (angle((X2-X1) + (Y2-Y1)*i) * 180) / pi
    

Resultados Esperados:

Región: Cervico - cefálica
Variables:
  - Distancia Tragus Izq a LVR [cm]: Dizqcm
  - Distancia Tragus Der a LVR [cm]: Ddercm
  - Ángulo Tragus [°]: angulo_tragus

2. Región Cintura Escapular

Botón: TagCinturaEscapular

Cálculos:

  1. Escápula Izquierda

    Marcadores: 'Punto Interno Espina Omóplato Izq (línea medial)', 'Ángulo Inferior Omóplato Izq'
    
    X1 = matXY(PuntoInternoIzq, 1)
    Y1 = matXY(PuntoInternoIzq, 2)
    DizSupIzqcm = FC * abs(Vx1 - X1)
    
    X2 = matXY(AnguloInferiorIzq, 1)
    Y2 = matXY(AnguloInferiorIzq, 2)
    DizInfIzqcm = FC * abs(Vx1 - X2)
    
    # Trazar líneas:
    # - Línea 1: Punto Interno Izq -> Ángulo Inferior Izq
    # - Línea 2: Punto Interno Izq -> Vx1 (horizontal)
    # - Línea 3: Ángulo Inferior Izq -> Vx1 (horizontal)
    
    # Calcular ángulo respecto a la vertical:
    Angulo1grados = abs(angle((X2-X1)+(Y2-Y1)*i)) - (pi/2)
    Angulo1grados = (Angulo1grados * 180) / pi
    

  2. Escápula Derecha

    Marcadores: 'Punto Interno Espina Omóplato Der (línea medial)', 'Ángulo Inferior Omóplato Der'
    
    X1 = matXY(PuntoInternoDer, 1)
    Y1 = matXY(PuntoInternoDer, 2)
    DderSupcm = FC * abs(Vx1 - X1)
    
    X2 = matXY(AnguloInferiorDer, 1)
    Y2 = matXY(AnguloInferiorDer, 2)
    DderInfcm = FC * abs(Vx1 - X2)
    
    # Trazar líneas:
    # - Línea 1: Punto Interno Der -> Ángulo Inferior Der
    # - Línea 2: Punto Interno Der -> Vx1 (horizontal)
    # - Línea 3: Ángulo Inferior Der -> Vx1 (horizontal)
    
    # Calcular ángulo respecto a la vertical:
    Angulo2grados = abs(angle((X2-X1)+(Y2-Y1)*i)) - (pi/2)
    Angulo2grados = (Angulo2grados * 180) / pi
    

  3. Diagnóstico de Asimetría

    Si abs(DizSupIzqcm - DderSupcm) > 1:
        DiagnosticoSup = 'Asimétrico'
    Sino:
        DiagnosticoSup = 'Simétrico'
    
    Si abs(DizInfIzqcm - DderInfcm) > 1:
        DiagnosticoInf = 'Asimétrico'
    Sino:
        DiagnosticoInf = 'Simétrico'
    

Resultados Esperados:

Región: C. Escapular - M. Superior
Variables:
  - Punto Interno Espina Omóplato Izq [cm]: DizSupIzqcm
  - Punto del Ángulo Inferior Omóplato Izq [cm]: DizInfIzqcm
  - Punto Interno Espina Omóplato Der [cm]: DderSupcm
  - Punto del Ángulo Inferior Omóplato Der [cm]: DderInfcm

3. Región Cabeza (Inclinación)

Botón: TagCabeza

Cálculos:

  1. Inclinación de Cabeza (Línea entre lóbulos)
    Marcadores: 'Lóbulo Izq', 'Lóbulo Der'
    
    X1 = matXY(LobuloIzq, 1)
    Y1 = matXY(LobuloIzq, 2)
    X2 = matXY(LobuloDer, 1)
    Y2 = matXY(LobuloDer, 2)
    
    Si Y1 < Y2:  # Cae a la derecha
        A = [X2-X1, Y1-Y1]
        B = [X2-X1, Y2-Y1]
        gradosCabeza = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si gradosCabeza > 2: diagnóstico = 'derecha'
        Sino: diagnóstico = 'neutro'
    Sino:  # Cae a la izquierda
        A = [X1-X2, Y2-Y2]
        B = [X1-X2, Y1-Y2]
        gradosCabeza = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
        Si abs(gradosCabeza) > 2: diagnóstico = 'izquierda'
        Sino: diagnóstico = 'neutro'
    

Resultados Esperados:

Región: Cervico - cefálica
Variables:
  - Ángulo de Inclinación cabeza [°]: gradosCabeza

4. Región Tronco-Columna

Botón: TagTroncoycolumna

Cálculos:

  1. Desbalance Coronal de Vértebras
    # Para cada vértebra: C7, T3, T7, T12, L5
    
    Marcador: 'Cervical 7'
    XC7 = matXY(C7, 1)
    Dist_C7 = FC * (XC7 - Vx1)
    # POSITIVO: espinosa a la derecha (desbalance coronal derecha)
    # NEGATIVO: espinosa a la izquierda (desbalance coronal izquierda)
    
    Si Dist_C7 > 1: Diag_C7 = 'Derecha'
    Si Dist_C7 < -1: Diag_C7 = 'Izquierda'
    Sino: Diag_C7 = 'Neutro'
    
    # Repetir para T3, T7, T12, L5
    

Resultados Esperados:

Región: Tronco - Columna
Variables:
  - Desbalance coronal C7 [cm]: Dist_C7
  - Desbalance coronal T3 [cm]: Dist_T3
  - Desbalance coronal T7 [cm]: Dist_T7
  - Desbalance coronal T12 [cm]: Dist_T12
  - Desbalance coronal L5 [cm]: Dist_L5

5. Región Cintura Pélvica - Miembro Inferior

Botón: TagMiembroInferior

Cálculos:

  1. Inclinación de Pelvis (Línea entre EIPS)

    Marcadores: 'Espina iliaca posterosuperior izquierda', 'Espina iliaca posterosuperior derecha'
    
    X1 = matXY(EIPS_Izq, 1)
    Y1 = matXY(EIPS_Izq, 2)
    X2 = matXY(EIPS_Der, 1)
    Y2 = matXY(EIPS_Der, 2)
    
    # Trazar línea entre puntos
    
    Si Y1 > Y2:  # Cae a la izquierda (foto posterior)
        gradosPelvis = -(180 - (angle((X1-X2)+(Y1-Y2)*i)*180 / pi))
        Si abs(gradosPelvis) > 1: diagnóstico = 'izquierda'
        Sino: diagnóstico = 'neutro'
    Sino:  # Cae a la derecha
        gradosPelvis = 180 - abs(angle((X1-X2)+(Y1-Y2)*i)*180 / pi)
        Si abs(gradosPelvis) > 1: diagnóstico = 'derecha'
        Sino: diagnóstico = 'neutro'
    

  2. Medidas Manuales de Miembro Inferior

  3. Botón: TomarMedida
  4. ListBox: Seleccionar 'Condilos' o 'Gemelos'
  5. Acción: Click en dos puntos para medir distancia horizontal

  6. Diagnóstico de Miembro Inferior (Genu Varo/Valgo)

    # Basado en: DistanciaCondilosEspalda, DistanciaGemelosEspalda, DistanciaMaleolosEspalda
    
    Si DistanciaMaleolosEspalda < 1:
        Si DistanciaCondilosEspalda < 1:
            diagnóstico = 'Neutro'
        Sino:
            diagnóstico = 'Genu Varo'
    Sino:
        Si DistanciaMaleolosEspalda > DistanciaCondilosEspalda:
            diagnóstico = 'Genu Valgo'
        Sino:
            diagnóstico = 'Genu Varo'
    

Resultados Esperados:

Región: C. Pélvica - M. Inferior
Variables:
  - Ángulo de Inclinación Pelvis [°]: gradosPelvis
  - Distancia Cóndilos [cm]: DistanciaCondilosEspalda
  - Distancia Gemelos [cm]: DistanciaGemelosEspalda
  - Distancia Maléolos [cm]: DistanciaMaleolosEspalda

6. Ángulo Calcáneo

Botones: TagAnguloCalcaneo (Izquierdo), pushbutton20 (Derecho)

Cálculos:

  1. Ángulo Calcáneo Izquierdo

    # PASO 1: Tomar puntos del pliegue poplíteo izquierdo (manual)
    # Click 1: Punto 1 del pliegue (x1, y1)
    # Click 2: Punto 2 del pliegue (x2, y2)
    
    # Trazar línea entre puntos
    DistPopliIzq = sqrt((x1-x2)^2 + (y1-y2)^2)
    Mitad = DistPopliIzq / 2
    alfa = angle((x1-x2) + (y1-y2)*i)
    X = abs(Mitad * cos(alfa))
    Y = abs(Mitad * sin(alfa))
    XfinalIzq = X + x1
    YfinalIzq = y1 - Y
    # Marcar punto medio (rojo)
    
    # PASO 2: Obtener marcadores
    Marcador: 'Calcáneo Izq'
    XCALIZQ = matXY(CalcaneoIzq, 1)
    YCALIZQ = matXY(CalcaneoIzq, 2)
    # Marcar punto (rojo)
    
    Marcador: 'Aquiles Izq'
    XAQUILESIZQ = matXY(AquilesIzq, 1)
    YAQUILESIZQ = matXY(AquilesIzq, 2)
    # Marcar punto (rojo)
    
    # PASO 3: Trazar líneas
    # Línea 1: Aquiles Izq -> Punto medio poplíteo
    # Línea 2: Aquiles Izq -> Calcáneo Izq
    
    # PASO 4: Calcular ángulo
    A = [XfinalIzq - XAQUILESIZQ, YfinalIzq - YAQUILESIZQ]
    B = [XCALIZQ - XAQUILESIZQ, YCALIZQ - YAQUILESIZQ]
    angulocalcaneoizq = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    # PASO 5: Diagnóstico
    Si angulocalcaneoizq > 178:
        diagnóstico = 'neutro'
    Sino:
        Si XAQUILESIZQ < XCALIZQ:
            # Abre hacia adentro
            diagnóstico = 'Calcáneo varo = supinado'
            angulocalcaneoizq = -angulocalcaneoizq
        Sino:
            # Abre hacia afuera
            diagnóstico = 'Calcáneo valgo = pronado'
    

  2. Ángulo Calcáneo Derecho

    # PASO 1: Tomar puntos del pliegue poplíteo derecho (manual)
    # Similar al izquierdo, pero con puntos derechos
    
    # PASO 2: Obtener marcadores 'Calcáneo Der', 'Aquiles Der'
    # PASO 3: Trazar líneas
    # PASO 4: Calcular ángulo
    
    A = [XfinalDer - XCALDER, YfinalDer - YCALDER]
    B = [XCALDER - XAQUILESDER, YCALDER - YAQUILESDER]
    angulocalcaneoder = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    # PASO 5: Diagnóstico
    Si angulocalcaneoder > 178:
        diagnóstico = 'neutro'
    Sino:
        Si XAQUILESDER < XCALDER:
            # Abre hacia lateral
            diagnóstico = 'Calcáneo valgo = pronado'
        Sino:
            # Abre hacia adentro
            diagnóstico = 'Calcáneo varo = supinado'
            angulocalcaneoder = -angulocalcaneoder
    

Resultados Esperados:

Región: C. Pélvica - M. Inferior
Variables:
  - Ángulo Calcáneo Izquierdo [°]: angulocalcaneoizq
  - Ángulo Calcáneo Derecho [°]: angulocalcaneoder


Vista Lateral Derecha (Perfil Derecho)

Archivo MATLAB

InterfazMedicionPerfilDerechoJulio2024 (1).m

Marcadores Utilizados

Marcador Descripción Uso
Tragus Der. / Lóbulo Oreja Der. Oreja derecha Ubicación sagital cabeza
Apex Cervical Der. Apex cervical Lordosis cervical
Punto Acromion Der. Hombro derecho Alineación sagital hombro
Punto Epicóndilo Der. Codo derecho Ángulo de codo
Base 3er Metacarpiano Der. Mano derecha Ángulo de codo
Trocánter Mayor (borde superior) Der. Cadera derecha Traslación pélvica
Tubérculo Ilíaco Der. Cresta ilíaca derecha Traslación pélvica
Tubérculo Cóndilo Externo Der. Rodilla derecha Alineación sagital rodilla
Borde anterior de Maléolo Der. Tobillo derecho Ángulo tibiotarsiano
Espina Ilíaca Anterosuperior EIAS Basculación pélvica
Espina Ilíaca Posteroinferior EIPI Basculación pélvica
Apex Lumbar Der. Apex lumbar Lordosis lumbar

Workflow - Vista Lateral Derecha

1. Configuración de Líneas de Referencia

Nota Importante: En perfil, la LRV pasa por el maleolo anterior

# La ReferenciasTag en perfil es especial:
Marcador: 'Borde anterior de Maléolo Der.'
XV = matXY(Maleolo, 1)
YV = matXY(Maleolo, 2)

# Click manual para horizontal (nivel del maleolo)
# Traza horizontal: (x1, y1) -> (x2, y2)

# Traza vertical automáticamente desde XV, y1
Vx1 = XV
Vy1 = y1
Vx2 = XV
Vy2 = y1 - (200/FC)

2. Tangentes Posturales

Botón: TagTangentes

Listbox: Seleccionar 'Punto Cabeza', 'Punto Dorsal' o 'Punto Sacro'

Acción: Para cada punto, click en el punto más posterior de la región

# Click en el punto más posterior de la región seleccionada
# El sistema traza una línea vertical tangente:

x1 = punto_clickeado_x
y1 = punto_clickeado_y

# Trazar línea vertical:
p1x = x1
p1y = y1 - (2 * 10/FC)  # 20 cm arriba
p2x = x1
p2y = y1 + (10/FC)  # 10 cm abajo

# Guardar coordenadas:
Si selección == 'Punto Cabeza':
    Xcabeza = x1
    Ycabeza = y1
Si selección == 'Punto Dorsal':
    Xdorsal = x1
    Ydorsal = y1
Si selección == 'Punto Sacro':
    Xsacro = x1
    Ysacro = y1

3. Región Cérvico-Cefálica

Botón: TagCervicoCefalica

Cálculos:

  1. Ubicación Sagital de Cabeza (Distancia Tragus a LVR)

    Marcador: 'Tragus Der.' (o 'Lóbulo Oreja Der.')
    
    XTRAGUS = matXY(Tragus, 1)
    DistanciaTragus = FC * (XTRAGUS - Vx1)
    
    Si DistanciaTragus > 1: diagnóstico = 'antepulsión'
    Si DistanciaTragus < -1: diagnóstico = 'retropulsión'
    Sino: diagnóstico = 'alineada'
    

  2. Tangentes Occipital-Dorso

    # Requiere tangentes previamente trazadas
    DistanciaCabezaDorso = FC * (Xcabeza - Xdorsal)
    
    Si DistanciaCabezaDorso > 0:
        Si DistanciaCabezaDorso < 1:
            diagnóstico = 'Tangentes alineadas'
        Sino:
            diagnóstico = 'Tangentes NO alineadas, adelante'
    Sino:
        Si DistanciaCabezaDorso > -1:
            diagnóstico = 'Tangentes alineadas'
        Sino:
            diagnóstico = 'Tangentes NO alineadas, detrás'
    

  3. Lordosis Cervical (Distancia Apex Cervical a Tangente Dorsal)

    Marcador: 'Apex Cervical Der.'
    
    XAPEXDORSO = matXY(ApexCervical, 1)
    DistanciaApexDorsal = FC * (XAPEXDORSO - Xdorsal)
    
    Si DistanciaApexDorsal > 3:
        Si DistanciaApexDorsal < 5:
            diagnóstico = 'Distancia al apex normal'
        Sino:
            diagnóstico = 'Distancia al apex aumentada'  # Hiperlordosis
    Sino:
        diagnóstico = 'Distancia al apex disminuida'  # Rectificación
    
    # Rango normal: 3-5 cm
    

Resultados Esperados:

Región: Cervico - Cefálica
Variables:
  - Ubicación sagital de cabeza [cm]: DistanciaTragus
  - Tangentes Occipital - Dorso [cm]: DistanciaCabezaDorso
  - Lordosis cervical [cm]: DistanciaApexDorsal

4. Región Tronco-Columna

Botón: TagTroncoColumna

Cálculos:

  1. Tangentes Dorso-Sacro

    # Requiere tangentes previamente trazadas
    DistanciaSacroDorsal = FC * (Xdorsal - Xsacro)
    
    Si DistanciaSacroDorsal > 0:
        Si DistanciaSacroDorsal < 1:
            diagnóstico = 'Tangentes alineadas'
        Sino:
            diagnóstico = 'Tangentes NO alineadas, adelante'
    Sino:
        Si DistanciaSacroDorsal > -1:
            diagnóstico = 'Tangentes alineadas'
        Sino:
            diagnóstico = 'Tangentes NO alineadas, detrás'
    

  2. Lordosis Lumbar (Distancia Apex Lumbar a Tangente Sacro)

    Marcador: 'Apex Lumbar Der.'
    
    XAPEXLUMBAR = matXY(ApexLumbar, 1)
    DistanciaApexSacro = FC * (XAPEXLUMBAR - Xsacro)
    
    Si DistanciaApexSacro > 3:
        Si DistanciaApexSacro < 5:
            diagnóstico = 'Distancia al apex normal'
        Sino:
            diagnóstico = 'Distancia al apex aumentada'  # Hiperlordosis
    Sino:
        diagnóstico = 'Distancia al apex disminuida'  # Rectificación
    
    # Rango normal: 3-5 cm
    

Resultados Esperados:

Región: Tronco - columna
Variables:
  - Tangentes Dorso - Sacro [cm]: DistanciaSacroDorsal
  - Lordosis lumbar [cm]: DistanciaApexSacro

5. Cintura Escapular - Miembro Superior

Botón: TagMiembroSuperior

Cálculos:

  1. Alineación Sagital Hombro (Distancia Acromion a LVR)

    Marcador: 'Punto Acromion Der.'
    
    XACROMION = matXY(Acromion, 1)
    DistanciaAcromionDer = FC * (XACROMION - Vx1)
    
    Si DistanciaAcromionDer > 1: diagnóstico = 'antepulsión'
    Si DistanciaAcromionDer < -1: diagnóstico = 'retropulsión'
    Sino: diagnóstico = 'Alineado'
    

  2. Ángulo de Codo

    Marcadores: 'Punto Acromion Der.', 'Punto Epicóndilo Der.', 'Base 3er Metacarpiano Der.'
    
    XACROMION = matXY(Acromion, 1)
    YACROMION = matXY(Acromion, 2)
    XEPICONDILODER = matXY(Epicondilo, 1)
    YEPICONDILODER = matXY(Epicondilo, 2)
    XMETADER = matXY(Metacarpiano, 1)
    YMETADER = matXY(Metacarpiano, 2)
    
    A = [XACROMION - XEPICONDILODER, YACROMION - YEPICONDILODER]
    B = [XMETADER - XEPICONDILODER, YMETADER - YEPICONDILODER]
    
    angulocodo = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    Si angulocodo > 175 Y angulocodo < 180:
        diagnóstico = 'normal'
    Si angulocodo >= 180:
        diagnóstico = 'hiperextensión'
    Sino:
        diagnóstico = 'aumento de flexión'
    

Resultados Esperados:

Región: C. Escapular - M. Superior
Variables:
  - Alineación sagital hombro [cm]: DistanciaAcromionDer
  - Ángulo Codo [°]: angulocodo

6. Cintura Pélvica - Miembro Inferior

Botón: TagPelvisMiembroInferior

Cálculos:

  1. Traslación Pélvica (Trocánter) (Distancia Trocánter a LVR)

    Marcador: 'Trocánter Mayor (borde superior) Der.'
    
    XTROCANTER = matXY(Trocanter, 1)
    DistanciaTrocanterDer = FC * (XTROCANTER - Vx1)
    
    Si DistanciaTrocanterDer > 1: diagnóstico = 'antepulsión'
    Si DistanciaTrocanterDer < -1: diagnóstico = 'retropulsión'
    Sino: diagnóstico = 'neutro'
    

  2. Traslación Pélvica (Ilíaco) (Distancia Tubérculo Ilíaco a LVR)

    Marcador: 'Tubérculo Ilíaco Der.'
    
    XTILIACO = matXY(TubIliaco, 1)
    DistTuberculoIliacoDer = FC * (XTILIACO - Vx1)
    
    Si DistTuberculoIliacoDer > 1: diagnóstico = 'antepulsión'
    Si DistTuberculoIliacoDer < -1: diagnóstico = 'retropulsión'
    Sino: diagnóstico = 'neutro'
    

  3. Alineación Sagital Rodilla (Distancia Cóndilo a LVR)

    Marcador: 'Tubérculo Cóndilo Externo Der.'
    
    XCONDILO = matXY(Condilo, 1)
    DistanciaCondiloDer = FC * (XCONDILO - Vx1)
    
    Si DistanciaCondiloDer > 1: diagnóstico = 'Genu Flexo'
    Si DistanciaCondiloDer < -1: diagnóstico = 'Genu recurvatum'
    Sino: diagnóstico = 'Normal'
    

  4. Basculación Pélvica Sagital (Ángulo entre EIAS y EIPI)

    Marcadores: 'Espina Ilíaca Anterosuperior', 'Espina Ilíaca Posteroinferior'
    
    XEIAS = matXY(EIAS, 1)
    YEIAS = matXY(EIAS, 2)
    XEIPI = matXY(EIPI, 1)
    YEIPI = matXY(EIPI, 2)
    
    Si YEIAS < YEIPI:  # Abre hacia atrás
        A = [XEIPI - XEIAS, YEIAS - YEIAS]
        B = [XEIPI - XEIAS, YEIPI - YEIAS]
        InclinacionPelvisDer = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
        Si InclinacionPelvisDer < -2: diagnóstico = 'Retroversión'
        Sino: diagnóstico = 'Normal'
    Sino:  # Abre hacia adelante
        A = [XEIAS - XEIPI, YEIPI - YEIPI]
        B = [XEIAS - XEIPI, YEIAS - YEIPI]
        InclinacionPelvisDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
        Si InclinacionPelvisDer > 2: diagnóstico = 'Anteversión'
        Sino: diagnóstico = 'Normal'
    

  5. Ángulo Tibiotarsiano

    Marcadores: 'Borde anterior de Maléolo Der.', 'Tubérculo Cóndilo Externo Der.'
    
    XMALEOLODER = matXY(Maleolo, 1)
    YMALEOLODER = matXY(Maleolo, 2)
    XTUBERDER = matXY(Tuberculo, 1)
    YTUBERDER = matXY(Tuberculo, 2)
    
    # Punto de referencia horizontal:
    XPUNTO = Hx2
    YPUNTO = YMALEOLODER
    
    # Trazar líneas (amarillo):
    # Línea 1: Maleolo -> Tubérculo
    # Línea 2: Maleolo -> Punto horizontal
    
    A = [XTUBERDER - XMALEOLODER, YTUBERDER - YMALEOLODER]
    B = [XPUNTO - XMALEOLODER, YPUNTO - YMALEOLODER]
    
    angulotibioDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    Si angulotibioDer > 92: diagnóstico = 'Tobillo en extensión'
    Si angulotibioDer < 88: diagnóstico = 'Tobillo en flexión'
    Sino: diagnóstico = 'Tobillo normal'
    
    # Normal: 90° ± 2°
    

  6. Ángulo de Rodilla (Requiere trocánter visible)

    Marcadores: 'Trocánter Mayor (borde superior) Der.', 'Tubérculo Cóndilo Externo Der.', 'Borde anterior de Maléolo Der.'
    
    # Trazar líneas (amarillo):
    # Línea 1: Cóndilo -> Maleolo
    # Línea 2: Cóndilo -> Trocánter
    
    A = [XTROCANTER - XCONDILO, YTROCANTER - YCONDILO]
    B = [XMALEOLODER - XCONDILO, YMALEOLODER - YCONDILO]
    
    anguloRodillaDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))
    
    Si anguloRodillaDer < 178:
        Si XTROCANTER > XCONDILO:
            anguloRodillaDer = -anguloRodillaDer
            diagnóstico = 'Genu Recurvatum'
        Sino:
            diagnóstico = 'Genu Flexo'
    Sino:
        diagnóstico = 'Neutro'
    
    # Normal: 180° (alineación)
    

Resultados Esperados:

Región: C. Pélvica - M. Inferior
Variables:
  - Traslación pélvica (Ilíaco) [cm]: DistTuberculoIliacoDer
  - Traslación pélvica (Trocánter) [cm]: DistanciaTrocanterDer
  - Basculación pélvica sagital [°]: InclinacionPelvisDer
  - Alineación sagital rodilla [cm]: DistanciaCondiloDer
  - Ángulo tibio tarsiano [°]: angulotibioDer
  - Ángulo de rodilla [°]: anguloRodillaDer


Vista Lateral Izquierda (Perfil Izquierda)

Archivo MATLAB

InterfazMedicionPerfilIzquierdoJulio2024 (1).m

Marcadores Utilizados

Similar a Perfil Derecho, pero con marcadores del lado izquierdo: - Tragus Izq. / Lóbulo Oreja Izq. - Apex Cervical Izq. - Punto Acromion Izq. - Punto Epicóndilo Izq. - Base 3er Metacarpiano Izq. - Trocánter Mayor (borde superior) Izq. - Tubérculo Ilíaco Izq. - Tubérculo Cóndilo Externo Izq. - Borde anterior de Maléolo Izq. - Espina Ilíaca Anterosuperior Izq. - Espina Ilíaca Posteroinferior Izq. - Apex Lumbar Izq.

Workflow - Vista Lateral Izquierda

Nota: El workflow es idéntico al Perfil Derecho, pero: 1. La LRV pasa por el Borde anterior de Maléolo Izq. 2. Las distancias se calculan como: FC * (Vx1 - X_punto) en lugar de FC * (X_punto - Vx1) 3. Los diagnósticos de antepulsión/retropulsión se invierten debido a la orientación de la foto

Diferencias clave en cálculos:

# Perfil Derecho:
DistanciaTragus = FC * (XTRAGUS - Vx1)
Si DistanciaTragus > 1: diagnóstico = 'antepulsión'
Si DistanciaTragus < -1: diagnóstico = 'retropulsión'

# Perfil Izquierdo:
DistanciaTragus = FC * (Vx1 - XTRAGUS)
Si DistanciaTragus > 1: diagnóstico = 'antepulsión'
Si DistanciaTragus < -1: diagnóstico = 'retropulsión'

Resultados Esperados: Iguales al Perfil Derecho, pero con sufijo "Izq" en variables.


Valores de Referencia Diagnóstica

Umbrales de Rotación/Traslación

Medición Normal Derecha/Antepulsión Izquierda/Retropulsión
Distancia a LVR -1 cm ≤ d ≤ 1 cm d > 1 cm d < -1 cm

Umbrales de Inclinación

Medición Neutro Derecha Izquierda
Ángulo cabeza/hombros/pelvis abs(θ) ≤ 2° θ > 2° θ < -2°

Ángulo Q

Rango Diagnóstico
θ < 6° Disminuido
6° ≤ θ < 27° Normal
θ ≥ 27° Aumentado

Ángulo de Codo

Rango Diagnóstico
θ < 175° Aumento de flexión
175° ≤ θ < 180° Normal
θ ≥ 180° Hiperextensión

Lordosis Cervical y Lumbar (Distancia Apex)

Rango Diagnóstico
d < 3 cm Rectificación
3 cm ≤ d ≤ 5 cm Normal
d > 5 cm Hiperlordosis

Ángulo Tibiotarsiano

Rango Diagnóstico
θ < 88° Tobillo en flexión
88° ≤ θ ≤ 92° Normal
θ > 92° Tobillo en extensión

Ángulo de Rodilla

Rango Diagnóstico
θ < 178° y Xtrocanter > Xcondilo Genu Recurvatum (negativo)
θ < 178° y Xtrocanter < Xcondilo Genu Flexo (positivo)
θ ≥ 178° Neutro

Ángulo Calcáneo

Condición Diagnóstico
θ > 178° Neutro
θ ≤ 178° y abre hacia medial Calcáneo varo (supinado)
θ ≤ 178° y abre hacia lateral Calcáneo valgo (pronado)

Genu Varo/Valgo

Si DistanciaMaleolos < 1 cm:
    Si DistanciaCondilos < 1 cm: Neutro
    Sino: Genu Varo
Sino:
    Si DistanciaMaleolos > DistanciaCondilos: Genu Valgo
    Sino: Genu Varo

Asimetría Escapular

Diferencia Diagnóstico
abs(Izq - Der) ≤ 1 cm Simétrico
abs(Izq - Der) > 1 cm Asimétrico

Estructura de Archivos .mat

Contenido del archivo Marcadores_ID_ML_*.mat

Variables:
  - cell_res: Cell array Nx4
    Estructura de cada fila:
    [1] Nombre del marcador (string)
    [2] ? (dato adicional)
    [3] Coordenada X (double)
    [4] Coordenada Y (double)

  - ID: Identificador del sujeto (cell array)

Identificación de Vista por Nombre de Archivo

Marcadores_ID_ML_13-2-2025_13-50-55.mat  -> Vista: A (Anterior)
Marcadores_ID_ML_13-2-2025_13-56-2.mat   -> Vista: P (Posterior)
Marcadores_ID_ML_13-2-2025_14-0-12.mat   -> Vista: LD (Lateral Derecha)
Marcadores_ID_Ml_13-2-2025_14-3-33.mat   -> Vista: LI (Lateral Izquierda)

Lectura de Coordenadas en Python

import scipy.io

# Cargar archivo
data = scipy.io.loadmat('Marcadores_ID_ML_*.mat')

# Extraer información
cell_res = data['cell_res']
ID = data['ID']

# Procesar cada marcador
for i in range(cell_res.shape[0]):
    row = cell_res[i, 0]
    nombre = str(row[0][0])
    x = float(row[2][0, 0])
    y = float(row[3][0, 0])

    print(f"{nombre}: ({x:.2f}, {y:.2f})")

Ejemplo de Coordenadas Esperadas (valores aproximados)

Vista Anterior (píxeles para imagen ~2000x3000):

Tragus Der.: (850, 400)
Tragus Izq.: (1150, 400)
Escotadura Esternal: (1000, 900)
Apéndice Xifoides: (1000, 1100)
Punto Sínfisis Pubiana: (1000, 1600)
Espina Iliaca Anterosuperior Der.: (900, 1550)
Espina Iliaca Anterosuperior Izq.: (1100, 1550)

Vista Perfil (píxeles para imagen ~2000x3000):

Tragus Der.: (600, 400)
Apex Cervical Der.: (520, 600)
Punto Acromion Der.: (550, 850)
Trocánter Mayor Der.: (580, 1450)
Tubérculo Cóndilo Externo Der.: (595, 1950)
Borde anterior de Maléolo Der.: (600, 2600)


Notas de Implementación para Testing

Secuencia de Prueba Completa

def test_vista_anterior():
    # 1. Cargar imagen
    load_image("vista_anterior.jpg")

    # 2. Calibrar
    calibrate(point1=(100, 500), point2=(200, 500))
    assert FC == pytest.approx(0.1, rel=0.01)

    # 3. Importar marcadores
    import_markers("Marcadores_ID_ML_13-2-2025_13-50-55.mat")

    # 4. Trazar rectas de referencia
    draw_reference_lines(
        maleolo_der=(850, 2600),
        maleolo_izq=(1150, 2600)
    )

    # 5. Región Cérvico-Cefálica
    result = analyze_cervico_cefalica()
    assert result['gradosCC'] == pytest.approx(expected_angle, abs=0.5)
    assert result['diag_inclinacion_cabeza'] == expected_diagnosis

    # 6. Región Tronco-Columna
    result = analyze_tronco_columna()
    assert result['gradosTronco'] == pytest.approx(expected_angle, abs=0.5)

    # 7. Cintura Escapular
    result = analyze_hombros()
    assert result['gradosHombros'] == pytest.approx(expected_angle, abs=0.5)

    # 8. Cintura Pélvica
    result = analyze_pelvis_miembro_inferior()
    assert result['anguloQDerecho'] == pytest.approx(expected_angle, abs=1.0)
    assert result['diag_miembro_inferior'] == expected_diagnosis

    # 9. Exportar resultados
    export_results("DatosSujetoML.xlsx")

Coordinación de Vistas

Cada vista debe probarse independientemente, pero el ID del sujeto debe ser consistente:

def test_all_views():
    subject_id = "ML"

    # Vista Anterior (sheet 1)
    test_vista_anterior(subject_id)

    # Vista Posterior (sheet 2)
    test_vista_posterior(subject_id)

    # Vista Perfil Derecho (sheet 3)
    test_vista_perfil_derecho(subject_id)

    # Vista Perfil Izquierdo (sheet 4)
    test_vista_perfil_izquierdo(subject_id)

    # Verificar archivo Excel completo
    workbook = load_workbook(f"DatosSujeto{subject_id}.xlsx")
    assert len(workbook.sheetnames) == 4

Casos de Prueba Específicos

Caso 1: Sujeto con Postura Neutra

@pytest.mark.parametrize("vista,expected", [
    ("anterior", {
        "gradosCC": 0.5,
        "diag_inclinacion_cabeza": "neutro",
        "gradosTronco": 1.0,
        "diag_inclinacion_tronco": "neutro",
        "gradosHombros": 0.8,
        "diag_inclinacion_hombros": "neutro",
        "gradosPMI": 0.7,
        "diag_inclinacion_pelvis": "neutro",
        "anguloQDerecho": 15.0,
        "diag_angulo_Qderecho": "normal",
        "anguloQIzquierdo": 15.5,
        "diag_angulo_Qizquierdo": "normal",
        "diag_miembro_inferior": "Neutro"
    })
])
def test_postura_neutra(vista, expected):
    # Implementar prueba con valores esperados
    pass

Caso 2: Sujeto con Escoliosis (Desbalance Coronal)

def test_escoliosis():
    # Vista Posterior
    result = analyze_tronco_columna()
    assert result['Dist_C7'] > 1.0  # Desviación a la derecha
    assert result['Diag_C7'] == 'Derecha'
    assert result['Dist_T3'] > 1.0
    assert result['Diag_T3'] == 'Derecha'
    # etc.

Caso 3: Sujeto con Genu Valgo

def test_genu_valgo():
    result = analyze_pelvis_miembro_inferior()
    assert result['DistanciaMaleolos'] > result['DistanciaCondilos']
    assert result['diag_miembro_inferior'] == 'Genu Valgo'

Fin del Documento

Este documento debe ser actualizado con cada nuevo marcador, cálculo o diagnóstico agregado al sistema.