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-датчика:tof.TOF_VL53LX: 8x8 пикселей.
По умолчанию
typeравно-1, что заставляетtof.init()автоматически сканировать и инициализировать подключённый TOF-датчик на основе адреса I2C.
- tof.width() int¶
Возвращает ширину (горизонтальное разрешение) используемого датчика глубины. Вызывает
RuntimeError, если датчик не инициализирован.
- tof.height() int¶
Возвращает высоту (вертикальное разрешение) используемого датчика глубины. Вызывает
RuntimeError, если датчик не инициализирован.
- tof.type() int¶
Возвращает тип используемого датчика глубины:
Вызывает
RuntimeError, если датчик не инициализирован.
- tof.refresh() int¶
Возвращает частоту обновления (в Гц) используемого датчика глубины:
tof.TOF_VL53LX: 15 Гц.
Вызывает
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, ждёт бесконечно.