ó
    ñZjG*  ã                   óÈ   • S SK Jr  S SKJrJrJr  S SKrS SKrS SK	r	S SK
Jr  SSKJr  SSKJr  SSKJr  \ " S	 S
5      5       r " S S5      r " S S\5      r " S S5      rg)é    )Ú	dataclass)ÚListÚOptionalÚTupleN)ÚPolygoné   )Úlogger)Úsave_img)ÚVisResc                   óÊ   • \ rS rSr% Sr\\R                     \S'   Sr	\\R                     \S'   Sr
\\\      \S'   Sr\\S'   S rSS	\\   S
\\R                     4S jjrSrg)ÚTextDetOutputé   NÚimgÚboxesÚscoresg        Úelapsec                 óH   • U R                   c  g[        U R                   5      $ ©Nr   )r   Úlen)Úselfs    ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/rapidocr/ch_ppocr_det/utils.pyÚ__len__ÚTextDetOutput.__len__   s   € Ø�:‰:ÑØÜ�4—:‘:‹Ðó    Ú	save_pathÚreturnc                 óB  • U R                   b  U R                  b  U R                  c  [        R                  " S5        g [        5       nUR                  U R                   U R                  U R                  5      nUb"  [        X5        [        R                  " SU5        U$ )NzNo image or boxes to visualize.zVisualization saved as %s)	r   r   r   r	   Úwarningr   Údraw_dt_boxesr
   Úinfo)r   r   ÚvisÚvis_imgs       r   r!   ÚTextDetOutput.vis   sw   € Ø�8‰8Ñ˜tŸz™zÑ1°T·[±[Ñ5HÜ�NŠNÐ<Ô=Øä‹hˆØ×#Ñ# D§H¡H¨d¯j©j¸$¿+¹+ÓFˆàÑ Ü�YÔ(Ü�KŠKÐ3°YÔ?Øˆr   © )N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   ÚnpÚndarrayÚ__annotations__r   r   r   Úfloatr   r   Ústrr!   Ú__static_attributes__r$   r   r   r   r      so   ‡ à $€Cˆ�"—*‘*Ñ	Ó$Ø"&€Eˆ8�B—J‘JÑÓ&Ø$(€FˆH�T˜%‘[Ñ!Ó(Ø€FˆEÓòñ
˜X c™]ð °h¸r¿z¹zÑ6J÷ ð r   r   c                   ó   • \ rS rSr SS\S\4S jjrS\R                  S\	\R                     4S jr
S\R                  S\R                  4S	 jrS\R                  S\R                  4S
 jrS\R                  S\	\R                     4S jrSrg)ÚDetPreProcessé+   NÚlimit_side_lenÚ
limit_typec                 ó²   • Uc  / SQnUc  / SQn[         R                  " U5      U l        [         R                  " U5      U l        SU l        Xl        X l        g )N)ç      à?r5   r5   gp?)r)   ÚarrayÚmeanÚstdÚscaler2   r3   )r   r2   r3   r7   r8   s        r   Ú__init__ÚDetPreProcess.__init__,   sH   € ð ‰<Ú"ˆDà‰;Ú!ˆCä—H’H˜T“NˆŒ	Ü—8’8˜C“=ˆŒØˆŒ
à,ÔØ$�r   r   r   c                 óØ   • U R                  U5      nUc  g U R                  U5      nU R                  U5      n[        R                  " USS9R                  [        R                  5      nU$ )Nr   )Úaxis)ÚresizeÚ	normalizeÚpermuter)   Úexpand_dimsÚastypeÚfloat32)r   r   Úresized_imgs      r   Ú__call__ÚDetPreProcess.__call__<   sY   € Ø—k‘k #Ó&ˆØÑØà�n‰n˜[Ó)ˆØ�l‰l˜3ÓˆÜ�nŠn˜S qÑ)×0Ñ0´·±Ó<ˆØˆ
r   c                 ór   • UR                  S5      U R                  -  U R                  -
  U R                  -  $ )NrC   )rB   r9   r7   r8   ©r   r   s     r   r?   ÚDetPreProcess.normalizeF   s,   € Ø—
‘
˜9Ó%¨¯
©
Ñ2°T·Y±YÑ>À$Ç(Á(ÑJÐJr   c                 ó$   • UR                  S5      $ )N)r   r   é   )Ú	transposerH   s     r   r@   ÚDetPreProcess.permuteI   s   € Ø�}‰}˜YÓ'Ð'r   c                 óö  • UR                   SS u  p#U R                  S:X  aS  [        X#5      U R                  :”  a7  X#:”  a  [	        U R                  5      U-  nOn[	        U R                  5      U-  nOUSnOR[        X#5      U R                  :  a7  X#:  a  [	        U R                  5      U-  nO[	        U R                  5      U-  nOSn[        X$-  5      n[        X4-  5      n[        [        US-  5      S-  5      n[        [        US-  5      S-  5      n [        U5      S::  d  [        U5      S::  a  g[        R                  " U[        U5      [        U5      45      nU$ ! [         a  n[        UeSnAff = f)zFresize image to a size multiple of 32 which is required by the networkNr   Úmaxg      ð?é    r   )Úshaper3   rO   r2   r,   ÚminÚintÚroundÚcv2r>   Ú	ExceptionÚResizeImgError)r   r   ÚhÚwÚratioÚresize_hÚresize_wÚexcs           r   r>   ÚDetPreProcess.resizeL   sN  € à�y‰y˜˜!ˆ}‰ˆà�?‰?˜eÓ#Ü�1‹y˜4×.Ñ.Ó.Ø“5Ü! $×"5Ñ"5Ó6¸Ñ:‘Eä! $×"5Ñ"5Ó6¸Ñ:‘Eà‘ä�1‹y˜4×.Ñ.Ó.Ø“5Ü! $×"5Ñ"5Ó6¸Ñ:‘Eä! $×"5Ñ"5Ó6¸Ñ:‘Eà�ä�q‘y“>ˆÜ�q‘y“>ˆä”u˜X¨™]Ó+¨bÑ0Ó1ˆÜ”u˜X¨™]Ó+¨bÑ0Ó1ˆð	*Ü�8‹} Ó!¤S¨£]°aÓ%7ØÜ—*’*˜S¤3 x£=´#°h³-Ð"@ÓAˆCð ˆ
øô ó 	*Ü  cÐ)ûð	*ús   ÄE" Ä5+E" Å"
E8Å,E3Å3E8)r2   r3   r7   r9   r8   )ià  rR   NN)r%   r&   r'   r(   rS   r-   r:   r)   r*   r   rE   r?   r@   r>   r.   r$   r   r   r0   r0   +   s“   † àQUñ%Ø!ð%Ø58õ%ð ˜BŸJ™Jð ¨8°B·J±JÑ+?ô ðK˜RŸZ™Zð K¨B¯J©Jô Kð(˜2Ÿ:™:ð (¨"¯*©*ô (ð"˜"Ÿ*™*ð "¨°"·*±*Ñ)=÷ "r   r0   c                   ó   • \ rS rSrSrg)rW   éq   r$   N)r%   r&   r'   r(   r.   r$   r   r   rW   rW   q   s   † Úr   rW   c                   óè  • \ rS rSrSr      S$S\S\S\S\S\S\4S	 jjr	S
\
R                  S\\\4   S\\
R                  \\   4   4S jrS
\
R                  S\
R                  S\S\S\\
R                  \\   4   4
S jrS\
R                  S\\
R                  \4   4S jr\S\
R                  S\
R                  S\4S j5       rS\
R                  S\
R                  S\4S jrS\
R                  S\
R                  4S jrS\
R                  S\\   S\S\S\\
R                  \\   4   4
S jrS\
R                  S\
R                  4S jrS \
R                  S\S\S\
R                  4S! jrS"rg#)%ÚDBPostProcesséu   z6The post process for Differentiable Binarization (DB).ÚthreshÚ
box_threshÚmax_candidatesÚunclip_ratioÚ
score_modeÚuse_dilationc                 ó®   • Xl         X l        X0l        X@l        SU l        XPl        S U l        U(       a"  [        R                  " SS/SS//5      U l        g g )Né   rK   )	rd   re   rf   rg   Úmin_sizerh   Údilation_kernelr)   r6   )r   rd   re   rf   rg   rh   ri   s          r   r:   ÚDBPostProcess.__init__x   sT   € ð ŒØ$ŒØ,ÔØ(ÔØˆŒØ$Œà#ˆÔÞÜ#%§8¢8¨a°¨V°a¸°VÐ,<Ó#=ˆDÕ ð r   ÚpredÚ	ori_shaper   c                 óp  • Uu  p4US S 2SS S 2S S 24   nXR                   :„  nUS   nU R                  bU  [        R                  " [        R
                  " US   5      R                  [        R                  5      U R                  5      nU R                  US   XdU5      u  pxU R                  XxX45      u  pxXx4$ r   )
rd   rm   rU   Údilater)   r6   rB   Úuint8Úboxes_from_bitmapÚfilter_det_res)	r   ro   rp   Úsrc_hÚsrc_wÚsegmentationÚmaskr   r   s	            r   rE   ÚDBPostProcess.__call__Œ   s«   € ð !‰ˆØ’A�qš!šQ�JÑˆØŸk™kÑ)ˆà˜A‰ˆØ×ÑÑ+Ü—:’:Ü—’˜ a™Ó)×0Ñ0´·±Ó:¸D×<PÑ<PóˆDð ×.Ñ.¨t°A©w¸ÀUÓK‰ˆØ×+Ñ+¨E¸5ÓH‰ˆØˆ}Ðr   ÚbitmapÚ
dest_widthÚdest_heightc                 óÚ  • UR                   u  pV[        R                  " US-  R                  [        R
                  5      [        R                  [        R                  5      n[        U5      S:X  a  US   US   US   p©nO[        U5      S:X  a	  US   US   p©[        [        W	5      U R                  5      n/ / pÜ[        U5       GH}  nXž   nU R                  U5      u  nnUU R                  :  a  M.  U R                  S:X  a#  U R                  UUR!                  SS5      5      nOU R#                  X5      nU R$                  U:”  a  M„  U R'                  U5      nU R                  U5      u  nnUU R                  S-   :  a  M¾  [        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                  [        R.                  5      5        UR-                  U5        GM€     [        R0                  " U[        R.                  S	9U4$ )
zW
bitmap: single map with shape (1, H, W),
        whose values are binarized as {0, 1}
éÿ   rk   r   rK   r   ÚfastéÿÿÿÿN©Údtype)rQ   rU   ÚfindContoursrB   r)   rs   Ú	RETR_LISTÚCHAIN_APPROX_SIMPLEr   rR   rf   ÚrangeÚget_mini_boxesrl   rh   Úbox_score_fastÚreshapeÚbox_score_slowre   ÚunclipÚcliprT   ÚappendÚint32r6   )r   ro   r{   r|   r}   ÚheightÚwidthÚoutsr   ÚcontoursÚ_Únum_contoursr   r   ÚindexÚcontourÚpointsÚssideÚscoreÚboxs                       r   rt   ÚDBPostProcess.boxes_from_bitmapœ   s  € ð Ÿ™‰ˆä×ÒØ�c‰\×!Ñ!¤"§(¡(Ó+¬S¯]©]¼C×<SÑ<Só
ˆô ˆt‹9˜‹>Ø# A™w¨¨Q©°°a±˜1ˆC˜1Ü�‹Y˜!‹^Ø˜q™' 4¨¡7�aäœ3˜x›=¨$×*=Ñ*=Ó>ˆà˜BˆvÜ˜<×(ˆEØ‘oˆGØ ×/Ñ/°Ó8‰MˆF�EØ�t—}‘}Ó$Ùà�‰ &Ó(Ø×+Ñ+¨D°&·.±.ÀÀQÓ2GÓH‘à×+Ñ+¨DÓ:�à�‰ Ó&Ùà—+‘+˜fÓ%ˆCØ×,Ñ,¨SÓ1‰JˆC�Ø�t—}‘} qÑ(Ó(ÙäŸš¤§¢¨ªQ°¨T©°UÑ):¸ZÑ)GÓ HÈ!ÈZÓXˆC’�1�‰IÜŸšÜ—’˜šQ ˜T™ VÑ+¨kÑ9Ó:¸A¸{óˆC’�1�‰Ið �L‰L˜Ÿ™¤B§H¡HÓ-Ô.Ø�M‰M˜%× ñ1 )ô2 �xŠx˜¤R§X¡XÑ.°Ð6Ð6r   r—   c                 óX  • [         R                  " U5      n[        [        [         R                  " U5      5      S S9nSu  pEpgU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[
        R                  " X4   X5   X6   X7   /5      nU[        US   5      4$ )Nc                 ó   • U S   $ r   r$   )Úxs    r   Ú<lambda>Ú.DBPostProcess.get_mini_boxes.<locals>.<lambda>Î   s   € ÈÈ1Êr   )Úkey)r   rK   r   rk   rK   r   rk   r   )rU   ÚminAreaRectÚsortedÚlistÚ	boxPointsr)   r6   rR   )	r   r—   Úbounding_boxr˜   Úindex_1Úindex_2Úindex_3Úindex_4r›   s	            r   rˆ   ÚDBPostProcess.get_mini_boxesÌ   sÄ   € Ü—’ wÓ/ˆÜœœSŸ]š]¨<Ó8Ó9¹~ÑNˆà-7Ñ*ˆ˜'Ø�!‰9�Q‰<˜& ™) A™,Ó&ØˆGØ‰GàˆGØˆGà�!‰9�Q‰<˜& ™) A™,Ó&ØˆGØ‰GàˆGØˆGä�hŠhØ‰_˜f™o¨v©ÀÁÐPó
ˆð ”C˜ Q™Ó(Ð(Ð(r   Ú_boxc                 óÎ  • 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                  " X”R                  SSS5      R                  [        R                  5      S5        [        R                  " XUS-   2XVS-   24   U	5      S   $ )Nr   r   rK   r‚   r�   )rQ   Úcopyr)   r�   ÚfloorrR   rB   r�   ÚceilrO   Úzerosrs   rU   ÚfillPolyrŠ   r7   )
r{   r­   rX   rY   r›   ÚxminÚxmaxÚyminÚymaxry   s
             r   r‰   ÚDBPostProcess.box_score_fastä   s¾  € à�|‰|˜B˜QÐ‰ˆØ�i‰i‹kˆÜ�wŠw”r—x’x ¢A q D¡	§¡£Ó0×7Ñ7¼¿¹ÓAÀ1ÀaÈ!ÁeÓLˆÜ�wŠw”r—w’w˜s¢1 a 4™yŸ}™}›Ó/×6Ñ6´r·x±xÓ@À!ÀQÈÁUÓKˆÜ�wŠw”r—x’x ¢A q D¡	§¡£Ó0×7Ñ7¼¿¹ÓAÀ1ÀaÈ!ÁeÓLˆÜ�wŠw”r—w’w˜s¢1 a 4™yŸ}™}›Ó/×6Ñ6´r·x±xÓ@À!ÀQÈÁUÓKˆä�xŠx˜™ q™¨$©+¸©/Ð:Ä"Ç(Á(ÑKˆØš˜1˜‘I Ñ$ˆŠAˆqˆD‰	Øš˜1˜‘I Ñ$ˆŠAˆqˆD‰	Ü�Š�TŸ;™; q¨"¨aÓ0×7Ñ7¼¿¹ÓAÀ1ÔEÜ�xŠx˜ d¨Q¡h˜°¸a±x°Ð?Ñ@À$ÓGÈÑJÐJr   c                 ó¤  • UR                   SS u  p4UR                  5       n[        R                  " US5      n[        R                  " [        R
                  " USS2S4   5      SUS-
  5      n[        R                  " [        R                  " USS2S4   5      SUS-
  5      n[        R                  " [        R
                  " USS2S4   5      SUS-
  5      n[        R                  " [        R                  " USS2S4   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                  " X’R                  SSS5      R                  [        R                  5      S5        [        R                  " XUS-   2XVS-   24   U	5      S   $ )z'use polyon mean score as the mean scoreNr   )r�   r   r   rK   r‚   r�   )rQ   r¯   r)   rŠ   r�   rR   rO   r²   rs   rU   r³   rB   r�   r7   )
r   r{   r—   rX   rY   r´   rµ   r¶   r·   ry   s
             r   r‹   ÚDBPostProcess.box_score_slowó   sz  € à�|‰|˜B˜QÐ‰ˆØ—,‘,“.ˆÜ—*’*˜W gÓ.ˆä�wŠw”r—v’v˜g¢a¨ d™mÓ,¨a°°Q±Ó7ˆÜ�wŠw”r—v’v˜g¢a¨ d™mÓ,¨a°°Q±Ó7ˆÜ�wŠw”r—v’v˜g¢a¨ d™mÓ,¨a°°Q±Ó7ˆÜ�wŠw”r—v’v˜g¢a¨ d™mÓ,¨a°°Q±Ó7ˆä�xŠx˜™ q™¨$©+¸©/Ð:Ä"Ç(Á(ÑKˆà¢ 1 ™¨Ñ,ˆ’�1�‰Ø¢ 1 ™¨Ñ,ˆ’�1�‰ä�Š�TŸ?™?¨1¨b°!Ó4×;Ñ;¼B¿H¹HÓEÀqÔIÜ�xŠx˜ d¨Q¡h˜°¸a±x°Ð?Ñ@À$ÓGÈÑJÐJr   r›   c                 ó\  • U R                   n[        U5      nUR                  U-  UR                  -  n[        R
                  " 5       nUR                  U[        R                  [        R                  5        [        R                  " UR                  U5      5      R                  S5      nU$ )N)r�   rK   r   )rg   r   ÚareaÚlengthÚ	pyclipperÚPyclipperOffsetÚAddPathÚJT_ROUNDÚET_CLOSEDPOLYGONr)   r6   ÚExecuterŠ   )r   r›   rg   ÚpolyÚdistanceÚoffsetÚexpandeds          r   rŒ   ÚDBPostProcess.unclip  s~   € Ø×(Ñ(ˆÜ�s‹|ˆØ—9‘9˜|Ñ+¨d¯k©kÑ9ˆÜ×*Ò*Ó,ˆØ�‰�sœI×.Ñ.´	×0JÑ0JÔKÜ—8’8˜FŸN™N¨8Ó4Ó5×=Ñ=¸jÓIˆØˆr   Údt_boxesr   Ú
img_heightÚ	img_widthc                 óÊ  • / / pe[        X5       Hº  u  pxU R                  U5      nU R                  XsU5      n[        [        R
                  R                  US   US   -
  5      5      n	[        [        R
                  R                  US   US   -
  5      5      n
U	S::  d  U
S::  a  M˜  UR                  U5        UR                  U5        M¼     [        R                  " U5      U4$ )Nr   rK   rk   )	ÚzipÚorder_points_clockwiseÚclip_det_resrS   r)   ÚlinalgÚnormrŽ   r6   )r   rÉ   r   rÊ   rË   Údt_boxes_newÚ
new_scoresr›   rš   Ú
rect_widthÚrect_heights              r   ru   ÚDBPostProcess.filter_det_res  sÇ   € ð $& r�jÜ˜hÖ/‰JˆCØ×-Ñ-¨cÓ2ˆCØ×#Ñ# C°YÓ?ˆCäœRŸY™YŸ^™^¨C°©F°S¸±V©OÓ<Ó=ˆJÜœbŸi™iŸn™n¨S°©V°c¸!±f©_Ó=Ó>ˆKØ˜Q‹ +°Ó"2Ùà×Ñ Ô$Ø×Ñ˜eÖ$ñ 0ô �xŠx˜Ó% zÐ1Ð1r   Úptsc                 óH  • U[         R                  " USS2S4   5      SS24   nUSS2SS24   nUSS2SS24   nU[         R                  " USS2S4   5      SS24   nUu  pVU[         R                  " USS2S4   5      SS24   nUu  px[         R                  " XWX†/SS9n	U	$ )z…
reference from:
https://github.com/jrosebr1/imutils/blob/master/imutils/perspective.py
sort the points based on their x-coordinates
Nr   r   rK   rC   r‚   )r)   Úargsortr6   )
r   r×   ÚxSortedÚleftMostÚ	rightMostÚtlÚblÚtrÚbrÚrects
             r   rÎ   Ú$DBPostProcess.order_points_clockwise   s°   € ð ”b—j’j ¢Q¨ T¡Ó+ªQÐ.Ñ/ˆð ˜2˜A˜2šq˜5‘>ˆØ˜A™B¢˜E‘Nˆ	ð
 œBŸJšJ x²°1°¡~Ó6ºÐ9Ñ:ˆØ‰ˆàœbŸjšj¨²1°a°4©Ó9º1Ð<Ñ=ˆ	Ø‰ˆä�xŠx˜ Ð(°	Ñ:ˆØˆr   r˜   c           
      óì   • [        UR                  S   5       HW  n[        [        [	        XS4   S5      US-
  5      5      XS4'   [        [        [	        XS4   S5      US-
  5      5      XS4'   MY     U$ )Nr   rK   )r‡   rQ   rS   rR   rO   )r   r˜   rÊ   rË   Úpnos        r   rÏ   ÚDBPostProcess.clip_det_res9  sr   € ô ˜Ÿ™ a™Ö)ˆCÜ ¤¤S¨°Q°©¸Ó%;¸YÈ¹]Ó!KÓLˆF˜�6‰NÜ ¤¤S¨°Q°©¸Ó%;¸ZÈ!¹^Ó!LÓMˆF˜�6‹Nñ *ð ˆr   )re   rm   rf   rl   rh   rd   rg   N)g333333Ó?gffffffæ?iè  g       @r€   F)r%   r&   r'   r(   Ú__doc__r,   rS   r-   Úboolr:   r)   r*   r   r   rE   rt   rˆ   Ústaticmethodr‰   r‹   rŒ   ru   rÎ   rÏ   r.   r$   r   r   rb   rb   u   s  † Ù@ð ØØ"Ø!Ø Ø"ñ>àð>ð ð>ð ð	>ð
 ð>ð ð>ð õ>ð(Ø—J‘JðØ+0°°c°©?ðà	ˆr�z‰z˜4 ™;Ð&Ñ	'ôð .7Ø—J‘Jð.7Ø(*¯
©
ð.7Ø@Cð.7ØRUð.7à	ˆr�z‰z˜4 ™;Ð&Ñ	'ô.7ð`) b§j¡jð )°U¸2¿:¹:ÀuÐ;LÑ5Mô )ð0 ðK˜rŸz™zð K°·±ð KÀó Kó ðKðK R§Z¡Zð K¸"¿*¹*ð KÈô Kð&˜"Ÿ*™*ð ¨¯©ô ð2ØŸ
™
ð2Ø,0°©Kð2ØEHð2ØUXð2à	ˆr�z‰z˜4 ™;Ð&Ñ	'ô2ð"¨"¯*©*ð ¸¿¹ô ð2Ø—j‘jðØ.1ðØ>Aðà	�‰÷r   rb   )Údataclassesr   Útypingr   r   r   rU   Únumpyr)   r¾   Úshapely.geometryr   Ú	utils.logr	   Úutils.utilsr
   Úutils.vis_resr   r   r0   rV   rW   rb   r$   r   r   Ú<module>rð      sc   ðõ "ß (Ñ (ã 
Û Û Ý $å Ý "Ý "ð ÷ð ó ð÷2Cñ CôL	�Yô 	÷Jò Jr   