
    FPh/                     <    d dl Z d dlZd dlZd dlmZ  G d d      Zy)    N)LOGGERc                   D     e Zd ZdZd fd	ZddZddZddZddZ xZ	S )	GMCa8  
    Generalized Motion Compensation (GMC) class for tracking and object detection in video frames.

    This class provides methods for tracking and detecting objects based on several tracking algorithms including ORB,
    SIFT, ECC, and Sparse Optical Flow. It also supports downscaling of  frames for computational efficiency.

    Attributes:
        method (str): The method used for tracking. Options include 'orb', 'sift', 'ecc', 'sparseOptFlow', 'none'.
        downscale (int): Factor by which to downscale the frames for processing.
        prevFrame (np.array): Stores the previous frame for tracking.
        prevKeyPoints (list): Stores the keypoints from the previous frame.
        prevDescriptors (np.array): Stores the descriptors from the previous frame.
        initializedFirstFrame (bool): Flag to indicate if the first frame has been processed.

    Methods:
        __init__(self, method='sparseOptFlow', downscale=2): Initializes a GMC object with the specified method
                                                              and downscale factor.
        apply(self, raw_frame, detections=None): Applies the chosen method to a raw frame and optionally uses
                                                 provided detections.
        applyEcc(self, raw_frame, detections=None): Applies the ECC algorithm to a raw frame.
        applyFeatures(self, raw_frame, detections=None): Applies feature-based methods like ORB or SIFT to a raw frame.
        applySparseOptFlow(self, raw_frame, detections=None): Applies the Sparse Optical Flow method to a raw frame.
    c                    t         |           || _        t        dt	        |            | _        | j                  dk(  r]t        j                  d      | _        t        j                         | _
        t        j                  t        j                        | _        n| j                  dk(  rct        j                  ddd      | _        t        j                  ddd      | _
        t        j                  t        j                        | _        n| j                  dk(  rCd	}d
}t        j                   | _        t        j$                  t        j&                  z  ||f| _        nJ| j                  dk(  rt+        dddddd      | _        n$| j                  dv rd| _        nt/        d|       d| _        d| _        d| _        d| _        y)z5Initialize a video tracker with specified parameters.   orb   sift   {Gz?)nOctaveLayerscontrastThresholdedgeThresholdecci  gư>sparseOptFlowi  g{Gz?Fg{Gz?)
maxCornersqualityLevelminDistance	blockSizeuseHarrisDetectork)noneNoneNNzError: Unknown GMC method:)super__init__methodmaxint	downscalecv2FastFeatureDetector_createdetector
ORB_create	extractor	BFMatcherNORM_HAMMINGmatcherSIFT_createNORM_L2MOTION_EUCLIDEAN	warp_modeTERM_CRITERIA_EPSTERM_CRITERIA_COUNTcriteriadictfeature_params
ValueError	prevFrameprevKeyPointsprevDescriptorsinitializedFirstFrame)selfr   r   number_of_iterationstermination_eps	__class__s        iC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/trackers/utils/gmc.pyr   zGMC.__init__$   sk   QI/;;%::2>DM ^^-DN==)9)9:DL[[F"OO!tcefDM __1PTdfgDN==5DL[[E!#' "O 11DN 22S5L5LLNbdstDM[[O+"&$4834129>)-#/D [[22DK9&BCC!#%*"    c                     | j                   dv r| j                  ||      S | j                   dk(  r| j                  ||      S | j                   dk(  r| j                  ||      S t	        j
                  dd      S )z=Apply object detection on a raw frame using specified method.)r   r
   r   r      r   )r   applyFeaturesapplyEccapplySparseOptFlownpeye)r6   	raw_frame
detectionss      r:   applyz	GMC.applyN   sm    ;;/)%%i<<[[E!==J77[[O+**9jAA66!Q<r;   c           	         |j                   \  }}}t        j                  |t        j                        }t	        j
                  ddt        j                        }| j                  dkD  rgt        j                  |dd      }t        j                  ||| j                  z  || j                  z  f      }|| j                  z  }|| j                  z  }| j                  s|j                         | _        d| _
        |S 	 t        j                  | j                  ||| j                  | j                  dd	      \  }}|S # t         $ r#}	t#        j$                  d
|	        Y d}	~	|S d}	~	ww xY w)Initialize.r=   r   )dtype      ?)r   r   g      ?TNr   z5WARNING: find transform failed. Set warp as identity )shaper    cvtColorCOLOR_BGR2GRAYrA   rB   float32r   GaussianBlurresizer5   copyr2   findTransformECCr+   r.   	Exceptionr   warning)
r6   rC   rD   heightwidth_frameHcces
             r:   r?   zGMC.applyEccY   s:   $??qY(:(:;FF1arzz* >>C$$UFC8EJJuu'>$..@X&YZET^^+Et~~-F ))"ZZ\DN *.D&H	X**4>>5!T^^UYUbUbdhjklGR   	XNNRSTRUVWW	Xs   <<D: :	E&E!!E&c                 
   |j                   \  }}}t        j                  |t        j                        }t	        j
                  dd      }| j                  dkD  rPt        j                  ||| j                  z  || j                  z  f      }|| j                  z  }|| j                  z  }t	        j                  |      }d|t        d|z        t        d|z        t        d|z        t        d|z        f<   |M|D ]H  }	|	dd | j                  z  j                  t        j                        }
d	||
d
   |
d   |
d	   |
d   f<   J | j                  j                  ||      }| j                  j                  ||      \  }}| j                   sR|j#                         | _        t#        j"                  |      | _        t#        j"                  |      | _        d| _        |S | j*                  j-                  | j(                  |d      }g }g }dt	        j.                  ||g      z  }t1        |      d	k(  rK|j#                         | _        t#        j"                  |      | _        t#        j"                  |      | _        |S |D ]  \  }}|j2                  d|j2                  z  k  s#| j&                  |j4                     j6                  }||j8                     j6                  }|d	   |d	   z
  |d
   |d
   z
  f}t	        j:                  |d	         |d	   k  st	        j:                  |d
         |d
   k  s|j=                  |       |j=                  |        t	        j>                  |d	      }t	        j@                  |d	      }||z
  d|z  k  }g }g }g }tC        t1        |            D ]  }||d	f   s||d
f   s|j=                  ||          |j=                  | j&                  ||   j4                     j6                         |j=                  |||   j8                     j6                          t	        j.                  |      }t	        j.                  |      }t	        jD                  |d	      dkD  rt	        jD                  |d	      t	        jD                  |d	      k(  rft        jF                  ||t        jH                        \  }}| j                  dkD  rD|dxx   | j                  z  cc<   |dxx   | j                  z  cc<   ntK        jL                  d       |j#                         | _        t#        j"                  |      | _        t#        j"                  |      | _        |S )rG   r=   r   rI      r   g\(\?N   r   r   Tg      ?g?g      @r   r=   r   r=   #WARNING: not enough matching points)'rJ   r    rK   rL   rA   rB   r   rO   
zeros_liker   astypeint_r"   detectr$   computer5   rP   r2   r3   r4   r'   knnMatcharraylendistancequeryIdxpttrainIdxabsappendmeanstdrangesizeestimateAffinePartial2DRANSACr   rS   )r6   rC   rD   rT   rU   rV   rW   rX   maskdettlbr	keypointsdescriptors
knnMatchesmatchesspatialDistancesmaxSpatialDistancemnprevKeyPointLocationcurrKeyPointLocationspatialDistancemeanSpatialDistancesstdSpatialDistancesinliersgoodMatches
prevPoints
currPointsis                                r:   r>   zGMC.applyFeaturesy   s   $??qY(:(:;FF1aL >>CJJuu'>$..@X&YZET^^+Et~~-F }}U#[^SD6M 22Cu4Ec$QV,FW4WWX!!BQ$..088A9:T!WT!W_d1gd1go56 " MM((5	 "&!7!7y!I	; ))"ZZ\DN!%9!5D#'99[#9D  *.D&H \\**4+?+?aP
 !BHHeV_$== z?a"ZZ\DN!%9!5D#'99[#9D HDAqzzC!**,,'+'9'9!**'E'H'H$'0'<'?'?$#7#:=QRS=T#T#7#:=QRS=T#T#V FF?1-.1CA1FF 236H6KK$++O<NN1%   "ww'7; ff%5q9#&::cDW>WW

s7|$Aq!t}A""71:.!!$"4"4WQZ5H5H"I"L"LM!!)GAJ,?,?"@"C"CD	 % XXj)
XXj)
0 GGJ"Q&RWWZ-Crwwz[\G]-]44ZSZZXJAw ~~#$4>>)$4>>)NN@A !YYy1#yy5r;   c                 &   |j                   \  }}}t        j                  |t        j                        }t	        j
                  dd      }| j                  dkD  r2t        j                  ||| j                  z  || j                  z  f      }t        j                  |fddi| j                  }| j                  s8|j                         | _        t        j                  |      | _        d| _
        |S t        j                  | j                  || j                  d      \  }	}
}g }g }t        t!        |
            D ]:  }|
|   s	|j#                  | j                  |          |j#                  |	|          < t	        j$                  |      }t	        j$                  |      }t	        j&                  |d      dkD  rt	        j&                  |d      t	        j&                  |d      k(  rft        j(                  ||t        j*                        \  }}| j                  dkD  rD|d	xx   | j                  z  cc<   |d
xx   | j                  z  cc<   nt-        j.                  d       |j                         | _        t        j                  |      | _        |S )rG   r=   r   rI   ru   NTr   r]   r^   r_   r`   )rJ   r    rK   rL   rA   rB   r   rO   goodFeaturesToTrackr0   r5   rP   r2   r3   calcOpticalFlowPyrLKrq   rh   rn   rg   rr   rs   rt   r   rS   )r6   rC   rD   rT   rU   rV   rW   rX   rx   matchedKeypointsstatuserrr   r   r   r   s                   r:   r@   zGMC.applySparseOptFlow   s   $??qY(:(:;FF1aL >>CJJuu'>$..@X&YZE ++ETT@S@ST	 ))"ZZ\DN!%9!5D *.D&H ),(@(@QVX\XjXjlp(q%&# 

s6{#Aay!!$"4"4Q"78!!"21"56 $
 XXj)
XXj)
 GGJ"Q&RWWZ-Crwwz[\G]-]44ZSZZXJAw ~~#$4>>)$4>>)NN@A !YYy1r;   )r   r=   )N)
__name__
__module____qualname____doc__r   rE   r?   r>   r@   __classcell__)r9   s   @r:   r   r      s%    0(+T	 @||7r;   r   )rP   r    numpyrA   ultralytics.utilsr   r    r;   r:   <module>r      s     
  $c cr;   