v1.2.0

v1.2.0 é uma versão fundamental e bastante grande que constrói a maior parte da API clássica de imagem do OpenMV: os métodos de desenho, as operações binárias / de morfologia, os descritores de pontos-chave (FAST / FREAK / LBP), as conversões de cor e image.statistics, a E/S de arquivos BMP / PPM / JPEG, os módulos lcd, mjpeg, gif e o térmico mlx, a câmera OV7725 e muitos controles de sensor. Algum comportamento central de sensor mudou — leia as mudanças incompatíveis abaixo.

Destaques

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

  • Binária / 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 (colorido) e mlx térmico.

  • Suporte à câmera OV7725; image.statistics; E/S de arquivos BMP/PPM/JPEG.

  • Incompatível: o comportamento de sensor.reset(), sensor.snapshot() e sensor.set_pixformat() mudou — veja as mudanças incompatíveis.

Novos recursos

  • Desenho — adicionados image.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() com argumentos nomeados (cor, espessura, …).

  • Binária / 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).

  • E/S de arquivos — carregamento e gravação de BMP / PPM (P2/P3/P5/P6) / JPEG (incluindo JPEG em escala de cinza 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 colorido (com Gif.loop()) e mlx de câmera térmica, cada um com scripts de exemplo.

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

  • WiFi — adicionados o driver WiFi ATWINC1500 e a base de BSP do OpenMV 1/2, além de um exemplo de BLE.

Outras mudanças e melhorias

  • O framebuffer agora é comprimido em JPEG antes de ser transmitido ao OpenMV IDE (menor largura de banda); a compressão JPEG é feita in-place; o zoom H/V da OV7725 permite escalonamento arbitrário; detecção de face Haar aprimorada (mais rápida) que roda em QVGA.

Correções de bugs

Imagem:

  • Corrigidos o cálculo da imagem integral, a corrupção do filtro median(), o cálculo do centroide, os filtros de pele RGB / preto-e-branco em entrada RGB, e leitura/gravação mais rápida de BMP/PPM em escala de cinza.

Sensor e sistema:

  • Corrigidos os timers de pyb.Servo (o Servo agora funciona), a resolução HQVGA, a confiabilidade de inicialização do cartão SD, a reinicialização do armazenamento após um soft-reset e a reexecução do REPL quando nenhum script está presente.

Suporte de hardware e placas

  • Sensor de câmera OV7725.

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

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v1.1.0 e a v1.2.0. Escopo: C-modules Python em modules/ e bibliotecas Python em scripts/libraries/.

Todas as três mudanças incompatíveis são mudanças de comportamento em funções centrais de sensor (mesma API, comportamento diferente) — reverifique os scripts afetados. Cada hash de commit aponta para o seu diff no GitHub. (A grande maioria desta versão é nova API construída dentro do intervalo v1.1→v1.2 e é, portanto, aditiva, não incompatível.)

sensor.reset() não aplica mais uma configuração padrão (comportamento)

sensor.reset() não aplica mais uma configuração padrão embutida (pixformat / framesize / framerate / ganho / contraste / brilho / saturação). Scripts que dependiam de reset() deixar um padrão utilizável agora precisam chamar explicitamente sensor.set_pixformat() e sensor.set_framesize() (e quaisquer outras configurações) após reset().

Commits: d1e782df3

sensor.snapshot() lança exceção em timeout (comportamento)

sensor.snapshot() agora lança RuntimeError("Sensor Timeout!!") quando o sensor atinge o tempo limite, em vez de travar indefinidamente. Envolva snapshot() em try / except RuntimeError se você precisar tolerar timeouts.

Commits: e3f41d674

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

sensor.set_pixformat() agora lança uma exceção quando recebe um formato de pixel não suportado, em vez de retornar False. Código que verificava o retorno False deve capturar a exceção em vez disso.

Commits: e0c5822c2

Checklist de migração

Para uma portabilidade limpa para a v1.2.0, o trabalho típico é:

  1. Defina explicitamente sensor.set_pixformat() / sensor.set_framesize() após sensor.reset() (a mudança no reset).

  2. Envolva sensor.snapshot() em try / except RuntimeError se você precisar tolerar timeouts do sensor (a mudança no snapshot).

  3. Capture a exceção de sensor.set_pixformat() em vez de verificar por False (a mudança no set_pixformat).

Todos os outros scripts rodam sem alterações.