v2.4.0

A v2.4.0 reescreve find_lines() como um detector por transformada de Hough, adiciona find_line_segments(), decodificação de data matrix find_datamatrices(), sensor.set_vsync_output(), leitura/escrita de fatias de imagem e muitos novos tamanhos de quadro escalonados para FPS mais alto. find_lines(), match_descriptor() e skip_frames() mudaram — leia as mudanças incompatíveis abaixo.

Destaques

  • find_lines() — reescrito como um detector de linhas por transformada de Hough que retorna objetos de linha (agora funciona em RGB565, não apenas em escala de cinza).

  • find_line_segments() — detecta segmentos de linha finitos.

  • find_datamatrices() — decodificação de data matrix.

  • sensor.set_vsync_output() — gera o VSYNC em um pino de E/S para sincronização da câmera.

  • Mais tamanhos de quadro — muitas resoluções escalonadas adicionais para FPS mais alto.

  • Incompatível: find_lines(), match_descriptor() e skip_frames() mudaram — veja as mudanças incompatíveis.

Novos recursos

  • image.find_line_segments() — encontra segmentos de linha não infinitos; os objetos de linha ganharam um acessor .length().

  • image.find_datamatrices() — decodificação de data matrix, com scripts de exemplo.

  • sensor.set_vsync_output(pin) — gera o sinal VSYNC em um pino GPIO para sincronização da câmera (OpenMV 2 / OpenMV 3).

  • Fatias de imagem — o subscript de imagem / protocolo de buffer agora suporta leitura e escrita de fatias dos dados da imagem.

  • Adicionadas muitas combinações adicionais de resolução / tamanho de quadro escalonadas para suportar taxas de quadros mais altas; clock.fps() agora reinicia seus acumuladores a cada 2 s, de modo que o FPS reportado acompanha a taxa recente.

Outras mudanças e melhorias

  • O OV7725 é janelado para QVGA quando a resolução é ≤ VGA (menos quadros perdidos em altas taxas de captura) e seu PLL foi configurado para 6× com um clock externo reduzido (OpenMV 2 48 MHz, OpenMV 3 54 MHz), alterando o timing dos quadros do sensor.

Correções de bugs

Imagem:

  • Corrigido o erro de tamanho de buffer do compress_for_ide() (marcador de início/fim), a decodificação de QR (mais correções upstream do quirc na indexação do bitmap de células e nos limites do padrão de alinhamento).

Sensor e conectividade:

  • Reduzido o clock do sensor da OpenMV 2 para funcionar com o PLL de sensor mais alto (init/sync da câmera) e feito o socket.recvfrom() do WINC retornar o tamanho realmente recebido (gerando erro em um tamanho não positivo em vez de retornar um valor obsoleto).

Suporte de hardware e placas

  • Saída VSYNC em um pino GPIO (OpenMV 2 / OpenMV 3) dando suporte ao sensor.set_vsync_output().

  • OpenMV 3 — habilitada a UART1 da pyb.UART.

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v2.3.0 e a v2.4.0. Escopo: módulos C do Python em modules/ e bibliotecas Python em scripts/libraries/.

Cada mudança é marcada com seu impacto:

  • major — afeta a maioria dos scripts que usavam o recurso; você precisará portar o código.

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

  • behavior — mesma API, resultados diferentes; revalide os scripts ajustados.

As mudanças estão agrupadas por impacto nessa ordem. Se você só quer portar seu código, pule para a lista de verificação de migração no final. Cada hash de commit aponta para seu diff no GitHub.

find_lines() reescrito como detector de Hough (major)

image.find_lines() foi reescrito como um detector por transformada de Hough. Ele não retorna mais uma lista de tuplas (x1, y1, x2, y2) — retorna objetos de linha (.line() / .x1() / .y1() / .x2() / .y2() / .theta() / .rho() / .magnitude()) — e agora também funciona em RGB565 (não apenas em escala de cinza). O argumento threshold mudou de um float de 0.0–1.0 para uma soma inteira de magnitude de borda, line.magnitude agora é um inteiro, e foram adicionadas as novas palavras-chave theta_margin / rho_margin. Porte o código de desempacotamento de tuplas para os objetos de linha e reajuste o threshold.

Commits: 31b7b5bf3, f4a9c6154

match_descriptor() retorna um objeto de correspondência (minor)

image.match_descriptor() (ORB) agora retorna um objeto kptmatch com os acessores .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() em vez de uma tupla simples de 8 elementos. O objeto ainda é subscriptável/fatiável, então a indexação posicional continua funcionando, mas o código que fazia isinstance(result, tuple) (ou usava métodos de tupla) deve usar os novos acessores.

Commits: e960546b6

sensor.skip_frames() agora é baseado em tempo (behavior)

sensor.skip_frames() foi reformulado para aceitar uma palavra-chave time= (padrão ~300 ms) e agora é baseado em tempo por padrão, em vez de executar uma contagem fixa de quadros, parando antecipadamente assim que o tempo se esgota. Os scripts que dependiam de uma contagem exata de quadros devem passar uma contagem explícita e/ou definir time= adequadamente.

Commits: a039b5d1c

Lista de verificação de migração

Para um port limpo para a v2.4.0, o trabalho típico é:

  1. Portar o desempacotamento de tuplas do find_lines() para os objetos de linha e reajustar o threshold inteiro (a reescrita do find_lines).

  2. Usar os acessores do kptmatch em vez de tratar os resultados do match_descriptor() como uma tupla (a mudança do match_descriptor).

  3. Passar uma contagem explícita e/ou time= para sensor.skip_frames() se você dependia de uma contagem fixa de quadros (a mudança do skip_frames).

Todos os outros scripts rodam sem alterações.