o
    ߥii                     @   s   d dl Z d dlZd dlZd dlmZ dd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdddZdd Zd ddZdd ZdS )!    N)Polygonc                 C   s   | ddddf }| ddddf }| ddddf d }| ddddf d }t t || t || g}t t | | t || g}|| | }|| | }|| | }	|| | }
t |||	|
g}|S )zl
    Convert rboxes to polygons
    ARGS
        `rboxes`: [n, 5]
    RETURN
        `polygons`: [n, 8]
    N                   @)nphstackcossin)rboxesthetacxcyhalf_whalf_hv1v2p1p2p3p4polygons r   \/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/ocr_detection/utils.pyrboxes_to_polygons   s   	"$r   c                 C   sH   t | d | d | d | d }t | d | d | d | d }|| d S )	Nr      r   r   r   r         )
point_dist)boxpd1pd2r   r   r   	cal_width   s   r"   c                 C   s&   t ||  ||   || ||   S N)r   sqrt)x1y1x2y2r   r   r   r   %   s   &r   c                 C   s   |  D ]]}dd |D }t| |d |d f|d |d fdd t| |d |d f|d |d	 fdd t| |d |d	 f|d
 |d fdd t| |d
 |d f|d |d fdd q| S )Nc                 S   s   g | ]}t |qS r   )int).0or   r   r   
<listcomp>+   s    z!draw_polygons.<locals>.<listcomp>r   r   r   r   )r      r   r   r   r   r   )tolistcv2line)imgr   pr   r   r   draw_polygons)   s   ***,r3   c                 C   s   t | dd d} dgt|  }t| D ]N\}}|| sqt| D ]@\}}||ks)q || s.q |d }|d }t|d d }t|d d }	t|d d |	sXt|	d d |r`||kr`d||< q qg }
t| D ]\}}|| ru|
| qh|
S )Nc                 S   s
   | d  S )N   r   xr   r   r   <lambda>4   s   
 znms_python.<locals>.<lambda>keyTr4   r   F)sortedlen	enumeratepolygon2rboxpoint_in_rboxappend)boxesnms_flagiajbscore_ascore_brbox_arbox_b	boxes_nmsr   r   r   r   
nms_python3   s6   
rK   c                 C   s   | d | d }}|d |d }}|d |d }}|d }t || t | || t |  }	t ||  t | || t |  }
|	|d k oU|
|d k S )Nr   r   r   r   r   r   )r   absr
   r   )crboxcx0cy0cx1cy1whr   dist_xdist_yr   r   r   r>   N   s   *,r>   c                 C   s  | d | d | d | d f\}}}}| d | d | d | d f\}}}}|| | | d }	|| | | d }
t ||||}t ||||}t|	|
||||}t|	|
||||}|| }|| d }t|| || }t|| || }|| d	 }|	|
|||gS )
Nr   r   r   r   r   r   r   r   r   )r   point_line_distr   arctan2)polygonr%   r'   x3x4r&   r(   y3y4c_xc_yw1w2h1h2rT   rS   theta1theta2r   r   r   r   r=   X   s   $$r=   c                 C   s\   d}|| }|| }t || ||  | }	t | | ||  ||  ||  |	 }
|
S )Ngư>)r   r$   rL   )pxpyr%   r&   r'   r(   epsdxdydivdistr   r   r   rW   i   s   *rW   c                 C   s  | ddks	J |  d }|    d } |j\}}g }g }t|d tj	tj
tj\}	}
|	dd D ]}dt|d }t||d}|d}|jd d	k rYq;t| |d
d}d|krgq;|jd dkr|t|dd}t|dkr{q;nq;|d
d}t|d\}
}|dk rq;t|ts| }| }tt|dddf | | d||dddf< tt|dddf | | d||dddf< ||  || q;||fS )`
    _bitmap: single map with shape (1, H, W),
        whose values are binarized as {0, 1}
    r   r   r-   Nd   g{Gz?T)r   r   ro   r   gffffff?r   unclip_ratio)ro   r   r   r   )sizecpunumpydetachshaper/   findContoursastyper   uint8	RETR_LISTCHAIN_APPROX_SIMPLE	arcLengthapproxPolyDPreshapebox_score_fastunclipr;   get_mini_boxes
isinstancer)   itemcliproundr?   r.   )pred_bitmap
dest_widthdest_heightbitmapheightwidthr@   scorescontours_contourepsilonapproxpointsscorer   ssider   r   r   polygons_from_bitmapt   sP   


  r   Fc                 C   s  |r|d }| d } n|   d }|     d } |j\}}g }g }	t|d tjtj	tj
\}
}|
dd D ]}t|\}}|dk rJq=t|}t| |dd}d|kr]q=t|d	d
ddd}t|\}}|dk rsq=t|tj}t|ts| }| }tt|dddf | | d||dddf< tt|dddf | | d||dddf< ||d  |	| q=||	fS )rm   r   r-   Ni  r   ro   r   g333333?      ?rp   r   r   )rs   rt   ru   rv   r/   rw   rx   r   ry   rz   r{   r   arrayr   r~   r   int32r   r)   r   r   r   r?   r.   )r   r   r   r   is_numpyr   r   r   r@   r   r   r   r   r   r   r   r   r   r   r   boxes_from_bitmap   sH   



  r   c           
      C   s  | j d d \}}| }tt|d d df  tjd|d }tt|d d df 	 tjd|d }tt|d d df  tjd|d }tt|d d df 	 tjd|d }tj
|| d || d ftjd}	|d d df | |d d df< |d d df | |d d df< t|	|dddtjd t| ||d ||d f |	d S )Nr   r   r   )dtypero   )rv   copyr   r   floorminrx   r   ceilmaxzerosry   r/   fillPolyr~   mean)
r   _boxrT   rS   r   xminxmaxyminymaxmaskr   r   r   r      s   0000$   (r   r   c                 C   sF   t | }|j| |j }t }|| tjtj t	|
|}|S r#   )r   arealength	pyclipperPyclipperOffsetAddPathJT_ROUNDET_CLOSEDPOLYGONr   r   Execute)r   rq   polydistanceoffsetexpandedr   r   r   r      s   r   c                 C   s   t | }ttt |dd d}d\}}}}|d d |d d kr)d}d}nd}d}|d d |d d kr>d}d}nd}d}|| || || || g}|t|d fS )	Nc                 S   s   | d S )Nr   r   r5   r   r   r   r7      s    z get_mini_boxes.<locals>.<lambda>r8   )r   r   r   r   r   r   r   r   )r/   minAreaRectr:   list	boxPointsr   )r   bounding_boxr   index_1index_2index_3index_4r   r   r   r   r      s   
r   )F)r   )r/   rt   r   r   shapely.geometryr   r   r"   r   r3   rK   r>   r=   rW   r   r   r   r   r   r   r   r   r   <module>   s"   


30
	