a
    yf&                     @   s|   d dl mZ d dlZd dlmZmZ d dlmZmZ ed d dl	m
Z
mZmZ G dd dZed	krxd
ddZee dS )    )defaultdictN)check_imshowcheck_requirements)	Annotatorcolorszshapely>=2.0.0)
LineStringPointPolygonc                   @   s:   e Zd ZdZdddZdd	 Zd
d Zdd Zdd ZdS )ObjectCounterz\A class to manage the counting of objects in a real-time video stream based on their tracks.N   FTc                 C   s,  d| _ d| _|du rddgn|| _d| _d| _|| _|| _|| _|| _|| _	d| _
d| _d| _g | _i | _tt| _|| _tdd| _t| jd	krtd
 t| j| _n@t| jdkrtd t| j| _ntd td t| j| _t| jd d | jd d f| jd d | jd d fg| _dS )a  
        Initializes the ObjectCounter with various tracking and counting parameters.

        Args:
            names (dict): Dictionary of class names.
            reg_pts (list): List of points defining the counting region.
            line_thickness (int): Line thickness for bounding boxes.
            view_img (bool): Flag to control whether to display the video stream.
            view_in_counts (bool): Flag to control whether to display the in counts on the video stream.
            view_out_counts (bool): Flag to control whether to display the out counts on the video stream.
            draw_tracks (bool): Flag to control whether to draw the object tracks.
        FN)     )i  r   z!Ultralytics YOLOv8 Object Counterr   T)warnr   zLine Counter Initiated.   zPolygon Counter Initiated.zWInvalid Region points provided, region_points must be 2 for lines or >= 3 for polygons.zUsing Line Counter Now   )
is_drawingselected_pointreg_ptscounting_regionim0tfview_imgview_in_countsview_out_countsnameswindow_name	in_counts
out_counts	count_idsclass_wise_countr   listtrack_historydraw_tracksr   	env_checklenprintr   r	   counting_line_segment)selfr   r   Zline_thicknessr   r   r   r"    r(   `/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/solutions/object_counter.py__init__   s@    
zObjectCounter.__init__c                 C   s   |t jkrrt| jD ]Z\}}t|ttfrt|dkrt||d  dk rt||d  dk r|| _	d| _
 qqnN|t jkr| j
r| j	dur||f| j| j	< t| j| _n|t jkrd| _
d| _	dS )a  
        Handles mouse events for defining and moving the counting region in a real-time video stream.

        Args:
            event (int): The type of mouse event (e.g., cv2.EVENT_MOUSEMOVE, cv2.EVENT_LBUTTONDOWN, etc.).
            x (int): The x-coordinate of the mouse pointer.
            y (int): The y-coordinate of the mouse pointer.
            flags (int): Any associated event flags (e.g., cv2.EVENT_FLAG_CTRLKEY,  cv2.EVENT_FLAG_SHIFTKEY, etc.).
            params (dict): Additional parameters for the function.
        r   r   
   r   TNF)cv2ZEVENT_LBUTTONDOWN	enumerater   
isinstancetupler    r$   absr   r   ZEVENT_MOUSEMOVEr	   r   ZEVENT_LBUTTONUP)r'   eventxyflagsparamsipointr(   r(   r)   mouse_event_for_region[   s(    



z$ObjectCounter.mouse_event_for_regionc                 C   s  t | j| j| j}|j| jd| jd d |d jp<|d j}|rN|jdurN|j	
 }|j
  }|j 
  }t|||D ]\}}}	|j|| j|	 tt|dd | j|	 | jvrddd| j| j|	 < | j| }
|
t|d |d  d t|d	 |d
  d f t|
dkr0|
d | jrT|j|
tt|d| jd t| j| d	krv| j| d nd}t| jd
krF| jt|
d }|durL|rL|| jvrL| j| |d |d  | jjj|d   dkr|  jd	7  _| j| j|	  d  d	7  < n*|  j d	7  _ | j| j|	  d  d	7  < qt| jdkr|dur|| jvrt!|d |d	 f|d |d	 fg"| j#r| j| |d |d  | jjj|d   }|d	 |d	  | jjj$|d	   }|dkr"|dkr"|  jd	7  _| j| j|	  d  d	7  < q|  j d	7  _ | j| j|	  d  d	7  < qi }| j% D ]\}}|d dks|d dkr\| j&s| j'sq\nf| j&sd|d  |t()|< nD| j'sd|d  |t()|< n"d|d  d|d  |t()|< q\|r|*| j|ddd dS )zDExtracts and processes tracks for object counting in a video stream.)h   r   {   r   )r   colorZ	thicknessr   NT)labelr;   )INOUTr   r      )r;   Ztrack_thicknessr=   r>   zOUT zIN z OUT )r9         )   rD   rD   r+   )+r   r   r   r   Zdraw_regionr   ZobbboxesidZxyxycpuclstolistintzipZ	box_labelr   r   r!   appendfloatr$   popr"   Zdraw_centroid_and_tracksr   containsr   r   Zcentroidr2   r   r   r   Z
intersectsr&   r3   itemsr   r   str
capitalizeZdisplay_analytics)r'   tracksZ	annotatorZ
track_datarE   ZclssZ	track_idsboxZtrack_idrH   Z
track_lineZprev_positionZ	is_insideZdxZdyZlabels_dictkeyvaluer(   r(   r)   extract_and_process_tracksz   sx    
 
6
&($""&z(ObjectCounter.extract_and_process_tracksc                 C   sf   | j rbt| j t| jdkr8t| j| jd| ji t| j| j	 t
dd@ tdkrbdS dS )zDDisplays the current frame with annotations and regions in a window.   Zregion_pointsr   rD   qN)r#   r,   ZnamedWindowr   r$   r   ZsetMouseCallbackr8   Zimshowr   ZwaitKeyord)r'   r(   r(   r)   display_frames   s    zObjectCounter.display_framesc                 C   s$   || _ | | | jr|   | j S )z
        Main function to start the object counting process.

        Args:
            im0 (ndarray): Current frame from the video stream.
            tracks (list): List of tracks obtained from the object tracking process.
        )r   rW   r   r[   )r'   r   rS   r(   r(   r)   start_counting   s
    
zObjectCounter.start_counting)Nr   FTTF)	__name__
__module____qualname____doc__r*   r8   rW   r[   r\   r(   r(   r(   r)   r
      s         
I\r
   __main__Zpersoncar)r   r   )collectionsr   r,   Zultralytics.utils.checksr   r   Zultralytics.utils.plottingr   r   Zshapely.geometryr   r   r	   r
   r]   Zclasses_namesr(   r(   r(   r)   <module>   s    c
