Source code for neurokit2.video.video_face
import numpy as np
from ..misc import progress_bar
[docs]
def video_face(video, verbose=True):
    """**Extract face from video**
    This function extracts the faces from a video. This function requires the `cv2, `menpo` and
    `menpodetect` modules to be installed.
    .. note::
        This function is experimental. If you are interested in helping us improve that aspect of
        NeuroKit (e.g., by adding more detection algorithms), please get in touch!
    Parameters
    ----------
    video : np.ndarray
        An video data numpy array of the shape (frame, channel, height, width)
    verbose : bool
        Whether to print the progress bar.
    Returns
    -------
    list
        A list of cropped faces.
    Examples
    --------
    .. ipython:: python
      import neurokit2 as nk
      # video, sampling_rate = nk.read_video("video.mp4")
      # faces = nk.video_face(video)
      # nk.video_plot([video, faces])
    """
    faceboxes = np.full([len(video), 3, 500, 500], 0)
    for i, frame in progress_bar(video, verbose=verbose):
        faces = _video_face_landmarks(frame)
        if len(faces) > 0:
            faceboxes[i, :, :, :] = _video_face_crop(frame, faces[0])
    return faceboxes.astype("uint8") 
# ==============================================================================
# Internals
# ==============================================================================
def _video_face_crop(frame, face):
    # Try loading cv2
    try:
        import cv2
    except ImportError:
        raise ImportError(
            "The 'cv2' module is required for this function to run. ",
            "Please install it first (`pip install opencv-python`).",
        )
    facebox = face.as_vector().reshape(-1, 2).astype(int)
    # Crop
    img = frame[:, facebox[0, 0] : facebox[1, 0], facebox[0, 1] : facebox[2, 1]]
    # Resize
    img = cv2.resize(img.swapaxes(0, 1).swapaxes(1, 2), (500, 500))
    return img.swapaxes(0, 2).swapaxes(1, 2).astype(int)
def _video_face_landmarks(frame):
    # Try loading menpo
    try:
        import menpo.io
        import menpo.landmark
        import menpodetect
    except ImportError:
        raise ImportError(
            "The 'menpo' and 'menpodetect' modules are required for this function to run. ",
            "Please install them first (`pip install menpo` and `pip install menpodetect`).",
        )
    img = menpo.image.Image(frame, copy=True)
    img_bw = img.as_greyscale()
    # Face detection
    faces = menpodetect.load_opencv_frontal_face_detector()(img_bw)
    # Eyes detection
    # eyes = menpodetect.load_opencv_eye_detector()(img_bw)
    return faces