v2.1.0

v2.1.0 é uma versão de modernização massiva da API. Substitui o descritor de pontos-chave FREAK pelo ORB, reformula find_blobs() / histogramas / estatísticas em APIs baseadas em objetos, renomeia as funções de exposição automática/ganho/balanço de brancos do sensor, adiciona deteção de códigos QR e correção de lente OV7725, e introduz suporte inicial para a placa OpenMV Cam M7. Muitas APIs foram alteradas — leia as alterações de compatibilidade abaixo.

Destaques

  • Pontos-chave ORB — o descritor FREAK foi substituído pelo ORB (find_keypoints() / match_descriptor() reformulados).

  • APIs de objetosfind_blobs(), get_histogram(), get_statistics() retornam agora objetos com acessores por nome.

  • Códigos QR — adicionada deteção com image.find_qrcodes().

  • OpenMV Cam M7 — suporte inicial para a placa.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (renomeadas) e set_lens_correction().

  • Alteração de compatibilidade: as APIs de pontos-chave/descritores, manchas/histogramas/estatísticas, funções automáticas do sensor e outras foram alteradas — consulte as alterações de compatibilidade.

Novas funcionalidades

  • OpenMV Cam M7 — adicionado suporte inicial para a placa OpenMV 3 (M7).

  • Códigos QR — adicionado image.find_qrcodes() com um exemplo qrcodes.py.

  • Pontos-chave ORB — novo sistema de descritores ORB: find_keypoints() com um argumento corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() com uma palavra-chave filter_outliers e uma estimativa de rotação; gravação/carregamento de pontos-chave.

  • APIs de objetosimage.get_histogram() / get_statistics() / get_percentile() retornam objetos de histograma/estatísticas; find_blobs() retorna objetos de mancha (rect() / cx() / cy() / code() / area() / pixels()) com area_threshold / pixels_threshold / merge / margin / invert e x_stride / y_stride.

  • Sensor — adicionado sensor.set_lens_correction(enable, radi, coef) para sombreamento de lente OV7725, sensor.set_windowing() aceita agora também um tuplo (w, h) (centrado automaticamente), e image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Adicionados scripts de exemplo para rastreamento de cor, Arduino SPI/I2C escravo, pontos-chave e histograma/estatísticas.

Outras alterações e melhorias

  • O IDE pode agora interromper um main.py em execução; find_blobs() / find_qrcodes() / get_statistics() mais rápidos; o ORB usa distância de Hamming por popcount; a correção de lente usa menos RAM; uma regra udev para Linux impede que o ModemManager ocupe a porta série.

Correções de erros

Câmara e imagem:

  • Corrigidos: limpeza/invalidação de cache DMA no M7 (fotogramas corrompidos), uma linha extra no final de cada fotograma, limites de excesso do buffer de fotograma JPEG, libertação do buffer de fotograma em caso de falha de compress(), precisão do ORB / ROI / tratamento de conjuntos vazios, e geometria de load_image(copy_to_fb=True).

Sistema:

  • Corrigidos: suporte ADC F7, um nome de registo OV7725, temporização bootloader/USB, utilização de WFI durante a espera por capturas, e o exemplo do streamer MJPEG foi tornado não bloqueante com tempos limite por cliente.

Hardware e suporte de placas

  • OpenMV Cam M7 (OpenMV 3) — suporte inicial para a placa.

  • OV7725 — suporte de correção de lente (sombreamento).

Alterações de compatibilidade da API

Alterações de API visíveis pelo utilizador entre v2.0.0 e v2.1.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.

FREAK substituído pelo ORB; API de descritores reformulada (major)

O descritor de pontos-chave FREAK foi removido e substituído pelo ORB: image.FREAK deixou de existir (use image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() deixaram de receber um argumento inicial com o tipo de descritor (é inferido a partir do objeto), match_descriptor() retorna agora um tuplo de 8 elementos (cx, cy, x, y, w, h, match_count, rotation) (o último elemento é uma contagem bruta, não uma percentagem), e draw_keypoints() requer um objeto de pontos-chave em vez de uma lista bruta (x, y, angle). find_keypoints() ganhou corner_detector / max_keypoints / scale_factor com valores predefinidos alterados.

Commits: e2d0c4840, bba8e5a9e, 6000684cb

Renomeação das funções automáticas do sensor (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() foram renomeadas para sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (os nomes antigos foram removidos). Cada uma ganhou uma palavra-chave opcional value= para definir um valor manual em vez do automático.

Commits: 1b22a2961

Histograma / estatísticas reformulados em APIs de objetos (major)

A superfície de histograma/estatísticas foi reformulada em image.get_histogram() / get_statistics() / get_percentile() baseadas em objetos, retornando objetos de histograma/estatísticas. Os resultados antigos de histograma/estatísticas planos e os métodos bin_count / l_bin_count / a_bin_count / b_bin_count foram removidos (use len(histogram.bins()) etc.).

Commits: 011108412, 9f37c83de

scale de find_features() renomeado (major)

image.find_features() (Haar) renomeou a sua palavra-chave scale= para scale_factor=. Atualize as chamadas find_features(cascade, scale=...) para scale_factor=....

Commits: 96e4f770c

find_blobs() retorna objetos; find_markers() removido (minor)

image.find_blobs() retorna agora objetos de mancha com acessores por nome (o acesso por índice ainda funciona para compatibilidade retroativa), e image.find_markers() foi removido — use find_blobs(..., merge=True, margin=...) em alternativa. O callback de filtro avançado de manchas de cor já não é suportado.

Commits: af15ec6eb

img.copy_to_fb() substituído (minor)

O método img.copy_to_fb() foi substituído por uma palavra-chave copy_to_fb= em image.Image / load_image(). Use image.Image(path, copy_to_fb=True) para carregar imagens grandes diretamente no buffer de fotograma.

Commits: 1645ab94b

compress() rejeita qualidade fora do intervalo (behavior)

image.compress() / compressed() levantam agora um erro quando quality está fora do intervalo 1–100, em vez de limitar silenciosamente. Limite quality ao intervalo 1–100 antes de chamar. Separadamente, o buffer JPEG do OpenMV 3 foi reduzido de 64 KB para 23000 bytes, pelo que fotogramas grandes podem agora levantar erro de memória insuficiente — reduza a qualidade JPEG ou o tamanho do fotograma.

Commits: 9efd7474a, 9a7c3defc

O zoom de lens_corr() é agora funcional (behavior)

image.lens_corr() aplica agora efetivamente o seu argumento zoom (antes era interpretado mas ineficaz), pelo que a saída difere para scripts que passaram um zoom diferente do predefinido. Rever o ajuste de lens_corr().

Commits: d6b49adef

Guia de migração

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

  1. Substituir image.FREAK por image.ORB, remover o argumento de tipo de descritor e atualizar o desempacotamento de tuplos de match_descriptor() / draw_keypoints() para o objeto de pontos-chave (a reformulação do ORB).

  2. Renomear sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() para as formas set_auto_* (a renomeação das funções automáticas).

  3. Mover o código de histograma/estatísticas para os métodos de objeto (a reformulação do histograma/estatísticas).

  4. Renomear scale= de find_features() para scale_factor= (a renomeação de find_features).

  5. Usar os acessores de objeto de mancha e substituir find_markers() por find_blobs(merge=True, ...) (a alteração de find_blobs); substituir img.copy_to_fb() pela palavra-chave copy_to_fb= (a alteração de copy_to_fb).

  6. Limitar a qualidade de compress() a 1–100 e verificar os tamanhos JPEG no OpenMV 3 (a alteração de compress); reajustar o zoom de lens_corr() (a alteração de lens_corr).

Todos os outros scripts funcionam sem alterações.