
    fh&                     T   S SK r S SKrS SKrS SKrS SKrS SKr\ R                  " \ R                  R                  S-   5      r
\ R                  " \ R                  R                  S-   5      r \ R                  R                  5       rSrSrSrSrS	rS qS
 rS rS rS rS rS rS r\S:X  aa   \" S5        \ " S5      r!\!S:X  a  \" \ " S5      5        O9\!S:X  a  \" 5         O+\!S:X  a  \" 5         O\!S:X  a  \" 5         O\!S:X  a  g\" S5        M`  g! \ a    \" S5        \" 5          Nf = f)    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                  "   [        S5        / n [        S5       HQ  n[        R                  " U5      nUR	                  5       (       d  M0  U R                  U5        UR                  5         MS     U (       d  [        S5        g[        S5        U  H  n[        SU SU 35        M       [        S[         S	35      nUS
:X  a  g[        U5      nX@;   a  Uq[        S[         S35        g[        S5         MO  ! [         a    [        S5         Nf = f)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)available_camerasicapindexchoices        =/Users/scrubbed2358/Documents/attendance-logger/livestream.pyselect_camerar      s	    

*+2Yq!<<>>$$Q'KKM	  !"	
"5'5'*+ # 	,78M7NcRSF|[F*(.% 56jAB-.   	,*+	,s   (C6 %C6 (C6 6DDc                 ,   [         R                  " U S5      n [         R                  " U 5      n [         R                  " U SS5      n [         R                  " SSS9nUR                  U 5      n [         R                  " U SSS[         R                  5      n U $ )	zPEnhanced preprocessing for better recognition accuracy in real-world conditions.)   r   )   r   r   g      ?)   r   )	clipLimittileGridSizeN   )r	   resizeequalizeHistGaussianBlurcreateCLAHEapply	normalizeNORM_MINMAX)face_imgclahes     r   preprocess_facer)   >   s}     zz(J/H )H &!4H OOc>E{{8$H }}XtQS__EHO    c           
      b   [         R                  R                  [        U 5      n[         R                  " USS9  [
        R                  " [        5      nSn[        SU  35        [        S5        [        S5        US:  Gax  UR                  5       u  pEU(       d  GO][
        R                  " U[
        R                  5      n[        R                  USS	S
S9nU H  u  ppXiX-   2XU
-   24   nU
S:  d  M  US:  d  M$  [
        R                  " XXU	4X-   X-   4SS5        [
        R                  " USU S3XS-
  4[
        R                   SSS5        [         R                  R                  USUS S35      n[
        R"                  " X5        US-  n[
        R$                  " S5        US:  d  M    O   [
        R&                  " SU5        [
        R$                  " S5      S-  [)        S5      :X  a  O	US:  a  GMx  UR+                  5         [
        R,                  " 5         [        SU SU  35        U$ )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 earlyd   g?   )P   r/   scaleFactorminNeighborsminSizer/   r   r   r      zCapturing: z/100r   gffffff?	training_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_paths                 r   collect_training_datarX   S   s   '',,x1KKKd+


0
1CE	7y
AB	
KL	
./
#+XXZ
||E3#5#56--dRS]e-f!LQ1aeGQ1uW,-H 2v!b&eVaeQU^[!LE[t#<qb&k33S+qJ 77<<ys45PQH/
 C C<' "* 	

-u5;;q>D CH,? #+B KKM	8?PQXPY
Z[Lr*   c            
        ^
 / / p[         R                  " [        5       GH*  n[         R                  R	                  [        U5      m
[         R                  R                  T
5      (       d  MN  / SQn[        U
4S jU 5       5      nU(       Ga  U H  n[         R                  R	                  T
U5      n[         R                  R                  U5      (       d  MI  [         R                  " U5       H  nUR                  S5      (       d  M  [         R                  R	                  Xg5      n[        R                  " U[        R                  5      n	U	c  Md  [        U	5      n	U R                  U	5        UR                  [        U5      5        M     M     GMu  [         R                  " T
5       H  nUR                  S5      (       d  M  [         R                  R	                  T
U5      n[        R                  " U[        R                  5      n	U	c  Me  [        U	5      n	U R                  U	5        UR                  [        U5      5        M     GM-     U (       d  [        S5        g[         R#                  U [$        R&                  " U5      5        [         R)                  [*        5        [        S[-        U 5       S[-        [/        U5      5       S35        g)	zNTrains LBPH face recognizer with additional preprocessing for better accuracy.)frontleftrightupdownc              3      >#    U  HB  n[         R                  R                  [         R                  R                  TU5      5      v   MD     g 7f)N)r:   r;   isdirr<   ).0anglerM   s     r   	<genexpr>(train_face_recognizer.<locals>.<genexpr>   s3     %ncmZ_bggmmBGGLLe4T&U&Ucms   A
Ar8   NzNo training data found.zTraining complete with z images from z users.)r:   listdirr=   r;   r<   r`   anyexistsendswithr	   imreadIMREAD_GRAYSCALEr)   r   r   r   
recognizertrainnparraysave
MODEL_FILElenset)rR   labelsrL   
angle_dirshas_angle_structurerb   angle_folderfilenamerW   imgrM   s             @r   train_face_recognizerry      s   6::h'ggll8W577==%%AJ"%%ncm%n"n"'E#%77<<U#CLww~~l33(*

<(@H'0088+-77<<+O&)jj3;O;O&P#&;$,&5c&: %S 1 &c'l ; )A ( !#

; 7H((00#%77<<X#F!jj33G3GH;$-c2S)c'l3 !8/ (B '(UBHHV,-OOJ	#CJ<}SV=M<Ng
VWr*   c                     [         R                  R                  [        5      (       d  [	        S5        g[
        R                  [        5        [        R                  " [        5      n  U R                  5       u  pU(       d  GO@[        R                  " U[        R                  5      n[        R                  USSSS9nU H  u  pVpxX6Xh-   2XUU-   24   n	[        U	5      n	[
        R                  U	5      u  pUS:  a!  SU
 S	[!        US
5       S3n[#        U
5        SnOSnSn[        R$                  " X%U4XW-   Xh-   4US
5        [        R&                  " X,XVS-
  4[        R(                  SUS
[        R*                  5        M     [        R,                  " SU5        [        R.                  " S5      S-  [1        S5      :X  a  OGM[  U R3                  5         [        R4                  " 5         g)zKRecognizes a user even if wearing glasses or has slight appearance changes.z3Error: Model file not found. Train the model first.Ng333333?   )2   r|   r0   r/   zUser: z (Acc: r5   z%)r4   Unknown)r   r   r   r   r   zFace Recognitionr   r9   )r:   r;   rg   rp   r   rk   r?   r	   r
   r   r@   rA   rB   rC   r)   predictroundlog_attendancerD   rE   rF   LINE_AArI   rH   rJ   r   rK   )r   rO   rP   rQ   rR   rS   rT   rU   rV   r'   rL   
confidencetextcolors                 r   recognize_userr      s   77>>*%%CDOOJ


0
1C
XXZ
||E3#5#56--dRS]e-f!LQ1aeGQ1uW,-H&x0H","4"4X">GByj!0D/ERHw'# #MM%Q!%BKKaR[#2J2JAuVWY\YdYde " 	

%u-;;q>D CH,1 4 KKMr*   c                 2   [         R                   R                  5       nUR                  S5      nUR                  S5      n[        R                  R                  [        5      (       dA  [        [        SSS9 n[        R                  " U5      nUR                  / SQ5        SSS5        [        [        SSS9 n[        R                  " U5      nUR                  X S	/5        [        U 5        SSS5        g! , (       d  f       N[= f! , (       d  f       g= f)
zGLogs attendance while ensuring a single check-in and check-out per day.z%Y-%m-%d %H:%M:%Sz%Y-%m-%drU   r   )newline)	TimestampzUser IDStatusNazCheck-in)datetimenowstrftimer:   r;   rg   LOG_FILEopencsvwriterwriterowsend_post_request)rL   r   	timestamptodayfiler   s         r   r   r      s    





!C01ILL$E77>>(##(C,ZZ%FOO>? - 
hR	(DD!Z89'" 
)	(	 -, 
)	(s   8*C795D7
D
Dc                 \   SU 0nSS0n [         R                  " [        XS9nUR                  S:X  a  [	        SU  SUR
                   35        g[	        SUR                   S	UR
                   35        g! [         R                  R                   a  n[	        S
U 35         SnAgSnAff = f)zSends attendance to API.rL   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   r   
exceptionsRequestException)rL   payloadr   responsees        r   r   r      s    '"G12G4==GM3&>wiG[\d\i\i[jkl+H,@,@+Ahmm_]^// 4.qc2334s   AA5 %A5 5B+B&&B+__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	   numpyrm   r:   r   r   r   CascadeClassifierdatahaarcascadesrB   eye_cascadefaceLBPHFaceRecognizer_createrk   AttributeErrorr   exitr   r=   r   rp   USER_ID_FILEr   r   r)   rX   ry   r   r   r   __name__r   r    r*   r   <module>r      sS   
  	  
  $$SXX%:%:=b%bc##CHH$9$9<Q$QR335J @"
!  ,F*/d+X\$N#"4 z
`a+,S=!%(9":;s]!#s]s]Os]./  W  	
efFs   ,D D'&D'