
    h3                     R    S SK r S SKrS SKrS SKJr  S rS rS rS r	S r
S rS	 rg)
    N)	transformc                    Un[        U5      [        R                  -  S-  n[        R                  " US9nUS   U-  nUS   U-  n	[        R                  " SU-  SU	-  4S9n
[        R                  " US9n[        R                  " US-  US-  4S9nXz-   U-   U-   nUR
                  SS n[        R                  " U XU4S	S
9nX4$ )Ng     f@)scaler      )translation)rotation   g        )borderValue)floatnppitransSimilarityTransformparamscv2
warpAffine)datacenteroutput_sizer   r	   scale_ratiorott1cxcyt2t3t4tMcroppeds                   U/var/www/fran/franai/venv/lib/python3.13/site-packages/insightface/utils/transform.pyr   r      s    K
/BEE
!E
)C		"	"	5B	[	 B	[	 B		"	"Rb/A	BB		"	"C	0B		"	"a0;a0A 
BB
"rA	1AnnTk :),.G :    c                 8   [         R                  " U R                  [         R                  S9n[	        U R                  S   5       HP  nX   n[         R
                  " US   US   S/[         R                  S9n[         R                  " X5      nUSS X#'   MR     U$ )Nshapedtyper   r         ?r'   r
   )r   zerosr&   float32rangearraydot)ptsr    new_ptsiptnew_pts         r"   trans_points2dr4      s}    hhSYYbjj9G399Q< V2a5"Q%,BJJ?"Aa[
 ! Nr#   c                    [         R                  " US   S   US   S   -  US   S   US   S   -  -   5      n[         R                  " U R                  [         R                  S9n[        U R                  S   5       Hb  nX   n[         R                  " US   US   S/[         R                  S9n[         R                  " X5      nUSS X4   SS& X   S   U-  X4   S'   Md     U$ )Nr   r   r%   r(   r)   r
   )r   sqrtr*   r&   r+   r,   r-   r.   )r/   r    r   r0   r1   r2   r3   s          r"   trans_points3dr7   &   s    GGAaDGad1g%!Q!A$q'(99:EhhSYYbjj9G399Q< V2a5"Q%,BJJ?" 1+
1Qq	E)
1 ! Nr#   c                 T    U R                   S   S:X  a  [        X5      $ [        X5      $ )Nr   r
   )r&   r4   r7   )r/   r    s     r"   trans_pointsr9   5   s(    
yy|qc%%c%%r#   c                     [         R                  " U [         R                  " U R                  S   S/5      45      n[         R                  R                  X!5      S   R                  nU$ )zUsing least-squares solution 
Args:
    X: [n, 3]. 3d points(fixed)
    Y: [n, 3]. corresponding 3d points(moving). Y = PX
Returns:
    P_Affine: (3, 4). Affine camera matrix (the third row is [0, 0, 0, 1]).
r   r   )r   hstackonesr&   linalglstsqT)XYX_homoPs       r"   estimate_affine_matrix_3d23drD   ;   sN     YY277AGGAJq>234F
		"1%''AHr#   c                    U SS2S4   nU SS2SS24   nU SS2SS24   n[         R                  R                  U5      [         R                  R                  U5      -   S-  nU[         R                  R                  U5      -  nU[         R                  R                  U5      -  n[         R                  " XV5      n[         R                  " XVU4S5      nXHU4$ )zdecompositing camera matrix P
Args: 
    P: (3, 4). Affine Camera Matrix.
Returns:
    s: scale factor.
    R: (3, 3). rotation matrix.
    t: (3,). translation. 
N   r   r   r
   g       @)r   r=   normcrossconcatenate)	rC   r   R1R2sr1r2r3Rs	            r"   P2sRtrQ   G   s     	
!Q$A	
1Q37B	
1Q37B		biinnR0	0#5A	BIINN2	B	BIINN2	B	"	B
|Q'A7Nr#   c                    [         R                  " U S   U S   -  U S   U S   -  -   5      nUS:  nU(       dV  [         R                  " U S   U S   5      n[         R                  " U S   * U5      n[         R                  " U S   U S   5      nO;[         R                  " U S   * U S   5      n[         R                  " U S   * U5      nS	nUS
-  [        R                  -  US
-  [        R                  -  US
-  [        R                  -  pnXgU4$ )z}get three Euler angles from Rotation Matrix
Args:
    R: (3,3). rotation matrix
Returns:
    x: pitch
    y: yaw
    z: roll
)r   r   )r   r   gư>)r
   r   )r
   r
   )r
   r   )r   r
   )r   r   r      )mathr6   atan2r   r   )	rP   sysingularxyzrxryrzs	            r"   matrix2angler^   [   s     
1S6AcF?afqvo5	6BDyHJJqv#'JJ#w#JJqvqv&JJ#w#'JJ#w# 3ruuaeBEEk1S5;BB2:r#   )r   rT   numpyr   skimager   r   r4   r7   r9   rD   rQ   r^    r#   r"   <module>rb      s4    
   &&	&
(r#   