
    hO                         S r SSKrSSKrSSKrSSKJrJr  SSK	r	SSK
r
SSKrSSKJr  SSKrSSKJrJr  \R"                  " S5         " S S5      r\S	:X  a  \" 5       r\R+                  5         gg)
zg
Basic Standalone Face Recognition Application
Features: Real-time detection, recognition, and history
    N)ttk
messagebox)datetime)ImageImageTkdarkc                   z    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)FaceRecognitionApp   c                 X   [         R                  " 5       U l        U R                  R                  S5        U R                  R	                  S5        SU l        S U l        S U l        S U l        0 U l	        SU l
        U R                  5         U R                  5         U R                  5         g )NFace Recognition System1200x800Fr   )ctkCTkroottitlegeometry
is_runningcapface_cascade
recognizer	user_datacurrent_camera_indexload_models	create_uistart_cameraselfs    standalone_face_recognition.py__init__FaceRecognitionApp.__init__   s    GGI			12		:&   $%! 	 	 	    c                 D    Sn[         R                  R                  U5      (       d  [        R                  " SSU 35        g[
        R                  " U5      U l        Sn[         R                  R                  U5      (       d  [        R                  " SSU 35        g[
        R                  R                  5       U l
        U R                  R                  U5        [         R                  R                  S5      (       aS  [        SS5       n[        R                  " U5      U l        SSS5        [!        S	[#        U R                  5       S
35        g[!        S5        g! , (       d  f       N== f! [$         a$  n[        R                  " SSU 35         SnAgSnAff = f)z*Load face detection and recognition modelsz#haarcascade_frontalface_default.xmlErrorzFace cascade file not found: Nzface_recognizer.ymlz Face recognizer file not found: zuser_data.jsonru   ✅ Loaded z usersu   ⚠️ No user_data.json foundzFailed to load models: )ospathexistsr   	showerrorcv2CascadeClassifierr   faceLBPHFaceRecognizer_creater   readopenjsonloadr   printlen	Exception)r   cascade_pathrecognizer_pathfes        r   r   FaceRecognitionApp.load_models-   s=   	I@L77>>,//$$W0Ml^.\] # 5 5l CD 4O77>>/22$$W0PQ`Pa.bc!hh@@BDOOO  1 ww~~.//*C0A%)YYq\DN 1C$7#8?@67	 10  	I  ,CA3*GHH	IsD   A E1 AE1 A.E1 E )*E1 E1  
E.*E1 1
F;FFc           	      P   [         R                  " U R                  5      nUR                  SSSSS9  [         R                  " US[         R
                  " SSS9S	9nUR                  S
S9  [         R                  " U5      nUR                  SSS9  [         R                  " U5      nUR                  SSSSS9  [         R                  " U5      nUR                  S
S9  [         R                  " USSSS9U l        U R                  R                  SSS9  [         R                  " U5      nUR                  SS
S9  [         R                  " USU R                  S9U l	        U R                  R                  SSSS9  [         R                  " USU R                  SS9U l        U R                  R                  SSSS9  [         R                  " USU R                  S9nUR                  S S!SS9  [         R                  " US"[         R
                  " S#S$9S	9U l        U R                  R                  SS9  [         R                  " U5      nUR                  S SSS%9  [         R                  " US&[         R
                  " S'SS9S	9n	U	R                  SS9  S(n
[        R                  " XS)S*S+9U l        U R                   R#                  S,S,S-9  U R                   R#                  S.S.S-9  U R                   R#                  S/S/S-9  U R                   R#                  S0S0S-9  U R                   R%                  S,S1S29  U R                   R%                  S.S1S29  U R                   R%                  S/S3S29  U R                   R%                  S0S4S29  [        R&                  " US5U R                   R(                  S69nU R                   R+                  UR,                  S79  U R                   R                  SSSS8S9  UR                  S S9SS:9  [         R                  " US;U R.                  S9nUR                  SS9  g<)=zCreate the user interfacebothT
   )fillexpandpadxpadyr      boldsizeweighttextfont)r      r@   )r=   r>   left)r   r<   )sider=   r>   r?   zCamera Loading...  ih  )rG   widthheight)r?   r@   x)r=   r@   zStart RecognitionrG   command)r<      )rL   r?   r@   zStop Recognitiondisabled)rG   rR   staterS   Settingsright)rS   r<   zStatus: Ready   rD   )rL   r=   r>   zRecognition History   )TimeUser
ConfidenceStatusheadings   )columnsshowrO   r[   rG   r\   r]   r^   x   )rN   d   P   vertical)orientrR   )yscrollcommand)r<   r   y)rL   r=   r?   zClear HistoryN)r   CTkFramer   packCTkLabelCTkFontcamera_label	CTkButtonstart_recognitionstart_buttonstop_recognitionstop_buttonopen_settingsstatus_labelr   Treeviewhistory_treeheadingcolumn	Scrollbaryview	configuresetclear_history)r   
main_frametitle_labelcontent_frame
left_framecamera_framecontrols_framesettings_buttonright_framehistory_titlera   history_scrollbarclear_buttons                r   r   FaceRecognitionApp.create_uiJ   s    \\$)),
VDrC ll:4M&)kkr&&IKg& Z0t4 \\-0
V&GL ||J/w'  LL<O-0>BR0 j173MM.?R040F0FHFrB==>P/3/D/DJX6; --Z-1-?-?A'bA  LL/,/KKR,@BG, ll=1gF4@ [7L(+F(KM( ;LLJ_ab 	!!&v!6!!&v!6!!,\!B!!(!: 	  s 3  s 3  S 9   4  MM+jRVRcRcRiRij##3D3H3H#IF7SG#GD }}[+/+=+=?r"r"   c                 .    [         R                  " U R                  5      U l        U R                  R	                  5       (       d%  [
        R                  " SSU R                   35        gU R                  R                  [         R                  S5        U R                  R                  [         R                  S5        [        SU R                   S35        g! [         a1  n[
        R                  " SSU R                   S	U 35         SnAgSnAff = f)
zInitialize and start the camerar$   zCould not open camera Ni  rM   u   ✅ Camera z started successfullyzFailed to start camera z: )r*   VideoCapturer   r   isOpenedr   r)   r~   CAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTr2   r4   )r   r8   s     r   r   FaceRecognitionApp.start_camera   s    	f''(A(ABDH88$$&&$$W0FtG`G`Fa.bc HHLL1137HHLL22C8K 9 9::OPQ 	f  ,CDD]D]C^^`ab`c*dee	fs   A(C +A-C 
D#'DDc                 H   U R                   (       d  SU l         U R                  R                  SS9  U R                  R                  SS9  U R                  R                  SS9  [
        R                  " U R                  SS9U l        U R                  R                  5         gg)	zStart face recognition loopTrT   rU   normalzStatus: Recognition Activerc   )targetdaemonN)
r   rr   r}   rt   rv   	threadingThreadrecognition_looprecognition_threadstartr   s    r   rq   $FaceRecognitionApp.start_recognition   s    "DO''j'9&&X&6''-I'J '0&6&6d>S>S\`&aD###))+ r"   c                     SU l         U R                  R                  SS9  U R                  R                  SS9  U R                  R                  SS9  g)zStop face recognition loopFr   r   rT   zStatus: Stoppedrc   N)r   rr   r}   rt   rv   r   s    r   rs   #FaceRecognitionApp.stop_recognition   sO    ##(#3"""4##):#;r"   c           
      H   U R                   (       GaB   U R                  R                  5       u  pU(       d  M8  [        R                  " U[        R
                  5      n[        R                  " U[        R                  5      nU R                  R                  USS5      nU GH,  u  pgp[        R                  " X6U4Xh-   Xy-   4SS5        Sn
[        R                  " X6U4Xj-   U4SS5        [        R                  " X6U4XgU
-   4SS5        [        R                  " X6U-   U
-
  U4Xh-   U4SS5        [        R                  " X6U-   U4Xh-   Xz-   4SS5        [        R                  " X6Xy-   U
-
  4XgU	-   4SS5        [        R                  " X6Xy-   4Xj-   Xy-   4SS5        [        R                  " X6U-   U
-
  Xy-   4Xh-   Xy-   4SS5        [        R                  " X6U-   Xy-   U
-
  4Xh-   Xy-   4SS5        U R                  (       d  GM^  [        U5      S:  d  GMp  XGXy-   2XfU-   24   n[        R                  " US5      n U R                  R                  U5      u  pU R                  R!                  [#        U5      S	U 35      nU S
US S3n[        R$                  " X?XgS-
  4[        R&                  SSS5        US:  a  U R)                  XS5        GM,  GM/     [.        R0                  " U5      n[2        R4                  " U5      nU R6                  R9                  USS9  UU R6                  l        [        R<                  " S5        U R                   (       a  GMA  gg! [*         a  n[-        SU 35         SnAGM  SnAff = f! [*         a  n[-        SU 35         SnAGM  SnAff = f)zMain recognition loop皙?   )r      r      rI      r   )   r   zUser  (.1f)r<   gffffff?re   
RecognizedzRecognition error: N )imagerG      zError in recognition loop: )r   r   r.   r*   cvtColorCOLOR_BGR2RGBCOLOR_BGR2GRAYr   detectMultiScale	rectangleliner   r3   resizepredictr   getstrputTextFONT_HERSHEY_SIMPLEXadd_to_historyr4   r2   r   	fromarrayr   
PhotoImagero   r}   r   waitKey)r   retframe	frame_rgbgrayfacesrP   rj   whcorner_sizeface_roiuser_id
confidence	user_namerG   r8   	frame_pilframe_tks                      r   r   #FaceRecognitionApp.recognition_loop   sV   oooD!XX]]_
  LL0A0AB	 ||E3+=+=>))::4aH %*LQ1MM)Vac13ZaP #%KHHYA!0DkSTUHHYAO0DkSTUHHYQ)<a(@15!*k[\]HHYQ
QUAO4Lk[\]HHYAEK,?(@1!e*k[\]HHYAE
Q_ae4Lk[\]HHYQ)<ae(DquaenVacdeHHYQ0C(DquaenVacde 3u:>#'!#q1u#5#&::h
#C=26//2I2I(2S/G )-(:(:3w<5QXPYIZ([I '0[:c2B!#DDKK	!rT&)&>&>[RSU  *C/ $ 3 3I< X  0I %*V "OOI6	"--i8 !!++(+D*2!!' BC oooj  ) =!$7s";<<=  3A378sU   #M= GM=  M= %M= 8BMA5M= 
M: M5.M= 5M::M= =
N!NN!c                     [         R                  " 5       R                  S5      nU R                  R	                  SSXAUS U4S9  [        U R                  R                  5       5      S:  a7  U R                  R                  U R                  R                  5       S   5        g	g	! [         a  n[        SU 35         S	nAg	S	nAff = f)
z!Add recognition result to historyz%H:%M:%Sr   r   r   )valuesre   zError adding to history: N)
r   nowstrftimerx   insertr3   get_childrendeleter4   r2   )r   r   r   status	timestampr8   s         r   r   !FaceRecognitionApp.add_to_history  s    	3 //
;I $$RIZX[L\_e3f$g 4$$1134s:!!(():):)G)G)I")MN ;  	3-aS122	3s   B!B% %
C/CCc                 |    U R                   R                  5        H  nU R                   R                  U5        M      g)zClear recognition historyN)rx   r   r   )r   items     r   r    FaceRecognitionApp.clear_history  s/    %%224D$$T* 5r"   c           	         [         R                  " U R                  5      nUR                  S5        UR	                  S5        UR                  U R                  5        UR                  5         [         R                  " US[         R                  " SSS9S9nUR                  SS	9  [         R                  " U5      nUR                  S
SSS9  [         R                  " US[         R                  " SSS9S9R                  SS	9  U R                  5       nU(       a  [         R                  " [        U R                  5      S9n[         R                  " UUUU R                   S9nUR                  SS	9  [         R                  " USU R#                  U R                  SS5       3[         R                  " SS9S9nUR                  SS	9  [         R$                  " USU R&                  S9nUR                  SS	9  O5[         R                  " US[         R                  " SS9S9R                  SS	9  [         R                  " U5      n	U	R                  S
SSS9  [         R                  " U	S[         R                  " SSS9S9R                  SS	9  [         R(                  " U	SSSS9n
U
R+                  S5        U
R                  SS	9  [         R                  " U5      nUR                  S
SSS9  [         R                  " US[         R                  " SSS9S9R                  SS	9  [         R(                  " US S!SS9nUR+                  S"5        UR                  SS	9  [         R$                  " US#UR,                  S9nUR                  SS	9  g$)%zOpen settings dialogrV   500x500zRecognition SettingsrZ   rB   rC   rF   rI   rJ   rP   r<   )r=   r?   r@   zCamera Selection:rX   rS   )value)r   variablerR   z	Current: r      rY   zRefresh CamerasrQ   zNo cameras detectedzConfidence Threshold:2   r      )from_tonumber_of_stepsre   zDetection Sensitivity:g      ?g       @r   CloseN)r   CTkToplevelr   r   r   	transientgrab_setrm   rn   rl   rk   get_available_cameras	StringVarr   r   CTkOptionMenuon_camera_changeget_camera_display_namerp   refresh_cameras	CTkSliderr~   destroy)r   settings_windowr   r   available_cameras
camera_varcamera_dropdowncamera_inforefresh_buttonconfidence_frameconfidence_slidersensitivity_framesensitivity_sliderclose_buttons                 r   ru    FaceRecognitionApp.open_settings"  s   //$))4j)  +!!$)),  " _3I #F CE


 ||O4s"5\(;"V<	>>Bddl !668S1J1J-KLJ!//5F7A6:6K6KMO   a ( ,,|,5d6R6RSWSlSlnoqr6s5t*u*-++2*>@K !$ !]]<>O040D0DFNQ'LL,A [[b13374Q4< <<83Rb9%,C"V<	>>BddlMM*:"^abc"A&  LL9Cbr:&-E"V<	>>Bddl ]]+<CCades#Q' }}_7+:+B+BDr"r"   c                    / n[        S5       H  n[        R                  " U5      nUR                  5       (       d  M0  [	        UR                  [        R                  5      5      n[	        UR                  [        R                  5      5      nU R                  X$U5      nUR                  U5        UR                  5         M     U$ )z3Get list of available cameras with meaningful namesr<   )ranger*   r   r   intr   r   r   r   appendrelease)r   r   ir   rN   rO   camera_names          r   r   (FaceRecognitionApp.get_available_camerasi  s     rA""1%C||~~CGGC$<$<=>SWWS%>%>?@ #::1VL!((5  ! r"   c                     [         R                  " 5       nUS:X  a  US:  d  US:  a	  SU SU S3$ SU SU S3$ US:X  a  S	U;   d  S
U;   a	  SU SU S3$ SU SU S3$ SU SU SU S3$ ! [         a  nSU SU SU S3s SnA$ SnAff = f)z,Get a meaningful display name for the camerar   i  i8  zMacBook Built-in Camera (rP   r   zBuilt-in Camera (   AVFoundationDarwinziPhone/External Camera (zExternal Camera (zCamera r   N)r*   getBackendNamer4   )r   indexrN   rO   backendr8   s         r   r   *FaceRecognitionApp.get_camera_display_name}  s    	8((*G zD=FdN6ugQvhaHH.ugQvha@@!!W,G0C5eWAfXQGG.ugQvha@@ !r%&;; 	8UG2eWAfXQ77	8s3   /A+ A+ A+ A+ A+ +
B5B BBc                     U R                  U5      nUb  X R                  :w  a  U R                  (       a9  U R                  R                  5       (       a  U R                  R	                  5         X l        U R                  5         U R                  USS5      nU R                  R                  SU 3S9  ggg! [         a  n[        SU 35         SnAgSnAff = f)zHandle camera selection changeNr   zStatus: Switched to rc   zError changing camera: )extract_camera_indexr   r   r   r   r   r   rv   r}   r4   r2   )r   camera_selectioncamera_indexr  r8   s        r   r   #FaceRecognitionApp.on_camera_change  s    	1445EFL'L<U<U,U88 1 1 3 3HH$$& -9) !!# #::<AN!!++3G}1U+V -V'  	1+A3/00	1s   B2B7 7
CCCc                 ~    SU;   aQ  UR                  5       n[        U5       H1  u  p4US:X  d  M  US-   [        U5      :  d  M!  [        X#S-      5      s  $    OSU;   a  gSU;   d  SU;   a  gSSKnUR                  SU5      nU(       a  [        US   5      $  g! [         a  n[        S	U 35         SnAgSnAff = f)
z1Extract camera index from camera selection stringCamerar  zBuilt-inr   iPhoneExternalNz\d+zError extracting camera index: )split	enumerater3   r   refindallr4   r2   )r   r  partsr  partr  numbersr8   s           r   r  'FaceRecognitionApp.extract_camera_index  s    	9++(..0(/GAx'AECJ,>"5Q<00  0 //--?O1O jj)9:G71:&    	93A3788	9s4   *B B B 	B  B -*B 
B<$B77B<c                 2    [         R                  " SS5        g)zRefresh available cameras listRefreshz@Camera list refreshed. Close and reopen settings to see changes.N)r   showinfor   s    r   r   "FaceRecognitionApp.refresh_cameras  s     	I'ijr"   c                     SU l         U R                  (       a  U R                  R                  5         U R                  R	                  5         g)zHandle application closingFN)r   r   r   r   r   r   s    r   
on_closingFaceRecognitionApp.on_closing  s0    88HH		r"   c                     U R                   R                  SU R                  5        U R                   R                  5         g)zRun the applicationWM_DELETE_WINDOWN)r   protocolr"  mainloopr   s    r   runFaceRecognitionApp.run  s+    		-t?		r"   )ro   r   r   r   rx   r   r   r   r   rr   rv   rt   r   N)__name__
__module____qualname____firstlineno__r    r   r   r   rq   rs   r   r   r   ru   r   r   r   r  r   r"  r(  __static_attributes__ r"   r   r
   r
      s`    ,I:U#nf"
,<GR3+
E#N!(86104kr"   r
   __main__)__doc__r*   numpynpcustomtkinterr   tkinterr   r   r&   r0   csvr   r   PILr   r   set_appearance_moder
   r*  appr(  r/  r"   r   <module>r:     sg   
    # 	  
       D DL z

CGGI r"   