code: def __call__(self, video, landmarks):
      # Pre-process landmarks: interpolate frames that are not detected
      preprocessed_landmarks = self.interpolate_landmarks(landmarks)
      # Exclude corner cases: no landmark in all frames or number of frames is less than window length
      if not preprocessed_landmarks:
          return
      # Affine transformation and crop patch
      sequence = self.crop_patch(video, preprocessed_landmarks)
      assert sequence is not None, "crop an empty patch."
      return sequence
  
file_path: audio/examples/avsr/data_prep/detectors/retinaface/video_process.py
imports: import cv2
  import numpy
  from skimage import transform
label_desc: Use image node_id 2 for calling the VideoProcess obj's underlying member method code with example usage: obj.__call__(video, landmarks) and returns: sequence