
    6Fi                     D    d dl Z d dlZd dlmZ d dlZ G d d          ZdS )    N)YOLOc                   P    e Zd Zd Zd Zededefd            Zed             Z	dS )
Proctoringc                     t          d          | _        | j        j                                         t	          j        t          j        j        dd          | _        dS )z
        Load face detection (YOLOv8) and landmark detection (face_alignment) models.
        Use case: Detect faces and estimate head pose in a given frame.
        z'services/proctor/models/yolov8n-face.ptFcpu)
flip_inputdeviceN)	r   faceDetectormodelfuseface_alignmentFaceAlignmentLandmarksTypeTWO_Dfa)selfs    :D:\xampp\htdocs\new-grp\engine\services\proctor\proctor.py__init__zProctoring.__init__   sY    
 !!JKK$$&&& .(.
 
 
    c           
         |j         dd         \  }}| j                            |dd          d         }d}d}d}|j        D ]}t	          t
          |j        d                                                   \  }	}
}}d}|dz  }||
||	|f         }| j        	                    |          }|l|d         }|t          j        |	|
g          z  }t          j        |d	         |d
         |d         |d         |d         |d         gt          j                  }t          j        g dg dg dg dg dg dgt          j                  }|}t          j        |d|dz  gd||dz  gg dgt          j                  }t          j        d          }t          j        ||||          \  }}}|rKt          j        |          \  }}t          j        |d         dz  |d         dz  z             }|dk     rAt          j        |d          |d                   }t          j        |d          |          }d}n^t          j        |d         |d                   }t          j        |d          |          }t          j        |d         |d                   }t'          t          j        |          d          t'          t          j        |          d          t'          t          j        |          d          d } |||d!S )"z
        Analyze the frame to detect faces and compute head orientation.
        Returns:
            dict with keys: face_detected, people_count, head_pose (yaw, pitch, roll)
        Use case: Core vision engine for your proctoring system.
        N   i  F)sourceimgszverboser   T         $   -   0   6   )dtype)        r#   r#   )r#   gOg      ))gfffffE皙Y@@      :)gfffffE@r$   r%   )fffff<r&   皙8)gfffff<@r&   r'   )r   r   r   )   r   )r   r   )r   r   gư>)r   r   )r   r   )r   r   )r   r   )r   r   )yawpitchroll)face_detectedpeople_count	head_pose)shaper
   predictboxesmapintxyxytolistr   get_landmarks_from_imagenparrayfloat64zeroscv2solvePnP	Rodriguessqrtarctan2rounddegrees)r   framehwpredsfaceDetectedpeopleCountheadPoseboxx1y1x2y2faceCrop	landmarkslmimagePointsmodelPointsfocalLengthcameraMatrix
distCoeffssuccessrot_Rsyxyzs                                r   analyzeFramezProctoring.analyzeFrame   s<    {2A21!))c5)QQRST; ?	 ?	C chqk&8&8&:&:;;NBBL1KRUBrE\*H88BBI 1B"(B8$$$B (212222$ Z! ! !K (###$$$###%%%$$$$ Z! ! !K K8aQ'KQ'		% Z	! ! !L &))J!l;\S]^^OGS! }S))1WQtWaZ!D'1*45599
AdG8QtW55A
AdG8R00AAA
1T7AdG44A
AdG8R00A
1T7AdG44A !A22"2:a==!44!"*Q--33   *'!
 
 	
r   emotionsreturnc                     | d         | d         z   | d         z   dz  }| d         | d         z   dz  }| d         }| d         }| d         }|||||d	}t          ||j        
          S )Nfearangrydisgust   happyneutralr   sad)nervousrelaxedrf   rh   rb   )key)maxget)r_   ri   rj   rf   rh   rb   	composites          r   fuseEmotionszProctoring.fuseEmotionsh   s    F#hw&77(9:MMQRRG$x	'::a?!uo
 
	 9)-0000r   c                    g }| dk    r|                     d           n| dk     r|                     d           |dk    r|                     d           n|dk     r|                     d           |d	k    r|                     d
           n|dk     r|                     d           |rd                    |          ndS )N   zlooking rightizlooking left   zlooking downr   z
looking up   zhead tilted rightizhead tilted leftz, zfacing forward)appendjoin)r)   r*   r+   orientations       r   describeHeadPosezProctoring.describeHeadPosey   s    88[''88883YY**>:::3;;**>::::RZZ++L999"99k(()<====CZZ++,>???)4Jtyy%%%:JJr   N)
__name__
__module____qualname__r   r^   staticmethoddictstrro   rw    r   r   r   r      s        
 
 
S
 S
 S
h 1t 1 1 1 1 \1  K K \K K Kr   r   )r;   numpyr7   ultralyticsr   r   r   r~   r   r   <module>r      s~    



              |K |K |K |K |K |K |K |K |K |Kr   