v1.2.0

v1.2.0 é uma versão fundacional muito extensa que desenvolve grande parte da API clássica de imagem do OpenMV: os métodos de desenho, operações de binário / morfologia, descritores de pontos-chave (FAST / FREAK / LBP), conversões de cor e image.statistics, entrada/saída de ficheiros BMP / PPM / JPEG, os módulos térmicos lcd, mjpeg, gif e mlx, a câmara OV7725, e muitos controlos de sensor. Alguns comportamentos fundamentais de sensor foram alterados — leia as alterações de quebra de compatibilidade abaixo.

Destaques

  • API de desenhodraw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints().

  • Binário / morfologiabinary(), invert(), and/or/xor/..., erode() / dilate() / morph(), negate() / difference().

  • Pontos-chave — descritores FAST / FREAK / LBP com match_descriptor() / save_descriptor() / load_descriptor().

  • Novos móduloslcd, mjpeg, gif (cor) e térmico mlx.

  • Suporte à câmara OV7725; image.statistics; entrada/saída de ficheiros BMP/PPM/JPEG.

  • Quebra de compatibilidade: o comportamento de sensor.reset(), sensor.snapshot() e sensor.set_pixformat() foi alterado — consulte as alterações de quebra de compatibilidade.

Novas funcionalidades

  • Desenho — adicionados image.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() com argumentos por palavra-chave (color, thickness, …).

  • Binário / morfologia — adicionados image.binary(), invert(), and() / nand() / or() / nor() / xor() / xnor(), erode() / dilate() / morph(), negate() / difference(), pixels(), centroid(), orientation_radians() / orientation_degrees(), e width() / height() / format().

  • Pontos-chave / descritores — extração de pontos-chave FAST via find_keypoints(), um match_descriptor() unificado e save_descriptor() / load_descriptor() para FREAK / LBP, além de uma cascata Haar/LBP de face de perfil.

  • Cor / estatísticasimage.statistics e funções de conversão de cor (rgb_to_lab / lab_to_rgb / rgb_to_grayscale / grayscale_to_rgb).

  • Entrada/saída de ficheiros — carregamento e gravação de BMP / PPM (P2/P3/P5/P6) / JPEG (incluindo JPEG em escala de cinzentos e subamostragem de croma 4:2:0 / 4:2:2).

  • Módulos — novos módulos lcd (shield LCD), mjpeg (gravação de vídeo), gif a cores (com Gif.loop()), e módulos de câmara térmica mlx, cada um com scripts de exemplo.

  • Sensor — adicionados sensor.get_id() (+ constantes PID OV9650/OV2640/OV7725), sensor.set_special_effect() (constantes SDE_*), sensor.set_image_filter() (FILTER_BW / FILTER_SKIN), o tamanho de fotograma HQVGA, e image.set_pixel(x, y, …).

  • WiFi — adicionado o controlador WiFi ATWINC1500 e base BSP para OpenMV 1/2, além de um exemplo BLE.

Outras alterações e melhorias

  • O framebuffer é agora comprimido em JPEG antes de ser transmitido para o OpenMV IDE (menor largura de banda); a compressão JPEG é feita no lugar; o zoom H/V do OV7725 permite escalonamento arbitrário; deteção de faces Haar melhorada (mais rápida) que funciona a QVGA.

Correções de erros

Imagem:

  • Corrigidos o cálculo do integral-image, corrupção no filtro median(), o cálculo do centroide, filtros de pele RGB / preto-e-branco em entrada RGB, e leitura/escrita de BMP/PPM em escala de cinzentos mais rápida.

Sensor e sistema:

  • Corrigidos os temporizadores pyb.Servo (Servo agora funciona), resolução HQVGA, fiabilidade de inicialização do cartão SD, reinicialização do armazenamento após soft-reset, e re-execução do REPL quando não está presente nenhum script.

Hardware e suporte a placas

  • Sensor de câmara OV7725.

  • Shield LCD (módulo lcd), câmara térmica mlx, e base WiFi ATWINC1500.

Alterações de quebra de compatibilidade da API

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

As três alterações de quebra de compatibilidade são alterações de behavior às funções principais de sensor (mesma API, comportamento diferente) — verifique novamente os scripts afetados. Cada hash de commit é uma ligação para o respetivo diff no GitHub. (A grande maioria desta versão é nova API adicionada no intervalo v1.1→v1.2 e é, portanto, aditiva, sem quebras de compatibilidade.)

sensor.reset() já não aplica uma configuração padrão (behavior)

sensor.reset() já não aplica uma configuração padrão integrada (pixformat / framesize / framerate / gain / contrast / brightness / saturation). Os scripts que dependiam do reset() a deixar um estado padrão utilizável devem agora chamar explicitamente sensor.set_pixformat() e sensor.set_framesize() (e quaisquer outras definições) após reset().

Commits: d1e782df3

sensor.snapshot() lança exceção em caso de timeout (behavior)

sensor.snapshot() levanta agora RuntimeError("Sensor Timeout!!") quando o sensor excede o tempo limite, em vez de bloquear indefinidamente. Envolva snapshot() em try / except RuntimeError se precisar de tolerar timeouts.

Commits: e3f41d674

sensor.set_pixformat() lança exceção em formato não suportado (behavior)

sensor.set_pixformat() levanta agora uma exceção quando recebe um formato de pixel não suportado, em vez de devolver False. O código que verificava o retorno False deve capturar a exceção em alternativa.

Commits: e0c5822c2

Guia de migração

Para uma migração limpa para v1.2.0, o trabalho típico é:

  1. Definir explicitamente sensor.set_pixformat() / sensor.set_framesize() após sensor.reset() (a alteração de reset).

  2. Envolver sensor.snapshot() em try / except RuntimeError se precisar de tolerar timeouts do sensor (a alteração de snapshot).

  3. Capturar a exceção de sensor.set_pixformat() em vez de verificar False (a alteração de set_pixformat).

Todos os outros scripts funcionam sem alterações.