tof --- 飛時測距感測器驅動程式¶
tof 模組驅動透過 I2C 連接至 OpenMV Cam 的飛時測距(ToF)感測器。每個影格會回傳 8x8 區域網格(VL53L5CX / VL53L8CX)中以毫米為單位的每像素深度值,這些值可使用 snapshot() 算繪為獨立的深度影像,或使用 draw_depth() 合成至來自 CSI 感測器的可見光影格上,通常透過 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()根據 I2C 位址自動掃描並初始化所連接的 TOF 感測器。
- tof.refresh() int¶
回傳使用中深度感測器的重新整理率(以 Hz 為單位):
tof.TOF_VL53LX:15 Hz。
若感測器未初始化則引發
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 查詢表,逐像素調節alpha。hint是下列各項的邏輯 OR: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 影像,作為 alpha 查詢表。hint是下列各項的邏輯 OR: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則永久等待。