
    9i#                     z    S SK r S SKrS SKrS SKJr  S rS rS rS r	S r
S rS	 rS
 rS rS rS rSS jrS rg)    N)Polygonc                    U SS2SS24   nU SS2SS24   nU SS2SS24   S-  nU SS2SS24   S-  n[         R                  " [         R                  " U5      U-  [         R                  " U5      U-  /5      n[         R                  " [         R                  " U5      * U-  [         R                  " U5      U-  /5      nX%-
  U-
  nX%-   U-
  nX%-   U-   n	X%-
  U-   n
[         R                  " XxX/5      nU$ )zT
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polygonss               g/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/pipelines/cv/ocr_utils/utils.pyrboxes_to_polygonsr      s     1ac6NE!RaR%=DAqsF^b FAqsF^b F	BFF5MF*BFF5MF,BC	DB	RVVE]NV+RVVE]V-CD	EB	RB	RB	RB	RByy"")*HO    c                 x    [        U S   U S   U S   U S   5      n[        U S   U S   U S   U S   5      nX-   S-  $ )	Nr      r   r   r   r         )
point_dist)boxpd1pd2s      r   	cal_widthr%      sN    
SVSVSVSV
4C
SVSVSVSV
4CI?r   c                 P    [         R                  " X -
  X -
  -  X1-
  X1-
  -  -   5      $ N)r
   sqrt)x1y1x2y2s       r   r!   r!   %   s(    77BG(BG+@@AAr   c                    UR                  5        H  nU Vs/ s H  n[        U5      PM     nn[        R                  " XS   US   4US   US   4SS5        [        R                  " XS   US   4US   US   4SS5        [        R                  " XS   US   4US   US	   4SS5        [        R                  " XS   US	   4US   US   4SS5        M     U $ s  snf )
Nr   r   r   r   )r      r   r   r   r   r    )tolistintcv2line)imgr   pos       r   draw_polygonsr6   )   s    __QSVQtQqTlQqT1Q4L+qAtQqTlQqT1Q4L+qAtQqTlQqT1Q4L+qAtQqTlQqT1Q4L+qA  J  s   Cc                    [        U S S9n S/[        U 5      -  n[        U 5       H  u  p#X   (       d  M  [        U 5       Hr  u  pEXB:  d  M  X   (       d  M  US   nUS   n[        US S 5      n[        US S 5      n	[	        US S U	5      (       d  [	        U	S S U5      (       d  Mg  Xg:  d  Mn  SX'   Mt     M     / n
[        U 5       H!  u  p+X   (       d  M  U
R                  U5        M#     U
$ )Nc                     U S   * $ )N    xs    r   <lambda>nms_python.<locals>.<lambda>4   s
    1r   keyTr9   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"   s               r   
nms_pythonrR   3   s    5o.EvE
"H% {!%(u{A$A$%ae,%ae, V44r
F9, 9,(&+ )	 !" IE";;S! # r   c                    U S   U S   p2US   US   pTUS   US   pvUS   n[         R                  " XB-
  [         R                  " U5      -  XS-
  [         R                  " U5      -  -   5      n	[         R                  " XB-
  * [         R                  " U5      -  XS-
  [         R                  " U5      -  -   5      n
XS-  :  =(       a    XS-  :  $ )Nr   r   r   r   r   r	   )r
   absr   r   )crboxcx0cy0cx1cy1whr   dist_xdist_ys              r   rE   rE   N   s    tQqTAwQ7DGqGEVVSY"&&-/39u2MMNFVVciL266%=0CI3NNOF#g5FW$46r   c                    U S   U S   U S   U S   4u  pp4U S   U S   U S   U S   4u  pVpxX-   U-   U-   S-  n	XV-   U-   U-   S-  n
[        XX&5      n[        X7XH5      n[        XXX&5      n[        XX7XH5      nX-   nX-   S-  n[        R                  " Xe-
  X!-
  5      n[        R                  " Xx-
  X4-
  5      nUU-   S	-  nXUUU/$ )
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h2r\   r[   theta1theta2r   s                       r   rD   rD   X   s    QZWQZCNBBQZWQZCNBB7R<"
!C7R<"
!C	BB	#B	BB	#B	22	2B	22	2B
A	AAZZ)FZZ)Ff_#EaE""r   c                     SnXB-
  nXS-
  n[         R                  " Xw-  X-  -   5      U-   n	[         R                  " X-  X-  -
  XC-  -   XR-  -
  5      U	-  n
U
$ )Ngư>)r
   r(   rT   )pxpyr)   r*   r+   r,   epsdxdydivdists              r   r`   r`   i   s`    
C	B	B
''"'BG#
$s
*C66"'BG#bg-783>DKr   c                 P   UR                  S5      S:X  d   eUR                  5       R                  5       S   nU R                  5       R                  5       R                  5       S   n UR                  u  pV/ n/ n[
        R                  " US-  R                  [        R                  5      [
        R                  [
        R                  5      u  pU	SS  GH  nS[
        R                  " US5      -  n[
        R                  " XS5      nUR                  S5      nUR                  S   S	:  a  M[  [        XR                  S
S5      5      nSU:  a  M~  UR                  S   S:  a  [!        USS9n[#        U5      S:  a  M  OM  UR                  S
S5      n[%        UR                  S5      5      u  n
nUS:  a  M  ['        U[(        5      (       d   UR+                  5       nUR+                  5       n[        R,                  " [        R.                  " USS2S4   U-  U-  5      SU5      USS2S4'   [        R,                  " [        R.                  " USS2S4   U-  U-  5      SU5      USS2S4'   UR1                  UR3                  5       5        UR1                  U5        GM     Xx4$ )T
_bitmap: single map with shape (1, H, W),
    whose values are binarized as {0, 1}
r   r   r.   Nd   g{Gz?T)r   r   rz   r   gffffff?r	   unclip_ratio)rz   r   r   r   )sizecpunumpydetachshaper1   findContoursastyper
   uint8	RETR_LISTCHAIN_APPROX_SIMPLE	arcLengthapproxPolyDPreshapebox_score_fastuncliprB   get_mini_boxes
isinstancer0   itemcliproundrF   r/   )pred_bitmap
dest_widthdest_heightbitmapheightwidthrG   scorescontours_contourepsilonapproxpointsscorer"   ssides                     r   polygons_from_bitmapr   t   sA    <<?a[[]  "1%F88:$$&q)DLLMFEF""FSL#8#8#B#&==#2I2IKKH DS>w55!!'D9(<<?Qt^^B%:;;<<?Qc2C3x!|  kk"a !#++j"9:55=*c**#*J%**,KGGHHSAY&34aEAqD	GGHHSAY'+56;HAqD	SZZ\"e? "@ =r   c                    UR                  S5      S:X  d   eUR                  5       R                  5       S   nU R                  5       R                  5       R                  5       S   n UR                  u  pV/ n/ n[
        R                  " US-  R                  [        R                  5      [
        R                  [
        R                  5      u  pU	SS  GH  n[        U5      u  pUS:  a  M  [        R                  " U5      n[        XR                  SS5      5      nS	U:  a  MR  [!        US
S9R                  SSS5      n[        U5      u  pUS:  a  M  [        R                  " U5      R                  [        R"                  5      n[%        U[&        5      (       d   UR)                  5       nUR)                  5       n[        R*                  " [        R,                  " USS2S4   U-  U-  5      SU5      USS2S4'   [        R*                  " [        R,                  " USS2S4   U-  U-  5      SU5      USS2S4'   UR/                  UR                  S5      R1                  5       5        UR/                  U5        GM     Xx4$ )rx   r   r   r.   Nry   r   rz   r   g333333?      ?r{   r   )r}   r~   r   r   r   r1   r   r   r
   r   r   r   r   arrayr   r   r   int32r   r0   r   r   r   rF   r/   )r   r   r   r   r   r   r   rG   r   r   r   r   r   r   r   r"   s                   r   boxes_from_bitmapr      s    <<?a[[]  "1%F88:$$&q)DLLMFEF""FSL#8#8#B#&==#2I2IKKH DS>&w/19&!t^^B%:;;V#.66r1a@#C(
5=hhsm""288,*c**#*J%**,KGGHHSAY&34aEAqD	GGHHSAY'+56;HAqD	S[[_++-.e5 "6 =r   c                    U R                   S S u  p#UR                  5       n[        R                  " [        R                  " US S 2S4   R                  5       5      R                  [        R                  5      SUS-
  5      n[        R                  " [        R                  " US S 2S4   R                  5       5      R                  [        R                  5      SUS-
  5      n[        R                  " [        R                  " US S 2S4   R                  5       5      R                  [        R                  5      SUS-
  5      n[        R                  " [        R                  " US S 2S4   R                  5       5      R                  [        R                  5      SUS-
  5      n[        R                  " X-
  S-   Xe-
  S-   4[        R                  S9n	US S 2S4   U-
  US S 2S4'   US S 2S4   U-
  US S 2S4'   [        R                  " XR                  SSS5      R                  [        R                  5      S5        [        R                  " XUS-   2XVS-   24   U	5      S   $ )Nr   r   r   )dtyperz   )r   copyr
   r   floorminr   r   ceilmaxzerosr   r1   fillPolyr   mean)
r   _boxr\   r[   r"   xminxmaxyminymaxmasks
             r   r   r      s   <<DA
))+C77288C1IMMO,33BHH=q!a%HD772773q!t9==?+22288<aQGD77288C1IMMO,33BHH=q!a%HD772773q!t9==?+22288<aQGD88T[1_dkAo6bhhGDAqD	D C1IAqD	D C1ILL{{1b!,33BHH=qA88Fq=$ax-78$?BBr   c                 &   [        U 5      nUR                  U-  UR                  -  n[        R                  " 5       nUR                  U [        R                  [        R                  5        [        R                  " UR                  U5      5      nU$ r'   )r   arealength	pyclipperPyclipperOffsetAddPathJT_ROUNDET_CLOSEDPOLYGONr
   r   Execute)r"   r|   polydistanceoffsetexpandeds         r   r   r      sh    3<Dyy<'$++5H&&(F
NN3	**I,F,FGxxx01HOr   c                 0   [         R                  " U 5      n[        [        [         R                  " U5      5      S S9nSu  p4pVUS   S   US   S   :  a  SnSnOSnSnUS   S   US   S   :  a  SnSnOSnSnX#   X$   X%   X&   /nU[        US   5      4$ )Nc                     U S   $ )Nr   r:   r;   s    r   r=    get_mini_boxes.<locals>.<lambda>   s    QqTr   r?   )r   r   r   r   r   r   r   r   )r1   minAreaRectrA   list	boxPointsr   )r   bounding_boxr   index_1index_2index_3index_4r"   s           r   r   r      s    ??7+LD|45>JF)3&Ggay|fQil"ay|fQil"?FOV_fo
NCLO$$$r   )r   )r1   r   r
   r   shapely.geometryr   r   r%   r!   r6   rR   rE   rD   r`   r   r   r   r   r   r:   r   r   <module>r      sV    
   $.B67#"0f+\C%r   