tof — Драйвер датчика часу прольоту¶
Модуль 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значень типу float у мм), мінімальну виміряну глибину та максимальну виміряну глибину.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, чекає нескінченно.