v2.4.0

v2.4.0 reescreve find_lines() como um detetor de transformada de Hough, adiciona find_line_segments(), descodificação de matrizes de dados com find_datamatrices(), sensor.set_vsync_output(), leitura/escrita de fatias de imagem e muitos novos tamanhos de fotograma escalados para FPS mais elevados. find_lines(), match_descriptor() e skip_frames() foram alterados — leia as alterações de compatibilidade abaixo.

Destaques

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

  • find_line_segments() — detetar segmentos de linha finitos.

  • find_datamatrices() — descodificação de matrizes de dados.

  • sensor.set_vsync_output() — conduzir VSYNC num pino de E/S para sincronização de câmara.

  • Mais tamanhos de fotograma — muitas resoluções escaladas adicionais para FPS mais elevados.

  • Alteração de compatibilidade: find_lines(), match_descriptor() e skip_frames() foram alterados — consulte as alterações de compatibilidade.

Novas funcionalidades

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

  • image.find_datamatrices() — descodificação de matrizes de dados, com scripts de exemplo.

  • sensor.set_vsync_output(pin) — saída do sinal VSYNC num pino GPIO para sincronização de câmara (OpenMV 2 / OpenMV 3).

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

  • Adicionadas muitas combinações adicionais de resolução escalada / tamanho de fotograma para suportar taxas de fotogramas mais elevadas; clock.fps() reinicia agora os seus acumuladores a cada 2 s para que o FPS reportado acompanhe a taxa recente.

Outras alterações e melhorias

  • O OV7725 é janelado para QVGA quando a resolução é ≤ VGA (menos fotogramas descartados a altas taxas de captura) e o seu PLL foi definido para 6× com um relógio externo reduzido (OpenMV 2 48 MHz, OpenMV 3 54 MHz), alterando a temporização de fotogramas do sensor.

Correções de erros

Imagem:

  • Corrigido o erro de tamanho do buffer de compress_for_ide() (marcadores de início/fim), a descodificação QR (mais correções upstream do quirc para indexação do mapa de células e limites dos padrões de alinhamento).

Sensor e conectividade:

  • Reduzido o relógio do sensor OpenMV 2 para funcionar com o PLL de sensor mais alto (init/sincronização da câmara) e socket.recvfrom() do WINC retorna agora o tamanho realmente recebido (com erro em tamanho não positivo em vez de retornar um valor obsoleto).

Hardware e suporte de placas

  • Saída VSYNC num pino GPIO (OpenMV 2 / OpenMV 3) que suporta sensor.set_vsync_output().

  • OpenMV 3 — ativado UART1 com pyb.UART.

Alterações de compatibilidade da API

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

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

  • major — afeta a maioria dos scripts que usavam a funcionalidade; será necessário portar o código.

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

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

As alterações estão agrupadas por impacto nessa ordem. Se pretende apenas portar o seu código, avance para o guia de migração no final. Cada hash de commit tem uma ligação para o diff correspondente no GitHub.

find_lines() reescrito como detetor de Hough (major)

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

Commits: 31b7b5bf3, f4a9c6154

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

image.match_descriptor() (ORB) retorna agora um objeto kptmatch com acessores .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() em vez de um tuplo simples de 8 elementos. O objeto ainda é subscritável/fatiável, pelo que a indexação posicional continua a funcionar, mas o código que usava isinstance(result, tuple) (ou métodos de tuplo) 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= (predefinição ~300 ms) e é agora baseado em tempo por defeito, em vez de executar um número fixo de fotogramas, parando antes quando o tempo termina. Os scripts que dependiam de um número exato de fotogramas devem passar uma contagem explícita e/ou definir time= adequadamente.

Commits: a039b5d1c

Guia de migração

Para uma portabilidade limpa para v2.4.0, o trabalho típico é:

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

  2. Usar os acessores kptmatch em vez de tratar os resultados de match_descriptor() como um tuplo (a alteração de match_descriptor).

  3. Passar uma contagem explícita e/ou time= a sensor.skip_frames() se dependia de um número fixo de fotogramas (a alteração de skip_frames).

Todos os outros scripts funcionam sem alterações.