
    ih                     R    d dl Z d dlmZmZ d dlZd dlZd dlmZm	Z	  G d de      Z
y)    N)AnyList)DetectorFacialAreaRegionc                       e Zd ZdZd Zd Zdej                  dee	   fdZ
dej                  defdZddefdZdefd	Zy
)OpenCvClientzP
    Class to cover common face detection functionalitiy for OpenCv backend
    c                 .    | j                         | _        y )N)build_modelmodel)selfs    W/var/www/html/dev/engine/venv/lib/python3.12/site-packages/deepface/detectors/OpenCv.py__init__zOpenCvClient.__init__   s    %%'
    c                 Z    i }| j                  d      |d<   | j                  d      |d<   |S )z
        Build opencv's face and eye detector models
        Returns:
            model (dict): including face_detector and eye_detector keys
        haarcascadeface_detectorhaarcascade_eyeeye_detector)_OpenCvClient__build_cascade)r   detectors     r   r
   zOpenCvClient.build_model   s9     $($8$8$G!#'#7#78I#J r   imgreturnc                    g }d}g }	 | j                   d   j                  |ddd      \  }}}t        |      dkD  rt        |      D ]}  \  \  }}}	}
}|t	        |      t	        ||
z         t	        |      t	        ||	z         f   }| j                  |      \  }}t        |||	|
||d	|z
  d	z  
      }|j                  |        |S #  Y xY w)z
        Detect and align face with opencv

        Args:
            img (np.ndarray): pre-loaded image as numpy array

        Returns:
            results (List[FacialAreaRegion]): A list of FacialAreaRegion objects
        Nr   皙?
   T)outputRejectLevelsr   )r   d   )xywhleft_eye	right_eye
confidence)r   detectMultiScale3lenzipint	find_eyesr   append)r   r   respdetected_facefaces_scoresr   r   r    r!   r$   r"   r#   facial_areas                  r   detect_faceszOpenCvClient.detect_faces   s    	  $zz/:LLS"  M  E1f u:>,/v,> )(Aq!j #CFSQZ$7Q#a!e*9L$L M&*nnn&G#).%' #j 0C7 K() %	s   &C
 
Cc                    d}d}|j                   d   dk(  s|j                   d   dk(  r||fS t        j                  |t        j                        }| j                  d   j                  |dd      }t        |d d	      }t        |      d
k\  rz|d   }|d   }|d   |d   k  r|}|}n|}|}t        |d   |d
   d
z  z         t        |d   |d   d
z  z         f}t        |d   |d
   d
z  z         t        |d   |d   d
z  z         f}||fS )z
        Find the left and right eye coordinates of given image
        Args:
            img (np.ndarray): given image
        Returns:
            left and right eye (tuple)
        Nr      r   r   r   c                 *    t        | d   | d   z        S )N      )abs)vs    r   <lambda>z(OpenCvClient.find_eyes.<locals>.<lambda>a   s    #adQqTk*: r   T)keyreverser5   r6   )	shapecv2cvtColorCOLOR_BGR2GRAYr   detectMultiScalesortedr&   r(   )r   r   r"   r#   detected_face_grayeyeseye_1eye_2s           r   r)   zOpenCvClient.find_eyesE   sP    	 99Q<1		! 1Y&& \\##
 zz.)::;MsTVW d :DI t9> GEGEQx%(" !	 !	 HQK8A;?;<c(1+QYZ[Q\_`Q`Ba>bcHIaLIaL1$456IaLIaL1$456I ""r   c                 ~   | j                         }|dk(  rK|dz   }t        j                  j                  |      dk7  rt	        d|d      t        j                  |      }|S |dk(  rK|dz   }t        j                  j                  |      dk7  rt	        d|d      t        j                  |      }|S t	        d|       )	zb
        Build a opencv face&eye detector models
        Returns:
            model (Any)
        r   z#haarcascade_frontalface_default.xmlTzDConfirm that opencv is installed on your environment! Expected path z
 violated.r   zhaarcascade_eye.xmlz-unimplemented model_name for build_cascade - )_OpenCvClient__get_opencv_pathospathisfile
ValueErrorr=   CascadeClassifier)r   
model_nameopencv_pathface_detector_pathr   eye_detector_paths         r   __build_cascadezOpenCvClient.__build_cascadez   s     ,,.&!,/T!Tww~~01T9 Z&  
 ,,-?@H  ,, +.C Cww~~/0D8 Z%  
 ,,->?H
  LZLYZZr   c                     t         j                  }|j                  t        j                  j
                        dd }|d   }|dd D ]
  }|dz   |z   } |dz   S )ze
        Returns where opencv installed
        Returns:
            installation_path (str)
        r   r3   N/z/data/)r=   __file__splitrH   rI   sep)r   opencv_homefoldersrI   folders        r   __get_opencv_pathzOpenCvClient.__get_opencv_path   sd     ll##BGGKK026qzabk 	'F#:&D	' hr   N)r   )__name__
__module____qualname____doc__r   r
   npndarrayr   r   r1   tupler)   r   r   strrG    r   r   r   r      s`    (	(

 (t4D/E (T3#RZZ 3#E 3#j3 @3 r   r   )rH   typingr   r   r=   numpyr`   deepface.models.Detectorr   r   r   rd   r   r   <module>rh      s"    	  
  ?_8 _r   