U
    ~c)                     @   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$t| jd dkr<| jdks@t| 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arrayndarrayAssertionErrorsizereshaper   )pointsZ	point_mat r   X   /Users/zhoujun20/Desktop/工作相关/一致性/训练/PaddleOCR/ppocr/utils/poly_nms.pypoints2polygon   s    


r   -C6?c                 C   sL   t | tstt |tst|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   r   bufferarea)poly_detpoly_gtr   Z
poly_interr   r   r   poly_intersection'   s    

r   c                 C   sB   t | tstt |tst| 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   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tt |dst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   r   poly_iou)srctargetZsrc_polyZtarget_polyr   r   r   boundary_iouZ   s
    
r#   c                 C   sH   t | tstt |tst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   r   Z
area_unionr   r   r   r    l   s    

r    c           	      C   s   t | tsttt| dd d} g }dd t| jd D }t|dkr|	| |d  
  | |d  d d }t|d}tt|f}tt|D ]&}| ||  d d }t||||< qt||k}t||}q@|S )Nc                 S   s   | d S )Nr   r   )r   r   r   r   <lambda>       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   r	   sortedrangeshaper   appendtolistdeletezerosr#   where)	polygons	thresholdZ	keep_polyindexAZiou_listr(   BZremove_indexr   r   r   poly_nms   s    r7   )r   )T)numpyr   shapely.geometryr   r   r   r   r   r#   r    r7   r   r   r   r   <module>   s   

