§
    ƒØjG  ã                   óp   — d dl Z d dlZd dlmZ d„ Zd„ Zd„ Zdd„Zdd
„Z	dd„Z
dd„Zd„ Zdd„Zd„ Zdd„ZdS )é    N)ÚAgglomerativeClusteringc                 ó  — t          j        |                      t          j        ¦  «        t           j        t           j        ¦  «        \  }}g }|D ]<}t          j        |¦  «        \  }}}}||||z   ||z   f}	|                     |	¦  «         Œ=|S ©N)	Úcv2ÚfindContoursÚastypeÚnpÚuint8Ú	RETR_TREEÚCHAIN_APPROX_SIMPLEÚboundingRectÚappend)
ÚdataÚcontoursÚ_ÚbboxesÚcntÚxÚyÚwÚhÚboxs
             ú/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/oemer/bbox.pyÚget_bboxr      s‰   € ÝÔ" 4§;¢;­r¬xÑ#8Ô#8½#¼-ÍÔI`ÑaÔa�K€HˆaØ€FØð ð ˆÝÔ% cÑ*Ô*‰
ˆˆ1ˆa�Ø�!�Q�q‘S˜!˜A™#ÐˆØ�Š�cÑÔÐÐØ€Mó    c                 óÂ   — t          t          | d         | d         z   dz  ¦  «        ¦  «        }t          t          | d         | d         z   dz  ¦  «        ¦  «        }||fS )Né   é   é   r   )ÚintÚround)ÚbboxÚcen_yÚcen_xs      r   Ú
get_centerr%      sZ   € Ý•�t˜A”w  a¤Ñ(¨AÑ-Ñ.Ô.Ñ/Ô/€EÝ•�t˜A”w  a¤Ñ(¨AÑ-Ñ.Ô.Ñ/Ô/€EØ�%ˆ<Ðr   c                 óÌ   — t          | j        ¦  «        dk    r5t          j        | t          j        ¦  «        } t          j        | dd¦  «        } t          j        | dd¦  «        } | S )Nr   )é   r'   r   é
   éP   )ÚlenÚshaper   ÚcvtColorÚCOLOR_BGR2GRAYÚGaussianBlurÚCanny)r   s    r   Úget_edger0      sU   € Ý
ˆ4Œ:�„˜!ÒÐÝŒ|˜D¥#Ô"4Ñ5Ô5ˆÝÔ  f¨aÑ0Ô0ˆÝŒ9�T˜2˜rÑ"Ô"€DØ€Kr   r   c                 ó|  ‡ — t          d |d¬¦  «        }t          j        d„ ‰ D ¦   «         ¦  «        dz  }|d d …dfxx         |z  cc<   |d d …dfxx         |z  cc<   |                     |¦  «         t          j        |j        ¦  «        }g }|D ]¬}t          j        |j        |k    ¦  «        d         }	ˆ fd„|	D ¦   «         }
ˆ fd„|	D ¦   «         }t          j        |
¦  «        t          j        |
¦  «        }}t          j        |¦  «        t          j        |¦  «        }}||||f}| 	                    |¦  «         Œ­|S )	NT)Ú
n_clustersÚdistance_thresholdÚcompute_full_treec                 óR   — g | ]$}|d          |d         z   |d         |d         z   f‘Œ%S )r   r   r   r   © )Ú.0Úbbs     r   ú
<listcomp>z%merge_nearby_bbox.<locals>.<listcomp>!   s5   € ÐDÐDÐD°r˜˜Aœ˜r !œu™ b¨¤e¨B¨q¬E¡kÐ2ÐDÐDÐDr   r   r   r   c                 óH   •— g | ]}‰|         d          ‰|         d         g‘ŒS )r   r   r6   ©r7   Úir   s     €r   r9   z%merge_nearby_bbox.<locals>.<listcomp>)   ó.   ø€ Ð8Ð8Ð8¨qˆv�aŒy˜Œ|˜V AœY qœ\Ð*Ð8Ð8Ð8r   c                 óH   •— g | ]}‰|         d          ‰|         d         g‘ŒS )r   r   r6   r;   s     €r   r9   z%merge_nearby_bbox.<locals>.<listcomp>*   r=   r   )
r   r	   ÚarrayÚfitÚuniqueÚlabels_ÚwhereÚminÚmaxr   )r   ÚdistanceÚx_factorÚy_factorÚmodelÚcentersÚlabelsÚnew_boxÚlabelÚidxÚxsÚysÚx1Úx2Úy1Úy2r   s   `                r   Úmerge_nearby_bboxrU      sU  ø€ Ý#¨tÈÐdhÐiÑiÔi€EÝŒhÐDÐD¸VÐDÑDÔDÑEÔEÈÑI€GØˆAˆAˆAˆqˆD€M€M„M�XÑ€M€M�MØˆAˆAˆAˆqˆD€M€M„M�XÑ€M€M�MØ	‡I‚IˆgÑÔÐÝŒY�u”}Ñ%Ô%€FØ€GØð ð ˆÝŒh�u”}¨Ò-Ñ.Ô.¨qÔ1ˆØ8Ð8Ð8Ð8°CÐ8Ñ8Ô8ˆØ8Ð8Ð8Ð8°CÐ8Ñ8Ô8ˆÝ”˜‘”�RœV B™ZœZˆBˆÝ”˜‘”�RœV B™ZœZˆBˆØ�2�r˜2ÐˆØ�Š�sÑÔÐÐØ€Nr   Úremoveç      à?c                 ó¾  — |dv s
J |¦   «         ‚t          j        d„ | D ¦   «         ¦  «        }t          j        |d d …df         ¦  «        t          j        |d d …df         ¦  «        }}t          j        ||ft           j        ¬¦  «        }g }| D ]=}|d         |d         z
  |d         |d         z
  z  }	|                     ||	dœ¦  «         Œ>t          |d	„ d
¬¦  «        }i }
t          |¦  «        D �]Ì\  }}|d         }||d         |d         …|d         |d         …f         }t          t          j	        |¦  «        ¦  «        }d|v r| 
                    d¦  «         t          |¦  «        dk    r/||
|dz   <   |dz   ||d         |d         …|d         |d         …f<   Œ°|d         }	d
}|D ]ß}|
|         }|d         }|||k             j        }||	k    sJ |› d|	› d|› �¦   «         ‚||	z  }||k    r™|dk    r�|d         }|d         }t          |d         |d         ¦  «        }t          |d         |d         ¦  «        }t          |d         |d         ¦  «        }t          |d         |d         ¦  «        }||||f|
|         d<   d} nŒà|r.||
|dz   <   |dz   ||d         |d         …|d         |d         …f<   �ŒÎd„ |
                     ¦   «         D ¦   «         }|S )N)rV   Úmergec                 ó.   — g | ]}|d          |d         f‘ŒS )r   r   r6   )r7   r   s     r   r9   z)rm_merge_overlap_bbox.<locals>.<listcomp>5   s%   € Ð7Ð7Ð7¨�S˜”V˜S œVÐ$Ð7Ð7Ð7r   r   r   ©Údtyper   r   )r"   Ú	area_sizec                 ó   — | d         S )Nr]   r6   )Úinfos    r   ú<lambda>z'rm_merge_overlap_bbox.<locals>.<lambda>@   s   € °°kÔ1B€ r   T)ÚkeyÚreverser"   r]   z, rY   Fc                 ó   — g | ]
}|d          ‘ŒS )r"   r6   )r7   r_   s     r   r9   z)rm_merge_overlap_bbox.<locals>.<listcomp>g   s   € Ð;Ð;Ð; $��f”Ð;Ð;Ð;r   )r	   r?   rE   ÚzerosÚuint16r   ÚsortedÚ	enumerateÚsetrA   rV   r*   ÚsizerD   Úvalues)r   ÚmodeÚoverlap_ratioÚptsÚmax_xÚmax_yÚmaskÚbox_infor   r]   ÚrecordsrN   ÚregionÚvalsÚvalidÚvalÚtar_infoÚtar_sizeÚoverlap_sizeÚratioÚtar_boxÚtop_xÚtop_yÚbt_xÚbt_yÚ	valid_boxs                             r   Úrm_merge_overlap_bboxr�   2   sY  € ØÐ&Ð&Ð&Ð&¨Ñ&Ô&Ð&å
Œ(Ð7Ð7°Ð7Ñ7Ô7Ñ
8Ô
8€CÝ”6˜#˜a˜a˜a ˜dœ)Ñ$Ô$¥b¤f¨S°°°°A°¬YÑ&7Ô&7ˆ5€EÝŒ8�U˜E�N­"¬)Ð4Ñ4Ô4€Dà€HØð ð ˆØ˜”V˜C œF‘] s¨1¤v¨c°!¬f¡}Ñ5ˆ	Ø�ŠØØ"ð
ð 
ñ 	ô 	ð 	ð 	õ �hÐ$BÐ$BÈDÐQÑQÔQ€Hà€GÝ" 8Ñ,Ô,ð "9ñ "9‰ˆˆXØ�vÔˆØ�c˜!”f˜S œV�m S¨¤V¨C°¬F ]Ð2Ô3ˆÝ•2”9˜VÑ$Ô$Ñ%Ô%ˆØ�ˆ9ˆ9Ø�KŠK˜‰NŒNˆNåˆt‰9Œ9˜Š>ˆ>Ø%ˆG�C˜‘E‰NØ14°q±ˆD��Q”˜˜Aœ�  A¤ s¨1¤v Ð-Ñ.Øà˜[Ô)ˆ	ØˆØð 	ð 	ˆCØ˜s”|ˆHØ Ô,ˆHØ! &¨#¢+Ô.Ô3ˆLØ˜yÒ(Ð(Ð(¨XÐ*KÐ*K¸Ð*KÐ*KÀcÐ*KÐ*KÑ(Ô(Ð(Ø  9Ñ,ˆEØ�}Ò$Ð$Ø˜7’?�?Ø" 6Ô*�CØ& vÔ.�GÝ  A¤¨°¬
Ñ3Ô3�EÝ  A¤¨°¬
Ñ3Ô3�EÝ˜s 1œv w¨q¤zÑ2Ô2�DÝ˜s 1œv w¨q¤zÑ2Ô2�DØ,1°5¸$ÀÐ+E�G˜C”L Ñ(Ø�Ø�ð %ð ð 	9Ø%ˆG�C˜‘E‰NØ14°q±ˆD��Q”˜˜Aœ�  A¤ s¨1¤v Ð-Ñ.ùà;Ð;¨'¯.ª.Ñ*:Ô*:Ð;Ñ;Ô;€IØÐr   r(   é   c           	      ó$  — t          | j        ¦  «        dk    s!J t          | ¦  «        › d| j        › �¦   «         ‚t          j        |                      t          j        ¦  «        dt          j        dz  dd ||¦  «        }g }|D ]�}|d         }|d         |d         k     r|d         |d         fn|d         |d         f\  }}|d         |d         k     r|d         |d         fn|d         |d         f\  }}	| 	                    ||||	f¦  «         ŒŽ|S )Nr   ú r   é´   é2   r   r   )
r*   r+   Útyper   ÚHoughLinesPr   r	   r
   Úpir   )
r   Úmin_lenÚmax_gapÚlinesÚnew_lineÚliner|   r~   r}   r   s
             r   Ú
find_linesr�   k   s  € ÝˆtŒz‰?Œ?˜aÒÐÐ¥D¨¡J¤JÐ!=Ð!=°´Ð!=Ð!=ÑÔÐåŒO˜DŸKšK­¬Ñ1Ô1°1µb´e¸C±iÀÀTÈ7ÐT[Ñ\Ô\€EØ€HØð 4ð 4ˆØ�AŒwˆØ,0°¬G°d¸1´gÒ,=Ð,=�t˜A”w  Q¤Ð(Ð(ÀDÈÄGÈTÐRSÌWÐCU‰ˆˆtØ,0°¬G°d¸1´gÒ,=Ð,=�t˜A”w  Q¤Ð(Ð(ÀDÈÄGÈTÐRSÌWÐCU‰ˆˆtØ�Š˜  t¨TÐ2Ñ3Ô3Ð3Ð3Ø€Or   r   c           	      ó¶   — |                      ¦   «         }| D ]A}t          j        ||d         |d         f|d         |d         fd|t          j        ¦  «         ŒB|S )Nr   r   r   r   ©r   éÿ   r   )Úcopyr   rŽ   ÚLINE_AA)rŒ   Úori_imgÚwidthÚimgrŽ   s        r   Ú
draw_linesr˜   x   s`   € Ø
�,Š,‰.Œ.€CØð _ð _ˆÝŒ��t˜A”w  Q¤Ð(¨4°¬7°D¸´GÐ*<¸kÈ5ÕRUÔR]Ñ^Ô^Ð^Ð^Ø€Jr   c                 óæ   — t          | j        ¦  «        dk    r| S t          j        | j        dz   t          j        ¬¦  «        dz  }t          j        | dk    ¦  «        }d||d         |d         f<   |S )Nr   ©r   r[   r’   r   r   )r*   r+   r	   Úonesr
   rC   )r   r—   rN   s      r   Ú
to_rgb_imgrœ      sj   € Ý
ˆ4Œ:�„˜ÒÐØˆå
Œ'�$”*˜tÑ#­2¬8Ð
4Ñ
4Ô
4°sÑ
:€CÝ
Œ(�4˜!’8Ñ
Ô
€CØ€CˆˆAŒ��A”ˆÑØ€Jr   r‘   r   Fc                 óÌ   — t          |j        ¦  «        dk     rt          |¦  «        }|st          j        |¦  «        }| D ]#\  }}}}t          j        |||f||f||¦  «         Œ$|S )Nr   )r*   r+   rœ   r	   r?   r   Ú	rectangle)	r   r—   Úcolorr–   ÚinplacerQ   rS   rR   rT   s	            r   Údraw_bounding_boxesr¡   ‰   su   € Ý
ˆ3Œ9�~„~˜ÒÐÝ˜‰oŒoˆØð ÝŒh�s‰mŒmˆØ"ð =ð =ÑˆˆR��RÝŒ�c˜B ˜8 b¨" X¨u°eÑ<Ô<Ð<Ð<Ø€Jr   c                 óö   — t          j        |                      t          j        ¦  «        t           j        t           j        ¦  «        \  }}g }|D ])}|                     t          j        |¦  «        ¦  «         Œ*|S r   )	r   r   r   r	   r
   r   r   r   ÚminAreaRect)r   r   r   r   r   s        r   Úget_rotated_bboxr¤   “   se   € ÝÔ" 4§;¢;­r¬xÑ#8Ô#8½#¼-ÍÔI`ÑaÔa�K€HˆaØ€FØð ,ð ,ˆØ�Š•c”o cÑ*Ô*Ñ+Ô+Ð+Ð+Ø€Mr   c                 ó  — t          |j        ¦  «        dk     rt          |¦  «        }|st          j        |¦  «        }| D ]L}t          j        |¦  «                             t          j        ¦  «        }t          j	        ||gd||¦  «         ŒM|S )Nr   r   )
r*   r+   rœ   r	   r?   r   Ú	boxPointsr   Úint64ÚdrawContours)r   r—   rŸ   r–   r    Úrboxr   s          r   Údraw_rotated_bounding_boxesrª   ›   sˆ   € Ý
ˆ3Œ9�~„~˜ÒÐÝ˜‰oŒoˆØð ÝŒh�s‰mŒmˆØð 6ð 6ˆÝŒm˜DÑ!Ô!×(Ò(­¬Ñ2Ô2ˆÝÔ˜˜s˜e Q¨¨uÑ5Ô5Ð5Ð5ð €Jr   )r   r   )rV   rW   )r(   r‚   rš   )r‘   r   F)r   Únumpyr	   Úsklearn.clusterr   r   r%   r0   rU   r�   r�   r˜   rœ   r¡   r¤   rª   r6   r   r   ú<module>r­      sú   ðà 
€
€
€
Ø Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ðð ð ðð ð ðð ð ð ð&6ð 6ð 6ð 6ðr
ð 
ð 
ð 
ðð ð ð ðð ð ðð ð ð ðð ð ð
ð 
ð 
ð 
ð 
ð 
r   