o
    oi                     @   s   d dl Z d dlmZmZmZ d dlZd dlmZmZm	Z	m
Z
mZ d dlmZ d dlmZ dededed	ejd
eee ef f
ddZdedeee ef d
efddZdedededed
ef
ddZdS )    N)ListTupleUnion)DeviceTensorcossinstack)PinholeCamera)quaternion_to_rotation_matrixcameras_pathimages_pathdevicedtypereturnc           "         s6  t | }dd |D }W d   n1 sw   Y  G dd d  fdd|D t |}dd dd	 |D D }W d   n1 sFw   Y  t|}|d
krWtdg }g }g }	g }
|D ]f}|d}t|dk rutd| tt|dd \}}}}tt|dd \}}}t|d d }|d }|tkrtd|d  d| || || |	||||g |
|||g qatj	|	||d}tj	|
||d}t
|}tjd||dd
|dd}||ddddddf< ||dddddf< tj	fdd|D ||d}tj	fdd|D ||d}tj	fdd|D ||d}tj	fdd|D ||d}tjd||dd
|dd}||ddd
d
f< ||ddddf< ||ddd
df< ||ddddf< tj	fdd|D |d}tj	fdd|D |d} t|||| }!||!fS ) a  Parse colmap output to create an PinholeCamera for aligned scene cameras.

    Args:
        cameras_path: Path to camera.txt Colmap file with camera intrinsics: str
        images_path: Path to images.txt Colmap file with camera extrinsics for each image: str
        device: device for created camera object: Union[str, torch.device]
        dtype: Intrinsics and extrinsics dtype.

    Returns:
        image names: List[str]
        scene camera object: PinholeCamera

    c                 S   s   g | ]}| d s| qS )#
startswithstrip.0line r   L/home/ubuntu/.local/lib/python3.10/site-packages/kornia/nerf/camera_utils.py
<listcomp>.   s    z'parse_colmap_output.<locals>.<listcomp>Nc                   @   s   e Zd ZdeddfddZdS )z)parse_colmap_output.<locals>.CameraParamsr   r   Nc                 S   s  | d}t|dk rtd| |d }|dkrCt|d | _t|d | _t|d | _| j| _t|d	 | _	t|d
 | _
d S |dkrt|dk rTtd| t|d | _t|d | _t|d | _t|d	 | _t|d
 | _	t|d | _
d S td| )N    zInvalid camera line:    SIMPLE_PINHOLE               PINHOLE   zInvalid PINHOLE camera line: zUnsupported camera model: )splitlen
ValueErrorintwidthheightfloatfxfycxcy)selfr   
split_linemodelr   r   r   __init__1   s*   
z2parse_colmap_output.<locals>.CameraParams.__init__)__name__
__module____qualname__strr4   r   r   r   r   CameraParams0   s    r9   c                    s   g | ]} |qS r   r   r   )r9   r   r   r   I   s    c                 S   s   g | ]	}| d r|qS ))jpgpng)endswith)r   strippedr   r   r   r   K   s    c                 s   s"    | ]}| d s| V  qdS )r   Nr   r   r   r   r   	<genexpr>M   s     z&parse_colmap_output.<locals>.<genexpr>r   z#No valid images found in images.txtr   
   zInvalid image line: r   r"   r%   	   zInvalid camera index z for image )r   r   r!   r    c                       g | ]} | j qS r   )r-   r   icameras_paramsr   r   r   k       c                    rA   r   )r.   rB   rD   r   r   r   l   rF   c                    rA   r   )r/   rB   rD   r   r   r   m   rF   c                    rA   r   )r0   rB   rD   r   r   r   n   rF   r   c                    rA   r   )r+   rB   rD   r   r   r   t   rF   r   c                    rA   r   )r*   rB   rD   r   r   r   u   rF   )openr'   r(   r&   mapr,   r)   appendtorchtensorr   eye	unsqueezerepeatr
   )"r   r   r   r   flines
num_images	img_namescamera_inds
quats_listts_listr   r2   qwqxqyqztxtytz
camera_indimg_namequatstsRs
extrinsicsfxsfyscxscys
intrinsicsheightswidthscamerasr   )r9   rE   r   parse_colmap_output   sn   




  rl   rk   
camera_idsc                 C   s6   | j | }| j| }| j| }| j| }t||||S )a?  Take a PinholeCamera camera and camera indices to create a new PinholeCamera for requested cameras.

    Args:
        cameras: Scene camera object: PinholeCamera
        camera_ids: List of camera indices to copy: List[int]

    Return:
        A new PinholeCamera object with a sub-set of cameras: PinholeCamera

    )rh   rc   r+   r*   r
   )rk   rm   rh   rc   r+   r*   r   r   r   cameras_for_ids   s
   



rn   rad	num_viewsnum_circlesc                 C   s  | j ddd}| jj}tjddtj | ||d}t	|| }t
| | }t
d|  | }	tj|ddt|||	fd }
| jdd	|d
d
}| jdd	|d
d
}|}|
|dddddf< tj| jd g| |d}tj| jd g| |d}t||||S )ac  Create a PinholeCamera object with cameras that follow a spiral path.

    Used for novel view synthesis for face facing models.

    Args:
        cameras: Scene cameras used to train the NeRF model: PinholeCamera
        rad: Spiral radius: float
        num_views: Number of created cameras: int
        num_circles: Number of spiral circles: int

    r   Fr   rG   g      ?)dim)r   r   Tr   Nr    )translation_vectormeansqueezerh   r   rK   linspacemathpir   r   rN   r	   permuterO   rc   rL   r+   r*   r
   )rk   ro   rp   rq   mean_centerr   tcos_tsin_tsin_05trt   mean_intrinsicsmean_extrinsicsrc   r+   r*   r   r   r   create_spiral_path   s   "r   )rx   typingr   r   r   rK   kornia.corer   r   r   r   r	   kornia.geometry.camerar
   kornia.geometry.conversionsr   r8   r   rl   r)   rn   r,   r   r   r   r   r   <module>   s&   
"c"