
    eg,                         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	c m
Z d dlmZ d dlmZ d dlmZ d Z G d d      Zy)    N)cm)ImageSequenceClipc                    t        j                  |       }|j                         st        d       ng }|j                         rq|j	                         \  }}|dk(  rG|j                  t        j                  t        j                  |t         j                                     nn|j                         rq|j                          t        j                        S )NzError opening video fileT)cv2VideoCaptureisOpenedprintreadappendnparraycvtColorCOLOR_BGR2RGBreleasestack)pathcapframesretframes        W/home/cameronsmith/repos/flowmap++/third_party/co-tracker/cotracker/utils/visualizer.pyread_video_from_pathr      s    


4
 C<<>()llnJCd{bhhs||E3;L;L'MNO lln 	88F    c                      e Zd Z	 	 	 	 	 	 	 	 ddedededededededef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Z	ddZ
	 	 	 	 	 d dej                  dej                  dej                  dej                  def
dZ	 d!dej                  dej                  dej                  defdZdej                  dej                  fdZy
)"
Visualizersave_dir	grayscale	pad_valuefpsmode	linewidthshow_first_frametracks_leave_tracec	                     || _         || _        |dk(  rt        j                  d      | _        n|dk(  rt        j                  |      | _        || _        || _        || _        || _        || _	        || _
        y )Nrainbowgist_rainbowcool)r    r   r   get_cmap	color_mapr"   r   r#   r   r!   r   )	selfr   r   r   r   r    r!   r"   r#   s	            r   __init__zVisualizer.__init__%   sm     	 9[[8DNV^[[.DN 0""4""r   Nvideotracks
visibility	gt_tracks	segm_maskfilenamestepquery_frame
save_videocompensate_for_camera_motionc           	      *   |r|J |K|d|	f   j                         j                         }|d|	f   |d d df   |d d df   f   j                         }t        j                  || j                  | j                  | j                  | j                  fdd      }|| j                  z   }| j
                  r1t        j                         } ||      }|j                  ddddd      }| j                  ||||||	|      }|
r| j                  ||||       |S )Nr      constant      )r,   r-   r.   r0   r/   r3   r5   )r1   writerr2   )roundlongFpadr   r   
transforms	Grayscalerepeatdraw_tracks_on_videor4   )r*   r,   r-   r.   r/   r0   r1   r;   r2   r3   r4   r5   coords	transform	res_videos                  r   	visualizezVisualizer.visualize=   s(    ((( A{N+11388:F!![.1&A,q!t2LMRRTI^^T^^T^^T^^L	
 $..(>>",,.Ie$ELLAq!Q/E--!#)E . 
	 OOIdOSr   c                 n   |@|j                  | d|j                  t        j                        || j                         y t        j                  | j                  d       t        |j                  d            }|D cg c]4  }|d   j                  ddd      j                         j                         6 }}t        |dd | j                  	      }t
        j                  j                  | j                  | d
      }|j!                  |d| j                  d        t#        d|        y c c}w )N_pred_track)global_stepr   T)exist_okr7   r      )r   z_pred_track.mp4libx264)codecr   loggerzVideo saved to )	add_videototorchuint8r   osmakedirsr   listunbindpermutecpunumpyr   r   joinwrite_videofiler	   )	r*   r,   r1   r;   r2   	wide_listwideclip	save_paths	            r   r4   zVisualizer.save_videok   s   *K(% HH	   KK5U\\!_-ILUVDaAq1557==?VIV$Yq_$((CD T]]xj4PQI  )RV WOI;/0 Ws   9D2c           
      2   |j                   \  }}	}
}}|j                   \  }}}}|dk(  sJ |
dk(  sJ |d   j                  dddd      j                         j                         j	                         j                         }|d   j                         j                         j	                         j                         }|/|d   j                         j	                         j                         }g }|D ]!  }|j                  |j                                # t        j                  |	|df      }| j                  dk(  r t        j                  |||   d    z
        }n|| j                  dk(  r||d d df   j                         ||d d df   j                         }}t!        j"                  ||      }t%        |      D ]\  }| j'                   ||||df               }t        j(                  |d d       d    dz  }t        j*                  ||	d      |d d |f<   ^ nt%        |	      D ]M  }t        j(                  | j'                  ||	z        d d       d    dz  }t        j*                  ||d      ||<   O n| j                  dk(  rd|d d |dk  d d f<   |d|dkD  df   j                         |d|dkD  df   j                         }}t!        j"                  ||      }t%        |      D ]e  }||   dkD  s| j'                   ||d|df               }t        j(                  |d d       d    dz  }t        j*                  ||	d      |d d |f<   g n|j	                         }t        j                  |j                   d   dft        j,                  	      }t        j(                  | j'                  d
      d d       dz  ||dkD  <   t        j(                  | j'                  d      d d       dz  ||dk  <   t        j*                  |d    |	d      }| j.                  dk7  rt%        d|	      D ]  }| j.                  dk\  rt        d|| j.                  z
        nd}|||dz    }|||dz    }|rR|||dz   |dk  f   |||dz   |dk  f   z
  j1                  d      d d d f   }||z
  }|d d |dkD  f   }|d d |dkD  f   }| j3                  ||   ||      ||<   || j5                  ||   |||dz          ||<    t%        |	      D ]  }t%        |      D ]  }|||df   |||df   f}d}||d||f   }|d   dk7  s(|d   dk7  s1|r|s6||   dkD  s?t7        j8                  ||   |t;        | j<                  dz        |||f   j?                         |rdnd         | j@                  dkD  r|d   g| j@                  z  |dd  z   }tC        jD                  t        jF                  |            j                  dddd      d    j                         S )NrL   r:   r   r7   optical_flowr%   r9   )axis)dtypeg      ?g     o@        TrM   )	thickness)$shaperY   bytedetachrZ   r[   r=   r   copyr   zerosr    flow_visflow_to_colorminmaxplt	Normalizeranger)   r   rB   float32r#   mean_draw_pred_tracks_draw_gt_tracksr   circleintr!   tolistr"   rS   
from_numpyr   ) r*   r,   r-   r.   r0   r/   r3   r5   BTCHW_NDrF   rgbvector_colorsy_miny_maxnormncolort	first_indcurr_trackscurr_colorsdifficoordvisibiles                                    r   rC   zVisualizer.draw_tracks_on_video   sh    1aA\\
1aAvAva  Aq!,113::<@@BHHJ!((*..0668 !!++-11399;I	  	)CSXXZ(	) !Q+99&$226F;<OPT<U3UVMyyI%;1,-113;1,-113  }}UE2q FA NN4{Aq7H0I+JKEHHU2AY/5;E*,))E11*EM!Q$'F q CAHHT^^AE%:2A%>?EKE')yy'BM!$C yyI%69aa23 1i!mQ./3351i!mQ./335  }}UE2q JA |a' $tF1a7O/D E "r 3D 9C ?.0iiqq.Iad+	J &MMO	)//!"4a!8

K')xxs0CBQ0G'H5'Pi!m$(*1DRa1H(IE(Qi1n% "		%+qq A ""a'1a[  ..!3 1t6667 
 %YQ7+IA>/y1q50)q.@A QUIN!:;<d1gag'D
 #."4K"-aQ.>"?K"-aQ.>"?K#55aL 	!
 (#'#7#7!!i	AE&B$IaL1: q 	A1X 1a&Aq/:))!Q'2H8q=U1X]7419I 

%aL! 23)!Q$/668,4b ;	*   1$"1)>)>>12NI 34<<Q1aHNSSUUr   r   r   alphac           
      <   |j                   \  }}}t        |dz
        D ]  }||   }	|j                         }
||z  dz  }t        |      D ]  }t        |||df         t        |||df         f}t        ||dz   |df         t        ||dz   |df         f}|d   dk7  sV|d   dk7  s_t	        j
                  ||||	|   j                         | j                  t        j                          | j                  dkD  st	        j                  |||
d|z
  d      } |S )Nr7   rL   r   )rh   rs   rk   ry   r   linerz   r!   LINE_AAr#   addWeighted)r*   r   r-   r   r   r}   r   r   svector_colororiginalr   coord_ycoord_xs                 r   rv   zVisualizer._draw_pred_tracks   s4    ,,1aq1u 	JA(+LxxzHUqLE1X vaAg/VAq!G_1EFva!eQk23SAq!9L5MN1:?wqzQHH$Q..0	 &&*ooc5(AIqI#	J$ 
r   c           
         |j                   \  }}}t        j                  d      }t        |      D ]*  }t        |      D ]  }||   |   }|d   dkD  s|d   dkD  s| j                  dz  }	t        |d         |	z   t        |d         |	z   f}
t        |d         |	z
  t        |d         |	z
  f}t        j                  ||
||| j                  t        j                         t        |d         |	z
  t        |d         |	z   f}
t        |d         |	z   t        |d         |	z
  f}t        j                  ||
||| j                  t        j                          - |S )N)g     `j@rf   rf   r   r7   r:   )	rh   r   r   rs   r!   ry   r   r   r   )r*   r   r/   r}   r   r   r   r   r   lengthr   r   s               r   rw   zVisualizer._draw_gt_tracks  sg   
 //1a*+q 	A1X %aLO	Q<!#	!q(8!^^a/F"9Q<0693y|;Lv;UVG"9Q<0693y|;Lv;UVGHH  #9Q<0693y|;Lv;UVG"9Q<0693y|;Lv;UVGHH#	4 
r   )z	./resultsFr   
   r%   rL   r   r   )	NNNr,   Nr   r   TF)Nr   )NNNr   F)g      ?)__name__
__module____qualname__strboolry   r+   rS   TensorrG   r4   rC   r   ndarrayfloatrv   rw    r   r   r   r   $   s    $ ""#  	
      8 $("&"&-2,||, , LL	,
 <<, <<, , , , , '+,\10 $("&%*zV||zV zV LL	zV
 <<zV zVB ZZ 

 zz	
 :"ZZ" ::"r   r   )rU   r[   r   r   rS   rm   
matplotlibr   torch.nn.functionalnn
functionalr>   torchvision.transformsr@   moviepy.editorr   matplotlib.pyplotpyplotrq   r   r   r   r   r   <module>r      s9    
  
      + ,  V Vr   