code: def __init__(
      self,
      num_dist: int = 0,
      random_movement: bool = True,
      topleft: Optional[Tuple[float, float]] = None,
      bottomright: Optional[Tuple[float, float]] = None,
      **kwargs,
  ):
      assert (
          type(random_movement) == bool
      ), "Random movement must be set to a boolean"
  
      assert topleft is None or all(
          0.0 <= t <= 1.0 for t in topleft
      ), "Topleft must be in the range [0, 1]"
      assert bottomright is None or all(
          0.0 <= b <= 1.0 for b in bottomright
      ), "Bottomright must be in the range [0, 1]"
  
      self.random_movement = random_movement
  
      if self.random_movement:
          self.origins = BaseCV2Augmenter.random_origins(
              topleft, bottomright
          )
      else:
          top, left = topleft or (0.01, 0.01)
          bottom, right = bottomright or (0.99, 0.99)
  
          y_vals = random.choices(
              np.linspace(top, bottom, num=15), k=num_dist
          )
          random.shuffle(y_vals)
  
          self.origins = [
              BaseCV2Augmenter.moving_origins(left, y_val, left, right)
              for y_val in y_vals
          ]
  
file_path: AugLy/augly/video/augmenters/cv2/base_augmenter.py
imports: import os
  import random
  import shutil
  from abc import ABC, abstractmethod
  from pathlib import Path
  from typing import Iterator, List, Optional, Tuple
  import cv2
  import numpy
  from augly import utils
  from augly.video.helpers import extract_frames_to_dir
label_desc: Use image node_id 1 to create a new BaseCV2Augmenter object from inherited base classes: ABC with example: obj = BaseCV2Augmenter(num_dist, random_movement, topleft, bottomright)