v2.1.0

A v2.1.0 é uma versão massiva de modernização da API. Ela substitui o descritor de pontos-chave FREAK por ORB, reformula find_blobs() / histogramas / estatísticas em APIs baseadas em objetos, renomeia as funções de exposição/ganho/balanço de branco automáticos do sensor, adiciona detecção de QR Code e correção de lente para o OV7725, e habilita a placa inicial OpenMV Cam M7. Muitas APIs mudaram — leia as mudanças incompatíveis abaixo.

Destaques

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

  • APIs de objetosfind_blobs(), get_histogram(), get_statistics() agora retornam objetos com acessadores nomeados.

  • QR Codes — adicionada a detecção image.find_qrcodes().

  • OpenMV Cam M7 — suporte inicial de placa.

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

  • Incompatível: as APIs de pontos-chave/descritor, blob/histograma/estatísticas, função automática do sensor e várias outras mudaram — veja as mudanças incompatíveis.

Novos recursos

  • OpenMV Cam M7 — adicionado o suporte inicial à placa OpenMV 3 (M7).

  • QR Codes — 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; salvar/carregar pontos-chave.

  • APIs de objetosimage.get_histogram() / get_statistics() / get_percentile() retornam objetos de histograma/estatísticas; find_blobs() retorna objetos blob (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 o sombreamento de lente do OV7725, sensor.set_windowing() agora também aceita uma tupla (w, h) (centralizada automaticamente) e image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

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

Outras mudanças e melhorias

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

Correções de bugs

Câmera e imageamento:

  • Corrigidos a limpeza/invalidação de cache do DMA do M7 (quadros corrompidos), uma linha extra espúria no final de cada quadro, os limites de estouro do buffer de quadro JPEG, a liberação do buffer de quadro em caso de falha de compress(), a precisão / ROI / tratamento de conjunto vazio do ORB e a geometria de load_image(copy_to_fb=True).

Sistema:

  • Corrigidos o suporte ao ADC do F7, um nome de registrador do OV7725, o tempo de bootloader/USB, usado WFI ao aguardar capturas e tornado não bloqueante o exemplo de streamer MJPEG com timeouts por cliente.

Suporte de hardware e placas

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

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

Mudanças incompatíveis na API

Quebras de API visíveis ao usuário entre a v2.0.0 e a v2.1.0. Escopo: C-modules em 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 código.

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

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

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

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

O descritor de pontos-chave FREAK foi removido e substituído por ORB: image.FREAK não existe mais (use image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() não recebem mais um argumento inicial de tipo de descritor (ele é inferido a partir do objeto), match_descriptor() agora retorna uma tupla de 8 elementos (cx, cy, x, y, w, h, match_count, rotation) (o último elemento é uma contagem bruta, não uma porcentagem) 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 padrões 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 antigos resultados planos de histograma/estatísticas 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 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() agora retorna objetos blob com acessadores nomeados (o acesso por índice ainda funciona para compatibilidade retroativa) e image.find_markers() foi removido — use find_blobs(..., merge=True, margin=...) em vez disso. O callback avançado de filtro de blob por cor não é mais 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 quadro.

Commits: 1645ab94b

compress() rejeita qualidade fora do intervalo (behavior)

image.compress() / compressed() agora geram um erro quando quality está fora de 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, então quadros grandes podem agora gerar falta de memória — reduza a qualidade JPEG ou o tamanho do quadro.

Commits: 9efd7474a, 9a7c3defc

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

image.lens_corr() agora realmente aplica seu argumento zoom (antes ele era interpretado, mas ineficaz), então a saída difere para os scripts que passavam um zoom não padrão. Reverifique o ajuste de lens_corr().

Commits: d6b49adef

Lista de verificação de migração

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

  1. Substituir image.FREAK por image.ORB, eliminar o argumento de tipo de descritor e atualizar o desempacotamento da tupla 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 de histograma/estatísticas).

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

  5. Usar os acessadores de objeto blob e substituir find_markers() por find_blobs(merge=True, ...) (a mudança em find_blobs); substituir img.copy_to_fb() pela palavra-chave copy_to_fb= (a mudança em copy_to_fb).

  6. Limitar a qualidade de compress() ao intervalo 1–100 e reverificar os tamanhos JPEG no OpenMV 3 (a mudança em compress); reajustar o zoom de lens_corr() (a mudança em lens_corr).

Todos os outros scripts funcionam sem alterações.