B
    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   sr   t | }| std nLg }x>| r^| \}}|dkrZ|tt |t j	 q"P q"W |
  t|S )NzError opening video fileT)cv2VideoCaptureisOpenedprintreadappendnparraycvtColor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eeeeeeeeddd	Zdejejejejejeeeeed
ddZ	dddZ
dejejejejedddZd ejejejedddZejejdddZd
S )!
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r6t|| _|| _|| _|| _|| _|| _	|| _
d S )Nr   gist_rainbowcool)r!   r   r   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)
r+   tracks
visibility	gt_tracks	segm_maskfilenamestepquery_frame
save_videocompensate_for_camera_motionc          	   C   s   |r|d k	st |d k	r\|d|	f   }|d|	f |d d df |d d df f  }t|| j| j| j| jfdd}|| j }| jrt }||}|	ddddd}| j
||||||	|d}|
r| j||||d |S )Nr      constant      )r+   r,   r-   r/   r.   r2   r4   )r0   writerr1   )AssertionErrorroundlongFpadr   r   
transforms	Grayscalerepeatdraw_tracks_on_videor3   )r)   r+   r,   r-   r.   r/   r0   r9   r1   r2   r3   r4   coords	transform	res_videor   r   r   	visualize=   s4    0
zVisualizer.visualizec             C   s   |d k	r,|j | d|tj|| jd nzt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_okr5   c             S   s&   g | ]}|d   ddd   qS )r   r5   r   )permutecpunumpy).0wider   r   r   
<listcomp>v   s    z)Visualizer.save_video.<locals>.<listcomp>r   )r    z_pred_track.mp4libx264)codecr    loggerzVideo saved to )Z	add_videototorchuint8r    osmakedirsr   listunbindr   r   joinwrite_videofiler   )r)   r+   r0   r9   r1   Z	wide_listclip	save_pathr   r   r   r3   k   s    
zVisualizer.save_video)r+   r,   r-   r/   r2   c           	   C   sl  |j \}}	}
}}|j \}}}}|dks*t|
dks6t|d dddd    }|d     }|d k	r|d    }g }x|D ]}||	  qW t
|	|df}| jdkrt||| d   }nT|d kr| jdkr||d d df  ||d d df   }}t||}xt|D ]T}| ||||df }t
|d d d  d }t
j||	dd|d d |f< q<W nLxJt|	D ]>}t
| ||	 d d d  d }t
j||dd||< qW nP| jdkrd|d d |dkd d f< |d|dkdf  |d|dkdf   }}t||}xt|D ]b}|| dkrP| ||d|df }t
|d d d  d }t
j||	dd|d d |f< qPW 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rRxtd|	D ]}| jdkrpt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 k	rP| || |||d  ||< qPW xt|	D ]}xt|D ]}|||df |||df f}d}|d k	r|d||f }|d dkrj|d dkrj|r|rj|| dkrjtj|| |t| jd |||f   |rdndd qjW q\W | j!dkrH|d g| j! |dd   }t"#t
$|ddddd   S )Nr   r8   r   r5   optical_flowr   r7   )axis)dtypeg      ?g     o@g        TrN   )	thickness)%shaper:   rH   bytedetachrI   rJ   r<   r	   copyr
   zerosr!   flow_visflow_to_colorminmaxplt	Normalizeranger(   r   rA   float32r$   mean_draw_pred_tracks_draw_gt_tracksr   circleintr"   tolistr#   rS   
from_numpyr   ) r)   r+   r,   r-   r/   r.   r2   r4   BTCHW_NDrE   rgbvector_colorsZy_miny_maxnormncolortZ	first_indZcurr_tracksZcurr_colorsdifficoordZvisibiler   r   r   rB      s    
$


$$$$$

"
zVisualizer.draw_tracks_on_video      ?)r}   r,   r~   alphac          
   C   s   |j \}}}xt|d D ]}|| }	| }
|| d }xt|D ]}t|||df t|||df f}t||d |df t||d |df f}|d dkrD|d dkrDt||||	|  | jtj qDW | j	dkrt
|||
d| d}qW |S )Nr5   r   r   )ra   rl   rd   rr   r   liners   r"   LINE_AAr$   addWeighted)r)   r}   r,   r~   r   rv   r{   rz   sZvector_colororiginalr   coord_ycoord_xr   r   r   ro      s&    $,

zVisualizer._draw_pred_tracks)r}   r.   c          
   C   s  |j \}}}td}x t|D ]}xt|D ]}|| | }|d dkr0|d dkr0| 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 q0W q"W |S )N)g     `j@g        g        r   r5   r8   )	ra   r
   r   rl   r"   rr   r   r   r   )r)   r}   r.   rv   r{   rz   r   r   r   lengthr   r   r   r   r   rp     s4    

    zVisualizer._draw_gt_tracks)r   Fr   r   r   r   r   r   )	NNNr+   Nr   r   TF)Nr   )NNNr   F)r   )__name__
__module____qualname__strboolrr   r*   rS   TensorrF   r3   rB   r
   ndarrayfloatro   rp   r   r   r   r   r   $   s4                  ,"
     yr   )rU   rJ   r
   r   rS   rf   
matplotlibr   Ztorch.nn.functionalnn
functionalr=   torchvision.transformsr?   Zmoviepy.editorr   matplotlib.pyplotpyplotrj   r   r   r   r   r   r   <module>   s   