U
    KÉhV'  ã                   @   s\  d dl Z d dlZd dlZd dlZd dlZd dlZe  e jj	d ¡Z
e  e jj	d ¡Zze j ¡ ZW n" ek
r„   edƒ eƒ  Y nX dZdZdZdZd	Zd ad
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZedkrXedƒ e dƒZ!e!dkree dƒƒ qàe!dkreƒ  qàe!dkr,eƒ  qàe!dkr>eƒ  qàe!d krNqXqàed!ƒ qàdS )"é    Nz#haarcascade_frontalface_default.xmlzhaarcascade_eye.xmlzYError: OpenCV contrib package is missing. Install with: pip install opencv-contrib-pythonz.http://community.scrubbed.net:8080/api/checkinÚregistered_faceszattendance_log.csvzface_recognizer.ymlzlast_user_id.txtc                  C   sê   t dƒ g } tdƒD ](}t |¡}| ¡ r|  |¡ | ¡  q| sNt dƒ dS t dƒ | D ]}t d|› d|› ƒ qZzRtdt› d	ƒ}|d
kr’W qæt	|ƒ}|| kr¼|at dt› dƒ W qænt dƒ W qt t
k
râ   t dƒ Y qtX qtdS )z:Lists available cameras and allows the user to select one.zDetecting available cameras...é
   zNo cameras found.NzAvailable cameras:z  z	: Camera zSelect a camera (current: z): Ú zCamera z
 selected.zInvalid camera index.zPlease enter a number.)ÚprintÚrangeÚcv2ÚVideoCaptureÚisOpenedÚappendÚreleaseÚinputÚselected_camera_indexÚintÚ
ValueError)Zavailable_camerasÚiÚcapÚindexÚchoice© r   ú"/var/www/fran/franai/livestream.pyÚselect_camera   s2    


r   c                 C   sT   t  | d¡} t  | ¡} t  | dd¡} t jddd}| | ¡} t  | dddt j¡} | S )	zPEnhanced preprocessing for better recognition accuracy in real-world conditions.)éÈ   r   )é   r   r   g      ø?)é   r   )Z	clipLimitZtileGridSizeNéÿ   )r   ÚresizeÚequalizeHistÚGaussianBlurÚcreateCLAHEÚapplyÚ	normalizeÚNORM_MINMAX)Úface_imgZclaher   r   r   Úpreprocess_face>   s    

r#   c              
   C   s¢  t j t| ¡}t j|dd t t¡}d}td| › ƒ tdƒ tdƒ |dk rz| 	¡ \}}|sfqzt 
|tj¡}tj|dd	d
d}|D ]Æ\}}	}
}||	|	| …|||
 …f }|
dkrŠ|dkrŠt |||	f||
 |	| fdd¡ t |d|› d||	d ftjddd¡ t j |d|d›d¡}t ||¡ |d7 }t d¡ |dkrŠ qRqŠt d|¡ t d¡d@ tdƒkrHqzqH| ¡  t ¡  td|› d| › ƒ |S )zXCaptures face images for training, ensuring variations (with glasses, different angles).T)Úexist_okr   z+Starting training data collection for User z?Please move your head slowly in different directions and anglesz"Press 'q' to stop collection earlyéd   gš™™™™™ñ?é   )éP   r'   ©ÚscaleFactorÚminNeighborsÚminSizer'   ©r   r   r   é   zCapturing: z/100r   gffffffæ?Z	training_Z03dú.jpgr   zTraining Data Collectionr   Úqz,Training data collection complete. Captured z images for User )ÚosÚpathÚjoinÚFACE_DIRÚmakedirsr   r   r   r   ÚreadÚcvtColorÚCOLOR_BGR2GRAYÚface_cascadeÚdetectMultiScaleÚ	rectangleÚputTextÚFONT_HERSHEY_SIMPLEXÚimwriteÚwaitKeyÚimshowÚordr   ÚdestroyAllWindows)Úuser_idÚuser_folderr   ÚcountÚretÚframeÚgrayÚfacesÚxÚyÚwÚhr"   Úimg_pathr   r   r   Úcollect_training_dataS   sH    

"   ÿ
rN   c               	      sÎ  g g  } }t  t¡D ]b}t j t|¡‰ t j ˆ ¡rzt|ƒ}W n& tk
rf   td|› ƒ Y qY nX dddddg}t	‡ fdd„|D ƒƒ}|r|D ]z}t j ˆ |¡}t j 
|¡r–t  |¡D ]P}| d	¡r¾t j ||¡}	t |	tj¡}
|
d
kròq¾t|
ƒ}
|  |
¡ | |¡ q¾q–qt  ˆ ¡D ]X}| d	¡rt j ˆ |¡}	t |	tj¡}
|
d
krXqt|
ƒ}
|  |
¡ | |¡ qq| sŒtdƒ d
S t | t |¡¡ t t¡ tdt| ƒ› dtt|ƒƒ› dƒ d
S )zNTrains LBPH face recognizer with additional preprocessing for better accuracy.z Skipping non-integer directory: ZfrontÚleftÚrightÚupZdownc                 3   s$   | ]}t j t j ˆ |¡¡V  qd S )N)r0   r1   Úisdirr2   )Ú.0Úangle©rC   r   r   Ú	<genexpr>”   s     z(train_face_recognizer.<locals>.<genexpr>r.   NzNo training data found.zTraining complete with z images from z users.)r0   Úlistdirr3   r1   r2   rR   r   r   r   ÚanyÚexistsÚendswithr   ÚimreadÚIMREAD_GRAYSCALEr#   r
   Ú
recognizerÚtrainÚnpÚarrayÚsaveÚ
MODEL_FILEÚlenÚset)rH   ÚlabelsZuser_id_strrB   Z
angle_dirsZhas_angle_structurerT   Zangle_folderÚfilenamerM   Úimgr   rU   r   Útrain_face_recognizer…   sN    






rh   c                  C   s\  t j t¡stdƒ dS t t¡ t t	¡} |  ¡ \}}|s@qHt 
|tj¡}tj|dddd}|D ]º\}}}}|||| …||| …f }	t|	ƒ}	t |	¡\}
}|dk rÐd|
› d	t|d
ƒ› d}t|
ƒ d}nd}d}t |||f|| || f|d
¡ t ||||d ftjd|d
tj¡ qdt d|¡ t d¡d@ tdƒkr,qHq,|  ¡  t ¡  dS )zKRecognizes a user even if wearing glasses or has slight appearance changes.z3Error: Model file not found. Train the model first.Ng333333ó?é   )é2   rj   r(   r'   zUser: z (Acc: r-   z%)r,   ÚUnknown)r   r   r   r   r   zFace Recognitionr   r/   )r0   r1   rY   rb   r   r]   r5   r   r   r   r6   r7   r8   r9   r#   ÚpredictÚroundÚlog_attendancer:   r;   r<   ÚLINE_AAr?   r>   r@   r   rA   )r   rE   rF   rG   rH   rI   rJ   rK   rL   r"   rB   Ú
confidenceÚtextÚcolorr   r   r   Úrecognize_user¹   s6    

"&rs   c              	   C   sž   t j  ¡ }| d¡}| d¡}tj t¡s^ttddd }t 	|¡}| 
dddg¡ W 5 Q R X ttd	dd(}t 	|¡}| 
|| d
g¡ t| ƒ W 5 Q R X dS )zGLogs attendance while ensuring a single check-in and check-out per day.z%Y-%m-%d %H:%M:%Sz%Y-%m-%drK   r   )ÚnewlineÚ	TimestampzUser IDÚStatusÚazCheck-inN)ÚdatetimeÚnowÚstrftimer0   r1   rY   ÚLOG_FILEÚopenÚcsvÚwriterÚwriterowÚsend_post_request)rB   ry   Ú	timestampÚtodayÚfiler~   r   r   r   rn   à   s    




rn   c              
   C   s˜   d| i}ddi}zNt jt||d}|jdkrDtd| › d|j› ƒ ntd|j› d	|j› ƒ W n4 t jjk
r’ } ztd
|› ƒ W 5 d}~X Y nX dS )zSends attendance to API.rB   zContent-Typezapplication/json)ÚjsonÚheadersr   u*   âœ… Successfully sent attendance for User z to API., Response: u   âš ï¸ Failed. Status: z, Response: u   âŒ Error sending attendance: N)ÚrequestsÚpostÚAPI_ENDPOINTÚstatus_coder   rq   Ú
exceptionsÚRequestException)rB   Úpayloadr…   ÚresponseÚer   r   r   r€   ñ   s    
r€   Ú__main__zK
1: Register User
2: Train Model
3: Recognize Face
4: Select Camera
5: ExitzChoose an option: Ú1zEnter user ID: Ú2Ú3Ú4Ú5zInvalid choice. Try again.)"r   Únumpyr_   r0   rx   r}   r†   ÚCascadeClassifierÚdataÚhaarcascadesr8   Zeye_cascadeÚfaceÚLBPHFaceRecognizer_creater]   ÚAttributeErrorr   Úexitrˆ   r3   r{   rb   ZUSER_ID_FILEr   r   r#   rN   rh   rs   rn   r€   Ú__name__r   r   r   r   r   r   Ú<module>   sN   #24'





