U
    h3                     @   s`   d dl Z d dlZd dlZd dlmZ dd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd ZdS )    N)	transformc                 C   s   |}t |tj d }tj|d}|d | }|d | }	tjd| d|	 fd}
tj|d}tj|d |d fd}||
 | | }|jdd }tj| |||fd	d
}||fS )Ng     f@)scaler      )translation)rotation   g        )ZborderValue)floatnppitransZSimilarityTransformparamscv2Z
warpAffine)datacenterZoutput_sizer   r   Zscale_ratioZrott1Zcxcyt2t3Zt4tMZcropped r   ?/tmp/pip-unpacked-wheel-5oclok7i/insightface/utils/transform.pyr      s$    
 r   c                 C   sl   t j| jt jd}t| jd D ]F}| | }t j|d |d dgt jd}t ||}|dd ||< q |S )Nshapedtyper   r         ?r   r   )r
   zerosr   float32rangearraydot)ptsr   new_ptsiptnew_ptr   r   r   trans_points2d   s    r(   c                 C   s   t |d d |d d  |d d |d d   }t j| jt jd}t| jd D ]f}| | }t j|d |d dgt jd}t ||}|dd || dd< | | d | || d< qV|S )Nr   r   r   r   r   r   )r
   sqrtr   r   r   r    r!   r"   )r#   r   r   r$   r%   r&   r'   r   r   r   trans_points3d&   s    6r*   c                 C   s&   | j d dkrt| |S t| |S d S )Nr   r   )r   r(   r*   )r#   r   r   r   r   trans_points5   s    
r+   c                 C   s6   t | t | jd dgf}t j||d j}|S )z Using 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
   ZhstackZonesr   linalgZlstsqT)XYZX_homoPr   r   r   estimate_affine_matrix_3d23d;   s    r1   c           	      C   s   | dddf }| ddddf }| ddddf }t j|t j| d }|t j| }|t j| }t ||}t |||fd}|||fS )z decompositing 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,   ZnormZcrossZconcatenate)	r0   r   ZR1ZR2sZr1Zr2Zr3Rr   r   r   P2sRtG   s    	r5   c           	      C   s   t | d | d  | d | d   }|dk }|snt | d | d }t | d  |}t | d | d }n,t | d  | d }t | d  |}d	}|d
 tj |d
 tj |d
 tj   }}}|||fS )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      )mathr)   atan2r
   r   )	r4   ZsyZsingularxyzrxZryZrzr   r   r   matrix2angle[   s    	&.r=   )r   r7   Znumpyr
   Zskimager   r   r(   r*   r+   r1   r5   r=   r   r   r   r   <module>   s   