tof — driver de sensor time-of-flight¶
O módulo tof aciona sensores de medição de distância time-of-flight (ToF) conectados a uma OpenMV Cam via I2C. Cada quadro retorna um valor de profundidade por pixel em milímetros para uma grade de zonas 8x8 (VL53L5CX / VL53L8CX), que pode ser renderizada como uma imagem de profundidade independente com snapshot() ou composta sobre um quadro de luz visível do sensor CSI com draw_depth(), normalmente por meio de uma paleta de cores como image.PALETTE_DEPTH.
Exemplo de uso:
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)
Se você quiser rotacionar o array/imagem de profundidade em múltiplos de 90 graus, passe as seguintes combinações de hmirror/vflip/transpose para read_depth, draw_depth ou snapshot:
vflip=False, hmirror=False, transpose=False-> rotação de 0 graus
vflip=True, hmirror=False, transpose=True-> rotação de 90 graus
vflip=True, hmirror=True, transpose=False-> rotação de 180 graus
vflip=False, hmirror=True, transpose=True-> rotação de 270 graus
Funções¶
- tof.init(type: int = -1) None¶
Inicializa um sensor de profundidade integrado.
typeindica o tipo de sensor TOF:tof.TOF_VL53LX: 8x8 pixels.
Por padrão,
typeé-1, o que faz com quetof.init()escaneie e inicialize automaticamente um sensor TOF conectado com base no endereço I2C.
- tof.width() int¶
Retorna a largura (resolução horizontal) do sensor de profundidade em uso. Levanta um
RuntimeErrorse o sensor não estiver inicializado.
- tof.height() int¶
Retorna a altura (resolução vertical) do sensor de profundidade em uso. Levanta um
RuntimeErrorse o sensor não estiver inicializado.
- tof.type() int¶
Retorna o tipo do sensor de profundidade em uso:
Levanta um
RuntimeErrorse o sensor não estiver inicializado.
- tof.refresh() int¶
Retorna a taxa de atualização (em Hz) do sensor de profundidade em uso:
tof.TOF_VL53LX: 15 Hz.
Levanta um
RuntimeErrorse o sensor não estiver inicializado.
- tof.read_depth(hmirror: bool = False, vflip: bool = False, transpose: bool = False, timeout: int = 100) Tuple[List[float], float, float]¶
Retorna uma tupla contendo a lista de profundidade (
width * heightfloats em mm), a profundidade mínima observada e a profundidade máxima observada.hmirrorseTrueespelha horizontalmente o array de profundidade.vflipseTrueinverte verticalmente o array de profundidade.transposeseTruetranspõe o array de profundidade.timeoutquantos milissegundos aguardar pelo novo quadro antes de levantar umRuntimeError. Se0, aguarda indefinidamente.
- 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¶
Desenha um array
depth(como retornado porread_depth) sobreimage, cujo canto superior esquerdo começa na localizaçãox,y.x_scalecontrola o quanto a imagem exibida é escalada na direção x (float). Se este valor for negativo, a imagem será espelhada horizontalmente. Se não especificado, corresponde ay_scalepara manter a proporção.y_scalecontrola o quanto a imagem exibida é escalada na direção y (float). Se este valor for negativo, a imagem será espelhada verticalmente. Se não especificado, corresponde ax_scalepara manter a proporção.roié a tupla de retângulo da região de interesse(x, y, w, h)do array de profundidade de origem a desenhar.rgb_channelé o canal RGB (0=R, 1=G, 2=B) a extrair da origem.-1(padrão) usa todos os canais.alphacontrola o quanto da origem é mesclado na imagem de destino.255é opaco,0resulta em nenhuma modificação. Faixa: 0-255.color_paletteé um enum de paleta de cores (por exemplo,image.PALETTE_DEPTH,image.PALETTE_RAINBOW) ou uma imagem RGB565 de 256 pixels usada como tabela de consulta de cores sobre o valor de profundidade em escala de cinza.alpha_palettese não forNoneé uma imagem GRAYSCALE de 256 pixels usada como tabela de consulta de alpha que modulaalphapor pixel.hinté um OR lógico de:image.AREA: Usa escalonamento por área ao reduzir a escala.image.BILINEAR: Usa escalonamento bilinear.image.BICUBIC: Usa escalonamento bicúbico.image.CENTER: Centraliza a imagem no destino.image.HMIRROR: Espelha horizontalmente.image.VFLIP: Inverte verticalmente.image.TRANSPOSE: Transpõe (troca x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Aplica a extração de rgb_channel antes do escalonamento.image.APPLY_COLOR_PALETTE_FIRST: Aplica a paleta de cores antes do escalonamento.image.SCALE_ASPECT_KEEP: Ajusta dentro do destino mantendo a proporção.image.SCALE_ASPECT_EXPAND: Preenche o destino mantendo a proporção (recorta).image.SCALE_ASPECT_IGNORE: Preenche o destino ignorando a proporção (estica).image.ROTATE_90: Rotaciona em 90 graus.image.ROTATE_180: Rotaciona em 180 graus.image.ROTATE_270: Rotaciona em 270 graus.
scaleé uma tupla de dois valores(min, max)que controla a profundidade mínima e máxima (em mm) usada para escalar a imagem de profundidade. O padrão é o mínimo e o máximo reais do array de profundidade.Nota
read_depthlembra se foi chamado comtranspose=Trueedraw_depthusa isso internamente para dimensionar o array de origem.
- 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¶
Lê um quadro do sensor de profundidade e retorna um novo objeto
image.Imageque éimage.GRAYSCALEouimage.RGB565.hmirrorseTrueespelha horizontalmente a nova imagem.vflipseTrueinverte verticalmente a nova imagem.transposeseTruetranspõe a nova imagem.x_scalecontrola o quanto a imagem é escalada na direção x (float). Valores negativos espelham horizontalmente. Se não especificado, corresponde ay_scale.y_scalecontrola o quanto a imagem é escalada na direção y (float). Valores negativos espelham verticalmente. Se não especificado, corresponde ax_scale.roié a tupla de retângulo da região de interesse(x, y, w, h)da origem a extrair.rgb_channelé o canal RGB (0=R, 1=G, 2=B) a extrair.-1(padrão) usa todos os canais.alphacontrola a mesclagem da origem para o destino.255é opaco,0deixa o destino inalterado. Faixa: 0-255.color_paletteé um enum de paleta de cores (por exemplo,image.PALETTE_DEPTH) ou uma imagem RGB565 de 256 pixels usada como tabela de consulta de cores.alpha_palettese não forNoneé uma imagem GRAYSCALE de 256 pixels usada como tabela de consulta de alpha.hinté um OR lógico de:image.AREA: Usa escalonamento por área ao reduzir a escala.image.BILINEAR: Usa escalonamento bilinear.image.BICUBIC: Usa escalonamento bicúbico.image.CENTER: Centraliza a imagem no destino.image.HMIRROR: Espelha horizontalmente.image.VFLIP: Inverte verticalmente.image.TRANSPOSE: Transpõe (troca x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Aplica a extração de rgb_channel antes do escalonamento.image.APPLY_COLOR_PALETTE_FIRST: Aplica a paleta de cores antes do escalonamento.image.SCALE_ASPECT_KEEP: Ajusta dentro do destino mantendo a proporção.image.SCALE_ASPECT_EXPAND: Preenche o destino mantendo a proporção (recorta).image.SCALE_ASPECT_IGNORE: Preenche o destino ignorando a proporção (estica).image.ROTATE_90: Rotaciona em 90 graus.image.ROTATE_180: Rotaciona em 180 graus.image.ROTATE_270: Rotaciona em 270 graus.
scaleé uma tupla de dois valores(min, max)que controla a profundidade mínima e máxima (em mm) usada para escalar a imagem. O padrão é o mínimo/máximo reais do quadro.pixformatcontrola o formato de pixel final da imagem. Deve serimage.GRAYSCALEouimage.RGB565.copy_to_fbseTrueescreve a nova imagem no frame buffer em vez de alocá-la no heap do MicroPython.timeoutquantos milissegundos aguardar pelo novo quadro antes de levantar umRuntimeError. Se0, aguarda indefinidamente.