
    j                     N    d dl mZ d dlmZmZmZ d dlmZ  G d de          ZdS )    )Any)BaseSolutionSolutionAnnotatorSolutionResults)colorsc                   8     e Zd ZdZdeddf fdZdefdZ xZS )QueueManagera6  Manages queue counting in real-time video streams based on object tracks.

    This class extends BaseSolution to provide functionality for tracking and counting objects within a specified region
    in video frames.

    Attributes:
        counts (int): The current count of objects in the queue.
        rect_color (tuple[int, int, int]): BGR color tuple for drawing the queue region rectangle.
        region_length (int): The number of points defining the queue region.
        track_line (list[tuple[int, int]]): List of track line coordinates.
        track_history (dict[int, list[tuple[int, int]]]): Dictionary storing tracking history for each object.

    Methods:
        initialize_region: Initialize the queue region.
        process: Process a single frame for queue management.
        extract_tracks: Extract object tracks from the current frame.
        store_tracking_history: Store the tracking history for an object.
        display_output: Display the processed output.

    Examples:
        >>> cap = cv2.VideoCapture("path/to/video.mp4")
        >>> queue_manager = QueueManager(region=[100, 100, 200, 200, 300, 300])
        >>> while cap.isOpened():
        ...     success, im0 = cap.read()
        ...     if not success:
        ...         break
        ...     results = queue_manager.process(im0)
    kwargsreturnNc                      t                      j        di | |                                  d| _        d| _        t          | j                  | _        dS )z`Initialize the QueueManager with parameters for tracking and counting objects in a video stream.r   )   r   r   N )super__init__initialize_regioncounts
rect_colorlenregionregion_length)selfr
   	__class__s     k/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/ultralytics/solutions/queue_management.pyr   zQueueManager.__init__'   sX    ""6"""   ) --    c           	         d| _         |                     |           t          || j                  }|                    | j        | j        | j        dz             t          | j        | j	        | j
        | j                  D ]\  }}}}|                    ||                     |||          t          |d                     |                     ||           | j                            |g           }d}t%          |          dk    r|d	         }| j        d
k    rJ|rH| j                            |                     | j        d                             r| xj         dz  c_         |                    d| j          | j        | j        d           |                                }	|                     |	           t7          |	| j         t%          | j	                            S )a'  Process queue management for a single frame of video.

        Args:
            im0 (np.ndarray): Input image for processing, typically a frame from a video stream.

        Returns:
            (SolutionResults): Contains processed image `im0`, 'queue_count' (int, number of objects in the queue) and
                'total_tracks' (int, total number of tracked objects).

        Examples:
            >>> queue_manager = QueueManager()
            >>> frame = cv2.imread("frame.jpg")
            >>> results = queue_manager.process(frame)
        r   )
line_width   )reg_ptscolor	thicknessT)labelr   N      zQueue Counts : )h         )pointsregion_color	txt_color)plot_imqueue_counttotal_tracks)r   extract_tracksr   r   draw_regionr   r   zipboxes	track_idsclssconfs	box_labeladjust_box_labelr   store_tracking_historytrack_historygetr   r   r_scontainsPoint
track_linequeue_counts_displayresultdisplay_outputr   )
r   im0	annotatorboxtrack_idclsconfr9   prev_positionr,   s
             r   processzQueueManager.process/   s    C   %cdoFFF	dkTXTcfgTghhh(+DJ	SWS](^(^ 	! 	!$C34+@+@dH+U+U]cdlnr]s]sttt''#666 !.228R@@M !M=!!A%% -b 1!Q&&=&TX=N=NtzzZ^ZijlZmOnOn=o=o&q  	&&+dk++;#	 	' 	
 	
 	
 ""$$G$$$ wDKVYZ^ZhViVijjjjr   )	__name__
__module____qualname____doc__r   r   r   rI   __classcell__)r   s   @r   r	   r	   	   sy         :. . . . . . . ..ko .k .k .k .k .k .k .k .kr   r	   N)	typingr   ultralytics.solutions.solutionsr   r   r   ultralytics.utils.plottingr   r	   r   r   r   <module>rR      s          \ \ \ \ \ \ \ \ \ \ - - - - - -Tk Tk Tk Tk Tk< Tk Tk Tk Tk Tkr   