o
    e)                     @   sT   d dl Zd dlmZ dd ZdddZdd	 ZdddZdd Zdd Z	dd Z
dS )    N)Polygonc                 C   sV   t | tr
t| } t | tjsJ | jd dkr| jdks J | ddg}t|S )zConvert k points to 1 polygon.

    Args:
        points (ndarray or list): A ndarray or a list of shape (2k)
            that indicates k points.

    Returns:
        polygon (Polygon): A polygon object.
       r      )
isinstancelistnparrayZndarraysizeZreshaper   )ZpointsZ	point_mat r   ND:\Projects\ConvertPro\env\Lib\site-packages\paddleocr/ppocr/utils/poly_nms.pypoints2polygon   s   


r   -C6?c                 C   sL   t | tsJ t |tsJ |dkr| |@ }n
| |||@ }|j|fS )a  Calculate the intersection area between two polygon.

    Args:
        poly_det (Polygon): A polygon predicted by detector.
        poly_gt (Polygon): A gt polygon.

    Returns:
        intersection_area (float): The intersection area between two polygons.
    r   )r   r   bufferarea)poly_detpoly_gtr   Z
poly_interr   r   r   poly_intersection'   s   


r   c                 C   sB   t | tsJ t |tsJ | j}|j}t| |\}}|| | S )zCalculate the union area between two polygon.

    Args:
        poly_det (Polygon): A polygon predicted by detector.
        poly_gt (Polygon): A gt polygon.

    Returns:
        union_area (float): The union area between two polygons.
    )r   r   r   r   )r   r   Zarea_detZarea_gtarea_inters_r   r   r   
poly_union;   s   
r   Tc                 C   s@   t | }|dk r
dS |d dkr|sdS |d dkr|rdS dS )Nr   Fr   r   T   )len)xZ
with_scorenumr   r   r   valid_boundaryN   s   r   c                 C   s6   t | dsJ t |dsJ t| }t|}t||S )zCalculate the IOU between two boundaries.

    Args:
       src (list): Source boundary.
       target (list): Target boundary.

    Returns:
       iou (float): The iou between two boundaries.
    F)r   r   poly_iou)srctargetZsrc_polyZtarget_polyr   r   r   boundary_iouZ   s
   

r   c                 C   sH   t | tsJ t |tsJ t| |\}}t| |}|dkr dS || S )zCalculate the IOU between two polygons.

    Args:
        poly_det (Polygon): A polygon predicted by detector.
        poly_gt (Polygon): A gt polygon.

    Returns:
        iou (float): The IOU between two polygons.
    r   g        )r   r   r   r   )r   r   r   r   Z
area_unionr   r   r   r   l   s   

r   c           	      C   s   t | tsJ tt| dd d} g }dd t| jd D }t|dkrv|| |d  	  | |d  d d }t
|d}tt|f}tt|D ]}| ||  d d }t||||< qOt||k}t
||}t|dks&|S )Nc                 S   s   | d S )Nr   r   )r   r   r   r   <lambda>   s    zpoly_nms.<locals>.<lambda>)keyc                 S   s   g | ]}|qS r   r   ).0ir   r   r   
<listcomp>   s    zpoly_nms.<locals>.<listcomp>r   r   )r   r   r   r	   sortedrangeshaper   appendtolistdeleteZzerosr   where)	Zpolygons	thresholdZ	keep_polyindexAZiou_listr#   BZremove_indexr   r   r   poly_nms   s    r0   )r   )T)numpyr   Zshapely.geometryr   r   r   r   r   r   r   r0   r   r   r   r   <module>   s   

