o
    IHe,                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	  m
Z d dlmZ d dlmZ d dlmZ dd ZG dd dZdS )    N)cm)ImageSequenceClipc                 C   st   t | }| std n'g }| r1| \}}|dkr,|tt |t j	 nn| s|
  t|S )NzError opening video fileT)cv2ZVideoCaptureZisOpenedprintreadappendnparrayZcvtColorZCOLOR_BGR2RGBreleasestack)pathcapframesretframe r   E/home/camsmith/repos/flowmap/co-tracker/cotracker/utils/visualizer.pyread_video_from_path   s   


r   c                   @   s  e Zd Z								d+deded	ed
ededededefddZ									d,dejdejdejdejdejdededededefddZ	d-dd Z
					d.dejdejdejdejdef
d!d"Z	#d/d$ejdejd%ejd&efd'd(Zd$ejdejfd)d*ZdS )0
Visualizer	./resultsFr   
   rainbow   save_dir	grayscale	pad_valuefpsmode	linewidthshow_first_frametracks_leave_tracec	           	      C   s^   || _ || _|dkrtd| _n
|dkrt|| _|| _|| _|| _|| _|| _	|| _
d S )Nr   Zgist_rainbowZcool)r   r   r   Zget_cmap	color_mapr   r   r    r   r   r   )	selfr   r   r   r   r   r   r   r    r   r   r   __init__%   s   
zVisualizer.__init__NvideoTtracks
visibility	gt_tracks	segm_maskfilenamestepquery_frame
save_videocompensate_for_camera_motionc              	   C   s   |r|d usJ |d ur.|d|	f    }|d|	f |d d df |d d df f  }t|| j| j| j| jfdd}|| j }| jrWt }||}|ddddd}| j	||||||	|d}|
rn| j
||||d |S )Nr      constant      )r$   r%   r&   r(   r'   r+   r-   )r)   writerr*   )roundlongFpadr   r   
transformsZ	Grayscalerepeatdraw_tracks_on_videor,   )r"   r$   r%   r&   r'   r(   r)   r2   r*   r+   r,   r-   coords	transform	res_videor   r   r   	visualize=   s8   0
	zVisualizer.visualizec                 C   s   |d ur|j | d|tj|| jd d S tj| jdd t|	d}dd |D }t
|dd	 | jd
}tj| j| d}|j|d| jd d td|  d S )NZ_pred_track)Zglobal_stepr   T)exist_okr.   c                 S   s&   g | ]}|d   ddd   qS )r   r.   r   )permutecpunumpy).0Zwider   r   r   
<listcomp>v   s   & z)Visualizer.save_video.<locals>.<listcomp>r   )r   z_pred_track.mp4Zlibx264)codecr   loggerzVideo saved to )Z	add_videototorchuint8r   osmakedirsr   listunbindr   r   joinZwrite_videofiler   )r"   r$   r)   r2   r*   Z	wide_listclipZ	save_pathr   r   r   r,   k   s   

zVisualizer.save_videoc               	   C   sD  |j \}}	}
}}|j \}}}}|dksJ |
dksJ |d dddd    }|d     }|d urG|d    }g }|D ]	}||  qKt	
|	|df}| jdkrot||| d   }n|d u r| jdkr||d d df  ||d d df  }}t||}t|D ])}| ||||df }t	|d d d  d }t	j||	dd|d d |f< qnt|	D ]}t	| ||	 d d d  d }t	j||dd||< qn| jdkrOd|d d |dkd d f< |d|dkdf  |d|dkdf  }}t||}t|D ]1}|| dkrL| ||d|df }t	|d d d  d }t	j||	dd|d d |f< qn?| }t	j
|j d dft	jd	}t	| d
d d d ||dk< t	| dd d d ||dk< t	j|d  |	dd}| jdkrtd|	D ]}| jdkrtd|| j nd}|||d  }|||d  }|r|||d |dkf |||d |dkf  dd d d f }|| }|d d |dkf }|d d |dkf }| || ||||< |d ur| || |||d  ||< qt|	D ]^}t|D ]V}|||df |||df f}d}|d urA|d||f }|d dkrx|d dkrx|r\|rx|| dkrxtj|| |t| jd |||f  |rtdndd q#q| j dkr|d g| j  |dd   }t!"t	#|ddddd   S )Nr   r1   r   r.   Zoptical_flowr   r0   )axis)dtypeg      ?g     o@        TrD   )Z	thickness)$shaper?   bytedetachr@   rA   r4   r   copyr   zerosr   flow_visZflow_to_colorminmaxpltZ	Normalizeranger!   r	   r8   float32r    mean_draw_pred_tracks_draw_gt_tracksr   circleintr   tolistr   rH   
from_numpyr   ) r"   r$   r%   r&   r(   r'   r+   r-   BTCHW_NDr<   rgbvector_colorsy_miny_maxnormncolortZ	first_indZcurr_tracksZcurr_colorsdifficoordZvisibiler   r   r   r9      s   
$

$$$

$zVisualizer.draw_tracks_on_video      ?rm   rn   alphac              
   C   s   |j \}}}t|d D ]k}|| }	| }
|| d }t|D ]F}t|||df t|||df f}t||d |df t||d |df f}|d dkrf|d dkrft||||	|  | jtj q | j	dkrwt
|||
d| d}q|S )Nr.   r   r   )rS   r\   rV   rb   r   linerc   r   LINE_AAr    ZaddWeighted)r"   rm   r%   rn   ry   rf   rk   rj   sZvector_colororiginalrv   coord_ycoord_xr   r   r   r_      s,   $,

zVisualizer._draw_pred_tracksc              
   C   s  |j \}}}td}t|D ]x}t|D ]q}|| | }|d dkr|d dkr| jd }	t|d |	 t|d |	 f}
t|d |	 t|d |	 f}t||
||| jtj t|d |	 t|d |	 f}
t|d |	 t|d |	 f}t||
||| jtj qq|S )N)g     `j@rR   rR   r   r.   r1   )	rS   r   r	   r\   r   rb   r   rz   r{   )r"   rm   r'   rf   rk   rj   rs   rt   rv   lengthr~   r   r   r   r   r`     s<   

    zVisualizer._draw_gt_tracks)r   Fr   r   r   r   r   r   )	NNNr$   Nr   r   TF)Nr   )NNNr   F)rx   )__name__
__module____qualname__strboolrb   r#   rH   Tensorr=   r,   r9   r   ndarrayfloatr_   r`   r   r   r   r   r   $   s    	
	


.
 
r   )rJ   rA   r   r   rH   rX   
matplotlibr   Ztorch.nn.functionalnn
functionalr5   Ztorchvision.transformsr7   Zmoviepy.editorr   matplotlib.pyplotpyplotr[   r   r   r   r   r   r   <module>   s   