o
    oi                     @   s   d dl mZmZmZ d dlZd dlmZmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ G d	d
 d
eZdS )    )DictOptionalTupleN)ModuleTensor)DescriptorMatcherGFTTAffNetHardNetLocalFeatureMatcherLoFTR)LocalFeature)transform_points)RANSAC)warp_perspectivec                       s   e Zd ZdZ				ddee dee dee deddf
 fd	d
Ze	de
jfddZe	de
jfddZe
 deddfddZdddZdeeef fddZdedeeef fddZdedeeef fddZdedeeef fddZ  ZS )HomographyTrackera  Perform local-feature-based tracking of the target planar object in the sequence of the frames.

    Args:
        initial_matcher: image matching module, e.g. :class:`~kornia.feature.LocalFeatureMatcher`
                          or :class:`~kornia.feature.LoFTR`. Default: :class:`~kornia.feature.GFTTAffNetHardNet`.
        fast_matcher: fast image matching module, e.g. :class:`~kornia.feature.LocalFeatureMatcher`
                          or :class:`~kornia.feature.LoFTR`. Default: :class:`~kornia.feature.DescriptorMatcher`.
        ransac: homography estimation module. Default: :class:`~kornia.geometry.RANSAC`.
        minimum_inliers_num: threshold for number inliers for matching to be successful.

    N   initial_matcherfast_matcherransacminimum_inliers_numreturnc                    s   t    |pttdtdd| _|ptd| _|p#tdddddd	| _	|| _
|  i | _i | _d | _d
| _d
| _d
| _|   d S )Ni  smnngffffff?outdoor
homographyg      @i   
   )inl_th
batch_sizemax_itermax_lo_itersr   )super__init__r	   r   r   r   r
   r   r   r   r   target_initial_representationtarget_fast_representationprevious_homographyinliers_numkeypoints0_numkeypoints1_numreset_tracking)selfr   r   r   r   	__class__ R/home/ubuntu/.local/lib/python3.10/site-packages/kornia/tracking/planar_tracker.pyr   +   s   
zHomographyTracker.__init__c                 C      | j jS N)targetdevicer'   r*   r*   r+   r/   F      zHomographyTracker.devicec                 C   r,   r-   )r.   dtyper0   r*   r*   r+   r2   J   r1   zHomographyTracker.dtyper.   c                 C   sn   || _ i | _i | _t| jdrt| jjtr| j|| _t| jdr3t| jjtr5| j|| _d S d S d S )Nextract_features)	r.   r    r!   hasattrr   
isinstancer3   r   r   )r'   r.   r*   r*   r+   
set_targetN   s   zHomographyTracker.set_targetc                 C   s
   d | _ d S r-   )r"   r0   r*   r*   r+   r&   Z   s   
z HomographyTracker.reset_trackingc                 C   s,   d| _ d| _d| _tjdd| j| jddfS )Nr      )r/   r2   F)r#   r$   r%   torchemptyr/   r2   r0   r*   r*   r+   no_match]   s   zHomographyTracker.no_matchxc           
      C   s   | j |d}| j D ]\}}||| d< q| |}|d |d dk }|d |d dk }t|| _t|| _| j| jk rD|  S | 	||\}}	|	
  | _| j| jk r]|  S | | _|dfS )zBMatch the frame `x` with initial_matcher and verified with ransac.image0image10
keypoints0batch_indexesr   
keypoints1T)r.   r    itemsr   lenr$   r%   r   r:   r   sumitemr#   cloner"   )
r'   r;   
input_dictkv
match_dictr@   rB   Hinliersr*   r*   r+   match_initialc   s    



zHomographyTracker.match_initialc                 C   s~  | j dur| j  d }|ddddddf d |ddddddf< |dddddf  d8  < t|}| jjdd \}}t||||f}| j|d}| j D ]\}}	|	|| d< qW| 	|}
|
d |
d	 dk }|
d
 |
d	 dk }t
||}t|| _t|| _| j| jk r|   |  S | ||\}}|  | _| j| jk r|   |  S | | _ |dfS )zPrewarp the frame `x` according to the previous frame homography.

        Matched with fast_matcher verified with ransac.
        Nr      g?g      $@r<   r?   r@   rA   rB   T)r"   rG   r8   inverser.   shaper   r!   rC   r   r   rD   r$   r%   r   r&   r:   r   rE   rF   r#   )r'   r;   HwarpHinvhwframe_warpedrH   rI   rJ   rK   r@   rB   rL   rM   r*   r*   r+   track_next_frame}   s4   
4





z"HomographyTracker.track_next_framec                 C   s   | j d ur
| |S | |S r-   )r"   rW   rN   )r'   r;   r*   r*   r+   forward   s   


zHomographyTracker.forward)NNNr   )r   N)__name__
__module____qualname____doc__r   r   r   intr   propertyr8   r/   r2   no_gradr   r6   r&   r   boolr:   rN   rW   rX   __classcell__r*   r*   r(   r+   r      s8    
"'r   )typingr   r   r   r8   kornia.corer   r   kornia.featurer   r   r	   r
   kornia.feature.integratedr   kornia.geometry.linalgr   kornia.geometry.ransacr   kornia.geometry.transformr   r   r*   r*   r*   r+   <module>   s   