v3.6.1

A v3.6.1 é uma versão de grande envergadura. Introduz o módulo imu (LSM6DS3), um conjunto de novas APIs getter do sensor com rotação automática orientada por IMU, correção de perspetiva de 4 pontos rotation_corr(), e traz suporte para o Arduino Portenta H7 com as câmaras HIMAX HM01B0 e OV7690. Várias APIs do sensor / image foram alteradas e o TensorFlow foi removido no M7 — leia as alterações incompatíveis abaixo.

Destaques

  • Módulo imu — acelerómetro / giroscópio / temperatura / roll / pitch no LSM6DS3 (OpenMV 4 / Portenta).

  • Getters do sensor + rotação automáticaget_pixformat() / get_framesize() / get_hmirror() / get_vflip() / get_windowing(), set_transpose() / set_auto_rotation(), e rotação automática de captura de imagem orientada por IMU.

  • Correção de perspetivarotation_corr() ganha as palavras-chave fov e corners (4 pontos).

  • Novo hardware — Arduino Portenta H7, HIMAX HM01B0 e câmara OV7690.

  • Incompatível: set_pixformat() / set_framesize() passam a devolver None, sensor.set_framerate() foi removida, o TensorFlow foi removido no M7, e lens_corr() / linpolar() passam a exigir dimensões pares — consulte as alterações incompatíveis.

Novas funcionalidades

  • imu — novo módulo IMU: imu.acceleration_mg(), imu.angular_rate_mdps(), imu.temperature_c(), imu.roll(), imu.pitch() e imu.sleep() (LSM6DS3 no OpenMV 4 / Portenta).

  • Getters do sensor — adicionados sensor.get_pixformat(), get_framesize(), get_hmirror(), get_vflip(), get_windowing(), set_transpose() / get_transpose(), e set_auto_rotation() / get_auto_rotation().

  • Rotação automáticasensor.snapshot() utiliza o IMU para inverter / espelhar / transpor fotogramas quando a rotação automática está ativada.

  • rotation_corr() — adicionadas as palavras-chave fov e corners (perspetiva de 4 pontos), com exemplos de correção de perspetiva.

  • lcd.init() — adicionado o argumento de palavra-chave bgr.

  • collections.deque — ativado na compilação MicroPython.

  • Adicionadas as constantes de identificação sensor.OV7690 e sensor.HM01B0 e um exemplo de filtro de imagem ulab semelhante ao numpy.

Outras alterações e melhorias

  • Otimizados significativamente os filtros de imagem (mediana / moda / média / …) e find_circles() e a correção de lente; alloc_extra_fb pode agora alocar qualquer número de bytes; o modelo de deteção de pessoas foi reconstruído com uma nova operação de average-pool.

Correções de erros

Câmara e sensores:

  • Corrigido o sleep() do OV2640 (passa a usar o registo de standby COM2 em vez do pino de desativação), a configuração do pino FSYNC, as polaridades HSYNC/VSYNC do HM01B0 e o endereço/varrimento I2C, o GPIO de desativação do sensor Portenta e o pino de reinicialização da câmara, e desativada a rotação automática quando o pitch do IMU está próximo de 90°/270°.

Imagem e sistema:

  • Corrigido um erro de verificação de limites nos filtros de imagem, um hardfault ao desativar a D-cache, arranque em placas sem cartão SD, um erro de load_to_fb em tf.load(), o stack overflow na deteção de pessoas (stack do H7 aumentada para ≥12 KB), e os offsets do descritor USB para modo de alta velocidade no OpenMV 4 Plus.

Hardware e suporte de placa

  • Arduino Portenta H7 — arranque inicial da placa (configuração de relógio/OSC/HSE STM32H747, cabeçalhos CMSIS, ADC, SDRAM, PID USB Arduino).

  • HIMAX HM01B0 — novo driver de câmara monocromática (Bayer, relógio por oscilador externo).

  • OV7690 — novo driver de câmara.

  • LSM6DS3 IMU — OpenMV 4 / Portenta.

Alterações incompatíveis de API

Alterações de API visíveis pelo utilizador entre a v3.6.0 e a v3.6.1. Âmbito: módulos C Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada alteração está marcada com o seu impacto:

  • minor — API restrita; afeta apenas scripts que a utilizavam.

  • behavior — mesma API, resultados diferentes; re-verifique scripts ajustados.

As alterações estão agrupadas por impacto nessa ordem. Se apenas pretende portar o seu código, salte para a lista de verificação de migração no final. Cada hash de commit liga ao respetivo diff no GitHub.

sensor.set_framerate() removida (minor)

O stub sem efeito sensor.set_framerate() foi removido; chamá-lo agora levanta AttributeError. Remova a chamada e controle a temporização dos fotogramas através de framesize/exposure. (Um set_framerate() funcional é re-introduzido na v4.0.2.)

Commits: 705e98f91

TensorFlow removido no OpenMV Cam M7 (minor)

O TensorFlow (módulo tf) foi desativado no OpenMV Cam M7 / OpenMV 3 (já não cabe). import tf no M7 falha — utilize uma câmara da classe H7 para TensorFlow. (O tf é re-ativado no F7 na v3.6.3.)

Commits: 2ae875077

set_pixformat() / set_framesize() devolvem None (behavior)

sensor.set_pixformat() e sensor.set_framesize() passam a devolver None em vez de True, e um formato de pixel não suportado passa a levantar ValueError em vez de uma asserção. Código que verificava o valor de retorno (por ex. if sensor.set_pixformat(...):) deve deixar de o fazer, e código que apanhava AssertionError para formatos não suportados deve passar a apanhar ValueError.

Commits: f314ac4e7

lens_corr() / linpolar() / logpolar() exigem dimensões pares (behavior)

image.lens_corr() e image.linpolar() / image.logpolar() passam agora a exigir largura e altura de imagem pares e levantam um erro em dimensões ímpares. Recorte ou redimensione a imagem para dimensões pares antes de chamar estes métodos.

Commits: b36460a36, 2b26ca17b

Lista de verificação de migração

Para uma portabilidade limpa para a v3.6.1, o trabalho típico é:

  1. Remover as chamadas a sensor.set_framerate() (a remoção de set_framerate).

  2. Mover as cargas de trabalho TensorFlow para fora do OpenMV Cam M7 (a alteração TensorFlow no M7).

  3. Deixar de depender do valor de retorno de set_pixformat() / set_framesize() e apanhar ValueError para formatos de pixel não suportados (a alteração do valor de retorno).

  4. Garantir dimensões de imagem pares antes de lens_corr() / linpolar() / logpolar() (o requisito de dimensões pares).

Todos os outros scripts funcionam sem alterações.