o
    rgR8                     @   s  d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlZd dlZd dlmZ d dlmZ ed	Zd
ZdZe ZejeddZdd Z dd Z!dd Z"de#fddZ$defde#deddf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e#fd+d,Z-d-d. Z.	/d?de#d0e/ddfd1d2Z0d3d4 Z1d5d6 Z2d7d8 Z3d9d: Z4d;d< Z5d@de#fd=d>Z6dS )A    N)Counter)Path)Image	ImageDrawImageEnhanceExifTags)BytesIO)settings)distance)peopleEncodingszoutput/encodings.pklbluewhiteimg
attendancec           	      C   s   t | }t| }z| }W n ty   d }Y nw d}|r9|d}|dkr,d}n|dkr3d}n|dkr9d}|dkr\|jd d	 \}}t |d	 |d	 f|d
}t 	||||f}t 
d| d S )Nr   i           i     Z         zrotated_image.jpg)cv2imreadr   open_getexifAttributeErrorgetshapegetRotationMatrix2D
warpAffineimwrite)	
image_pathimage	pil_imageexifangleorientationheightwidthrotation_matrix r*   //var/www/html/face-recog_v2/peoples/utilitys.pyrotate_image2   s*   


r,   c                 C   s   t | }|d}||jt jd}d}|t|jd | t|jd | f}|t j	}d}t
||}d}	t
||	}
||||||
g}|S )N
   )r   r   2   r   r   r.   g333333?r   r   g      ?)r   r   rotate	transformsizeAFFINEresizeint	transposeFLIP_LEFT_RIGHTr   
BrightnessenhanceContrast)r!   r   rotated_imageshifted_imagezoom_factorzoomed_imageflipped_imagebrightness_factorenhanced_brightnesscontrast_factorenhanced_contrastaugmented_imagesr*   r*   r+   enhance_imageA   s   

*rD   c                 C   s6   t | }t|}|d}t|}|d}|S )Nr   r   )r   r   r   	Sharpnessr8   Color)r!   r   enhancerenhanced_contrasenhanced_imgr*   r*   r+   enhance_image_brightnessV   s   




rJ   image_locationc                 C   s   d}t }|jdd}t|}W d    n1 sw   Y  t| }|d }|d }|D ](}	|	d td}
tj|
|d}t	|
|}|D ]}|
| |
| qHq-||d}|jd	d}t|| W d    d
S 1 ssw   Y  d
S )Nhogrbmodenames	encodingstemp_enhanced_image.jpgmodelrP   rQ   wbT)DEFAULT_ENCODINGS_PATHr   pickleloadrD   saveface_recognitionload_image_fileface_locationsface_encodingsappenddump)rK   	people_idrT   encodings_locationfloaded_encodingsrC   rP   rQ   augmented_imgr"   r]   r^   encodingname_encodingsr*   r*   r+   encode_known_face^   s0   




rh   rL   rT   rb   returnc                 C   s   g }g }t ddD ]5}|jj}t|}|D ](}|d td}tj|| d}	t	||	}
|
D ]}|
| |
| q2qq||d}|jdd}t|| W d    d S 1 s^w   Y  d S )Ntrainingz*/*rR   rS   rU   rV   rN   )r   globparentnamerD   rZ   r[   r\   r]   r^   r_   r   rX   r`   )rT   rb   rP   rQ   filepathrm   rC   re   r"   r]   r^   rf   rg   rc   r*   r*   r+   encode_known_facesw   s&   



"ro   c                 C   sf   t j| j\}}dt| | }t|}|d}t|	 |j
d |j
d   }|dk r1dS dS )Ntemp_Lr   r   r.   FT)ospathsplitextrm   strr   r   convertsumgetdatar1   )input_imagera   	file_namefile_extensiontemp_image_pathr   grayscale_img
brightnessr*   r*   r+   validate_is_image_too_dark   s   

 r   c           	      C   sP   d}t j| j\}}dt| | }t|}tj||d}t|}|o'|S )NrL   rp   rS   )	rr   rs   rt   rm   ru   r[   r\   r]   face_landmarks)	ry   ra   rT   rz   r{   r|   r"   face_locationface_landmarkr*   r*   r+   validate_face   s   

r   c                 C   sR   t j| j\}}dt| | }d}t|}tj||d}t|dkr'dS |S )Nrp   rL   rS   r   F)	rr   rs   rt   rm   ru   r[   r\   r]   len)ry   ra   rz   r{   r|   rT   r"   r   r*   r*   r+   validate_only_one_face   s   
r   c                 C   s   d}t j| j\}}dt| | }t|}tj||d}|d \}}	}
}|	| }|
| }||d  }||d  }|jd |jd }}||d kr`||d kr`||d kr`||d kr`d	S d
S )NrL   rp   rS   r   r   r   g?g333333?FT)	rr   rs   rt   rm   ru   r[   r\   r]   r   )ry   ra   rT   rz   r{   r|   loaded_imager   toprightbottomleftr(   r'   center_xcenter_yimage_widthimage_heightr*   r*   r+   validate_center_face   s   
r   c                 C   s   t j| j\}}dt| | }d}d}t|}tj||d}|d \}	}
}}t	|tj
}||	|||
f }t|tj }||k rIdS dS )Nrp   rL   U   rS   r   TF)rr   rs   rt   rm   ru   r[   r\   r]   r   cvtColorCOLOR_BGR2GRAY	LaplacianCV_64Fvar)ry   ra   rz   r{   r|   rT   laplacian_thresoldr   r   r   r   r   r   grayscale_image	face_area	laplacianr*   r*   r+   validate_blur   s   
r   c                 C   s   t j| j\}}dt| | }d}t|}tj||d}t|}|D ]}	|	d }
|	d }t	|
}t	|}|dk o?|dk }|  S d S )Nrp   rL   rS   left_eye	right_eye皙?)
rr   rs   rt   rm   ru   r[   r\   r]   r   get_ear)ry   ra   rz   r{   r|   rT   r"   r   face_landmarks_listr   r   r   ear_left	ear_rightclosedr*   r*   r+   validate_eye_close   s   

r   c                 C   sP   t | d | d }t | d | d }t | d | d }|| d|  }|S )Nr      r      r   r   g       @)dist	euclidean)eyeABCearr*   r*   r+   r      s
   r   c                 C   s   d}t j| j\}}dt|j | }g }g }d}t|}|D ]M}	|	| t	|}
tj
|
|d}t|
|}t j| j\}}t|
}dt|j d tt  | }|| |D ]}tjj|t|d q_q dS )NrL   rp   rS   z	training//)personrf   T)rr   rs   rt   rm   ru   idrD   rZ   r[   r\   r]   r^   r   	fromarrayuuiduuid4r   objectscreaterX   dumps)rK   r   rT   rz   r{   r|   rQ   rP   rC   re   r"   r]   r^   r#   tmp_augrf   r*   r*   r+   add_user   s(   


"
r   c                 C   s   t j| j\}}t| }dt| | }|| t| |}td |sPtd t	| t| |}|sPtd t	| t| |}|sPtd t	| t| |}|sTdS d S )Nrp   zRotate pertamazRotate keduazRotate ketigazRotate keempatF)
rr   rs   rt   rm   rJ   ru   rZ   r   printrotate_image)r!   ra   rz   r{   enhanced_imager|   validater*   r*   r+   rotate_to_top   s*   




r   r   	tolerancec           
      C   sX   d}t j| j\}}dt| | }t|}tj||d}t||||}	|	r*|	S dS )NrL   rp   rS   F)	rr   rs   rt   rm   ru   r[   r\   r]   compare_face_by_id)
rK   ra   r   rT   rz   r{   r|   ry   input_face_locationsresultr*   r*   r+   recognize_faces  s   
r   c                 C   sJ   t j|d | |d}tdd t||d D }|r#|dd d S d S )NrQ   )r   c                 s   s    | ]	\}}|r|V  qd S )Nr*   ).0matchrm   r*   r*   r+   	<genexpr>*  s    
z"_recognize_face.<locals>.<genexpr>rP   r   r   )r[   compare_facesr   zipmost_common)unknown_encodingrd   r   boolean_matchesvotesr*   r*   r+   _recognize_face%  s   
r   c              	   C   s   t jj|d}g }g }|D ]-}|jr:zt|j}|| |t|j W q tj	y9   t
d|j  Y qw q|sCt
d dS t| |}	||d}
|	D ]!}t||
|}t
| |rqt|}t ||d}|  |  S qPdS )N)	person_idu)   ❌ Error: Encoding tidak valid untuk ID u5   ⚠️ Tidak ada encoding yang ditemukan di database!FrU   )r   rf   )r   r   filterrf   rX   loadsr_   ru   r   UnpicklingErrorr   r   r[   r^   r   r   rZ   )ry   r   ra   r   encodings_querysetknown_encodingsknown_namesentryrf   input_face_encodingsrd   r   rm   encoded_facenew_encodingr*   r*   r+   r   2  s8   
	

r   c                 C   sr   t }|jdd}t|}W d    n1 sw   Y  t| |}t||D ]\}}	t|	||}
|
s6d}
q(|
S )NrM   rN   F)rW   r   rX   rY   r[   r^   r   r   )ry   r   ra   r   rb   rc   rd   r   bounding_boxr   rm   r*   r*   r+   	find_faceY  s   r   c                 C   s<   t | } | jddd}t }|| j |j|dd |S )Nr   T)expandJPEG)format)r   r   r/   r   rZ   filename)r"   r:   bufferedr*   r*   r+   r   h  s   
r   c                 C   s   |\}}}}|||||f }t |}	|	d | j||f||fftd | ||f|\}
}}}| j|
|f||ffddd | j|
|f|dd d S )Nzasdasdas2.jpg)outliner   )fillr   r   )r   )r   r   rZ   	rectangleBOUNDING_BOX_COLORtextbboxtext)drawr   rm   ry   r   r   r   r   
face_imagecropped_image	text_lefttext_top
text_righttext_bottomr*   r*   r+   _display_faceq  s$   


r   c                 C   s4   t ddD ]}| rtt| | d qd S )N
validation*)rK   rT   )r   rglobis_filer   ru   absolute)rT   rn   r*   r*   r+   r     s   r   )r   )rL   )7argparserX   collectionsr   pathlibr   r[   PILr   r   r   r   rr   ior   django.confr	   r   r   scipy.spatialr
   r   peoples.modelsr   rW   r   
TEXT_COLORgetcwddirnamers   joinattendance_folderr,   rD   rJ   ru   rh   ro   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   s\   *


'	