B
    (RX^p  ã               @   sü   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlZdd„ Zd	d
„ ZG dd„ dƒZedkrødZdZdej d¡ ZdZeeedee ¡ d ƒdZe e¡ e e¡ e ¡  e ¡  e ¡  eed dZ dS )zÎ
rectlabel.py -- Tools to implement a labeling UI for bounding boxes in images
Copyright 2020  Monterey Bay Aquarium Research Institute
Distributed under MIT license. See license.txt for more information.

é    N)Úetree)ÚElementÚ
SubElement)ÚElementTree)Úminidomc             C   s   t j| dd ¡ S )z8Return a pretty-printed XML string for the Element.
    T)Úpretty_print)r   ÚtostringÚdecode)Úelem© r   ú<X:\800139.EyeRIS\EyeRIS.Software\gridview\libs\annotation.pyÚprettify   s    r   c             C   s.   t jdd}t  | |¡}|j| dddd d S )NT)Úremove_blank_textzutf-8)Úencodingr   Úxml_declaration)r   Ú	XMLParserÚparseÚwrite)ÚxmlÚparserÚtreer   r   r   Úppxml   s    r   c               @   sh   e Zd Zddd„Zddd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zddd„Z	ddd„Z
ddd„Zddd„ZdS ) Ú
AnnotationNÚLCMúlcm-log-fileÚcamr   c       	      C   sx  |d k	r`|| _ tjdd}t | j |¡| _| j ¡ | _| j d¡j| _	| j d¡j| _
g | _n|| _|| _|jd | _|jd | _|jd | _|| _|| _	|| _
|| _g | _tdƒ| _|  | jd| j
¡| _|  | jd| j	¡| _t| jd	ƒ| _|  | jd
d¡ |  | jd|¡ |  | jd|¡ |  | jd| j¡ t| jdƒ| _|  | jd| j¡ |  | jd| j¡ |  | jd| j¡ d S )NT)r   ÚfilenameÚfolderé   r   é   Ú
annotationÚsourceZdatabaseZUnknownÚlcmlogÚutimezcamera-nameÚsizeÚwidthÚheightÚdepth)Úxml_pathr   r   r   Úxml_treeÚgetrootÚrootÚfindÚtextr   r   Úbboxesr#   Úcamera_nameÚshapeZimage_widthZimage_heightZimage_depthr"   Úimager   Úadd_tagZ
folder_tagZfilename_tagr   r!   r$   )	Úselfr(   r1   r   r   r"   r/   r#   r   r   r   r   Ú__init__#   s<    

zAnnotation.__init__c             C   s    t ||ƒ}|d k	rt|ƒ|_|S )N)r   Ústrr-   )r3   ÚparentZ
child_nameÚvalueÚtagr   r   r   r2   F   s    

zAnnotation.add_tagc             C   s¬   | j  d¡}|dkr¤|t|ƒk r¤tt||  d¡ d¡jƒƒ}tt||  d¡ d¡jƒƒ}tt||  d¡ d¡jƒƒ}tt||  d¡ d¡jƒƒ}||||fS g S d S )NÚobjectr   ÚbndboxÚxminÚxmaxÚyminÚymax)r)   ÚfindallÚlenÚintÚfloatr,   r-   )r3   ÚindÚobjsr;   r<   r=   r>   r   r   r   Úget_boxL   s    zAnnotation.get_boxc             C   s&   x | j  d¡D ]}| j |¡ qW d S )Nr9   )r)   r?   r+   Úremove)r3   Úobjr   r   r   Úremove_boxesX   s    zAnnotation.remove_boxesc             C   s¼   | j  d¡}|dkr¸|t|ƒk r¸tt|d ƒƒ||  d¡ d¡_tt|d ƒƒ||  d¡ d¡_tt|d ƒƒ||  d¡ d¡_tt|d	 ƒƒ||  d¡ d
¡_|||  d¡_d S )Nr9   r   r:   r;   r   r=   r   r<   é   r>   Úname)r)   r?   r@   r5   rA   r,   r-   )r3   rC   ÚbboxÚlabelrD   r   r   r   Úset_box\   s    """"zAnnotation.set_boxc       	      C   sÒ   |\}}}}}t | jdƒ}|  |d|¡ |  |dd¡ |  |dd¡ |  |dd¡ |  |dd¡ t |d	ƒ}|  |d
t|d ƒ¡ |  |dt|d ƒ¡ |  |dt|d ƒ¡ |  |dt|d ƒ¡ | j |¡ d S )Nr9   rJ   ZposeZUnspecifiedZ	truncatedÚ0ZoccludedZ	difficultr:   r;   r   r=   r   r<   r>   )r   r+   r2   rA   r.   Úappend)	r3   rK   Úpt0Úpt1r#   Ú
class_nameÚscoresrG   r:   r   r   r   Úadd_boxe   s    
zAnnotation.add_boxc          	   C   s€   | j d k	r2t| j dƒ}| t| jƒ¡ d S Q R X |d krRtj | jd| j	d ¡}t|dƒ}| j
j|dddd W d Q R X d S )NÚwr   z.xmlzutf-8T)r   r   r   )r(   Úopenr   r   r+   ÚosÚpathÚjoinr   r   r)   )r3   ÚfilepathÚfr   r   r   Úsave_xmlu   s    

zAnnotation.save_xmlc       	   	   C   sœ   | j  ¡ }xX| jD ]N}|\}}}}}t |t|ƒt|ƒdd¡ t |||d |d ftjdd¡ qW |d kr„tj	 
| jd| jd ¡}t|ƒ t ||¡ d S )	N)r   éÿ   r   r   r   r   g      à?)r   r]   r]   Zboxed_imagesz.jpg)r1   Úcopyr.   Úcv2Ú	rectangleÚtupleÚputTextÚFONT_HERSHEY_COMPLEXrW   rX   rY   r   r   ÚprintÚimwrite)	r3   rZ   Zmarked_imagerK   rP   rQ   r#   rR   rS   r   r   r   Úsave_boxed_imageƒ   s    
&zAnnotation.save_boxed_imagec             C   s2   |d kr t j | jd| jd ¡}t || j¡ d S )NÚimagesz.jpg)rW   rX   rY   r   r   r_   re   r1   )r3   rZ   r   r   r   Ú
save_image‘   s    zAnnotation.save_imagec             C   sÈ   |d kr| j }n|}x®| jD ]¤}|\}}}}}| j|d |d …|d |d …d d …f }	t|d ƒd t|d ƒ d t|d ƒ d t|d ƒ }
tj | jd|d |
 d ¡}t 	||	¡ qW d S )Nr   r   ú-Úroisz.jpg)
r   r.   r1   r5   rW   rX   rY   r   r_   re   )r3   rZ   Z
fileprefixrK   rP   rQ   r#   rR   rS   ÚroiZcoord_stringr   r   r   Ú	save_rois˜   s    ,<zAnnotation.save_rois)NNNr   r   r   r   )N)N)N)N)N)Ú__name__Ú
__module__Ú__qualname__r4   r2   rE   rH   rM   rT   r\   rf   rh   rl   r   r   r   r   r   !   s   
#
	


r   Ú__main__))éd   éÈ   )é‚   i  l   Øø´Ztest_class1g      Ð?))i   i  )if  i¤  l   X5´Ztest_class2g      Ð?r]   )i  iÀ  rI   Za_test_fileÚ.iè  )r1   r   r   r#   z.xml)r(   )!Ú__doc__r_   ÚnumpyÚnpÚtimerW   Zlxmlr   Z
lxml.etreer   r   Z	xml.etreer   Zxml.domr   Zxml.dom.minidomr   r   r   r   rm   rK   Zbbox2ÚrandomÚimgr   rA   ÚannrT   r\   rf   rl   Zann2r   r   r   r   Ú<module>   s2    

