tof — драйвер датчика времяпролётного типа (time-of-flight)

Модуль tof управляет времяпролётными (ToF) датчиками определения расстояния, подключёнными к OpenMV Cam по I2C. Каждый кадр возвращает значение глубины для каждого пикселя в миллиметрах для сетки зон 8x8 (VL53L5CX / VL53L8CX), которое может быть отрисовано как отдельное изображение глубины с помощью snapshot() или скомпоновано поверх кадра в видимом свете с датчика CSI с помощью draw_depth(), обычно через цветовую палитру, такую как image.PALETTE_DEPTH.

Пример использования:

import csi
import tof

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

tof.init()

while True:
    img = csi0.snapshot()
    depth, depth_min, depth_max = tof.read_depth()
    tof.draw_depth(img, depth)
    print("====================")
    print("Min depth in mm seen: %0.2f" % depth_min)
    print("Max depth in mm seen: %0.2f" % depth_max)

Если вы хотите повернуть массив/изображение глубины на величину, кратную 90 градусам, передайте следующие комбинации hmirror/vflip/transpose в read_depth, draw_depth или snapshot:

  • vflip=False, hmirror=False, transpose=False -> поворот на 0 градусов

  • vflip=True,  hmirror=False, transpose=True -> поворот на 90 градусов

  • vflip=True,  hmirror=True,  transpose=False -> поворот на 180 градусов

  • vflip=False, hmirror=True,  transpose=True -> поворот на 270 градусов

Функции

tof.init(type: int = -1) None

Инициализирует встроенный датчик глубины.

type указывает тип TOF-датчика:

По умолчанию type равно -1, что заставляет tof.init() автоматически сканировать и инициализировать подключённый TOF-датчик на основе адреса I2C.

tof.reset() None

Сбрасывает состояние датчика глубины.

tof.deinit() None

Деинициализирует датчик глубины, освобождая ресурсы.

tof.width() int

Возвращает ширину (горизонтальное разрешение) используемого датчика глубины. Вызывает RuntimeError, если датчик не инициализирован.

tof.height() int

Возвращает высоту (вертикальное разрешение) используемого датчика глубины. Вызывает RuntimeError, если датчик не инициализирован.

tof.type() int

Возвращает тип используемого датчика глубины:

Вызывает RuntimeError, если датчик не инициализирован.

tof.refresh() int

Возвращает частоту обновления (в Гц) используемого датчика глубины:

Вызывает RuntimeError, если датчик не инициализирован.

tof.read_depth(hmirror: bool = False, vflip: bool = False, transpose: bool = False, timeout: int = 100) Tuple[List[float], float, float]

Возвращает кортеж, содержащий список глубин (width * height чисел с плавающей точкой в мм), минимальную наблюдаемую глубину и максимальную наблюдаемую глубину.

hmirror если True, горизонтально отражает массив глубины.

vflip если True, вертикально отражает массив глубины.

transpose если True, транспонирует массив глубины.

timeout сколько миллисекунд ждать новый кадр перед вызовом RuntimeError. Если 0, ждёт бесконечно.

tof.draw_depth(image: image.Image, depth: List[float], x: int = 0, y: int = 0, x_scale: float | None = None, y_scale: float | None = None, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: int = image.PALETTE_DEPTH, alpha_palette: int | None = None, hint: int = 0, scale: Tuple[float, float] | None = None) None

Рисует массив depth (как возвращается read_depth) на image, чей левый верхний угол начинается в позиции x, y.

x_scale управляет тем, насколько отображаемое изображение масштабируется в направлении x (число с плавающей точкой). Если это значение отрицательное, изображение будет отражено по горизонтали. Если не указано, оно совпадает с y_scale для сохранения соотношения сторон.

y_scale управляет тем, насколько отображаемое изображение масштабируется в направлении y (число с плавающей точкой). Если это значение отрицательное, изображение будет отражено по вертикали. Если не указано, оно совпадает с x_scale для сохранения соотношения сторон.

roi – это кортеж прямоугольника области интереса (x, y, w, h) исходного массива глубины для отрисовки.

rgb_channel – это RGB-канал (0=R, 1=G, 2=B) для извлечения из источника. -1 (по умолчанию) использует все каналы.

alpha управляет тем, насколько источник смешивается с целевым изображением. 255 – непрозрачно, 0 приводит к отсутствию изменений. Диапазон: 0-255.

color_palette – это перечисление цветовой палитры (например, image.PALETTE_DEPTH, image.PALETTE_RAINBOW) или 256-пиксельное RGB565-изображение, используемое как таблица соответствия цветов для значения глубины в оттенках серого.

alpha_palette если не None, – это 256-пиксельное GRAYSCALE-изображение, используемое как таблица соответствия альфа-канала, модулирующая alpha для каждого пикселя.

hint – это логическое ИЛИ из:

  • image.AREA: Использовать площадное масштабирование при уменьшении.

  • image.BILINEAR: Использовать билинейное масштабирование.

  • image.BICUBIC: Использовать бикубическое масштабирование.

  • image.CENTER: Центрировать изображение на целевом изображении.

  • image.HMIRROR: Отразить по горизонтали.

  • image.VFLIP: Отразить по вертикали.

  • image.TRANSPOSE: Транспонировать (поменять местами x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Применить извлечение rgb_channel перед масштабированием.

  • image.APPLY_COLOR_PALETTE_FIRST: Применить цветовую палитру перед масштабированием.

  • image.SCALE_ASPECT_KEEP: Вписать в целевое изображение с сохранением соотношения сторон.

  • image.SCALE_ASPECT_EXPAND: Заполнить целевое изображение с сохранением соотношения сторон (с обрезкой).

  • image.SCALE_ASPECT_IGNORE: Заполнить целевое изображение без учёта соотношения сторон (с растяжением).

  • image.ROTATE_90: Повернуть на 90 градусов.

  • image.ROTATE_180: Повернуть на 180 градусов.

  • image.ROTATE_270: Повернуть на 270 градусов.

scale – это кортеж из двух значений (min, max), управляющий минимальной и максимальной глубиной (в мм), используемой для масштабирования изображения глубины. По умолчанию – фактические минимум и максимум массива глубины.

Примечание

read_depth запоминает, был ли он вызван с transpose=True, и draw_depth использует это внутренне для определения размера исходного массива.

tof.snapshot(hmirror: bool = False, vflip: bool = False, transpose: bool = False, x_scale: float | None = None, y_scale: float | None = None, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: int = image.PALETTE_DEPTH, alpha_palette: int | None = None, hint: int = 0, scale: Tuple[float, float] | None = None, pixformat: int = image.RGB565, copy_to_fb: bool = False, timeout: int = 100) image.Image

Считывает кадр с датчика глубины и возвращает новый объект image.Image, который является либо image.GRAYSCALE, либо image.RGB565.

hmirror если True, горизонтально отражает новое изображение.

vflip если True, вертикально отражает новое изображение.

transpose если True, транспонирует новое изображение.

x_scale управляет тем, насколько изображение масштабируется в направлении x (число с плавающей точкой). Отрицательные значения отражают по горизонтали. Если не указано, совпадает с y_scale.

y_scale управляет тем, насколько изображение масштабируется в направлении y (число с плавающей точкой). Отрицательные значения отражают по вертикали. Если не указано, совпадает с x_scale.

roi – это кортеж прямоугольника области интереса (x, y, w, h) источника для извлечения.

rgb_channel – это RGB-канал (0=R, 1=G, 2=B) для извлечения. -1 (по умолчанию) использует все каналы.

alpha управляет смешиванием источника с целевым изображением. 255 – непрозрачно, 0 оставляет целевое изображение без изменений. Диапазон: 0-255.

color_palette – это перечисление цветовой палитры (например, image.PALETTE_DEPTH) или 256-пиксельное RGB565-изображение, используемое как таблица соответствия цветов.

alpha_palette если не None, – это 256-пиксельное GRAYSCALE-изображение, используемое как таблица соответствия альфа-канала.

hint – это логическое ИЛИ из:

  • image.AREA: Использовать площадное масштабирование при уменьшении.

  • image.BILINEAR: Использовать билинейное масштабирование.

  • image.BICUBIC: Использовать бикубическое масштабирование.

  • image.CENTER: Центрировать изображение на целевом изображении.

  • image.HMIRROR: Отразить по горизонтали.

  • image.VFLIP: Отразить по вертикали.

  • image.TRANSPOSE: Транспонировать (поменять местами x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Применить извлечение rgb_channel перед масштабированием.

  • image.APPLY_COLOR_PALETTE_FIRST: Применить цветовую палитру перед масштабированием.

  • image.SCALE_ASPECT_KEEP: Вписать в целевое изображение с сохранением соотношения сторон.

  • image.SCALE_ASPECT_EXPAND: Заполнить целевое изображение с сохранением соотношения сторон (с обрезкой).

  • image.SCALE_ASPECT_IGNORE: Заполнить целевое изображение без учёта соотношения сторон (с растяжением).

  • image.ROTATE_90: Повернуть на 90 градусов.

  • image.ROTATE_180: Повернуть на 180 градусов.

  • image.ROTATE_270: Повернуть на 270 градусов.

scale – это кортеж из двух значений (min, max), управляющий минимальной и максимальной глубиной (в мм), используемой для масштабирования изображения. По умолчанию – фактические минимум/максимум кадра.

pixformat управляет итоговым форматом пикселей изображения. Должен быть image.GRAYSCALE или image.RGB565.

copy_to_fb если True, записывает новое изображение в буфер кадра вместо его выделения в куче MicroPython.

timeout сколько миллисекунд ждать новый кадр перед вызовом RuntimeError. Если 0, ждёт бесконечно.

Константы

tof.TOF_VL53LX: int

TOF-датчик VL53L5CX или VL53L8CX (8x8 пикселей).