v2.1.0

v2.1.0 es una versión masiva de modernización de la API. Reemplaza el descriptor de puntos clave FREAK por ORB, rediseña find_blobs() / histogramas / estadísticas en APIs basadas en objetos, renombra las funciones de exposición/ganancia/balance de blancos automáticos del sensor, añade detección de códigos QR y corrección de lente para el OV7725, y pone en marcha la placa inicial OpenMV Cam M7. Muchas APIs cambiaron — lee los cambios incompatibles a continuación.

Aspectos destacados

  • Puntos clave ORB — el descriptor FREAK se reemplazó por ORB (find_keypoints() / match_descriptor() rediseñados).

  • APIs de objetosfind_blobs(), get_histogram(), get_statistics() ahora devuelven objetos con accesores con nombre.

  • Códigos QR — se añadió la detección image.find_qrcodes().

  • OpenMV Cam M7 — compatibilidad inicial de placa.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (renombradas) y set_lens_correction().

  • Incompatible: las APIs de puntos clave/descriptor, mancha (blob)/histograma/estadísticas, funciones automáticas del sensor y varias otras cambiaron — consulta los cambios incompatibles.

Nuevas características

  • OpenMV Cam M7 — se añadió la compatibilidad inicial de la placa OpenMV 3 (M7).

  • Códigos QR — se añadió image.find_qrcodes() con un ejemplo qrcodes.py.

  • Puntos clave ORB — nuevo sistema de descriptor ORB: find_keypoints() con un argumento corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() con una palabra clave filter_outliers y una estimación de rotación; guardado/carga de puntos clave.

  • APIs de objetosimage.get_histogram() / get_statistics() / get_percentile() devuelven objetos de histograma/estadísticas; find_blobs() devuelve objetos de mancha (blob) (rect() / cx() / cy() / code() / area() / pixels()) con area_threshold / pixels_threshold / merge / margin / invert y x_stride / y_stride.

  • Sensor — se añadió sensor.set_lens_correction(enable, radi, coef) para el sombreado de lente del OV7725, sensor.set_windowing() ahora también acepta una tupla (w, h) (autocentrada), y image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Se añadieron scripts de ejemplo de seguimiento de color, SPI/I2C-esclavo de Arduino, puntos clave e histograma/estadísticas.

Otros cambios y mejoras

  • El IDE ahora puede interrumpir un main.py en ejecución; find_blobs() / find_qrcodes() / get_statistics() más rápidos; ORB usa una distancia de Hamming por popcount; la corrección de lente usa menos RAM; una regla udev de Linux evita que ModemManager se apodere del puerto serie.

Correcciones de errores

Cámara e imagen:

  • Se corrigió la limpieza/invalidación de caché DMA del M7 (fotogramas corruptos), una línea extra espuria al final de cada fotograma, los límites de desbordamiento del búfer de fotogramas (frame buffer) JPEG, la liberación del búfer de fotogramas (frame buffer) ante un fallo de compress(), la precisión / ROI / manejo de conjunto vacío de ORB, y la geometría de load_image(copy_to_fb=True).

Sistema:

  • Se corrigió la compatibilidad del ADC del F7, el nombre de un registro del OV7725, la temporización del gestor de arranque (bootloader)/USB, se usó WFI mientras se espera por capturas, y se hizo no bloqueante el ejemplo de transmisión MJPEG con tiempos de espera por cliente.

Hardware y compatibilidad de placas

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

  • OV7725 — compatibilidad de corrección de lente (sombreado).

Cambios incompatibles en la API

Rupturas de la API visibles para el usuario entre v2.0.0 y v2.1.0. Alcance: módulos C de Python en modules/ y bibliotecas de Python en scripts/libraries/.

Cada cambio está etiquetado con su impacto:

  • major — afecta a la mayoría de los scripts que usaban la característica; necesitarás portar el código.

  • minor — API limitada; solo afecta a los scripts que la usaban.

  • behavior — misma API, resultados diferentes; vuelve a revisar los scripts ajustados.

Los cambios están agrupados por impacto en ese orden. Si solo quieres portar tu código, ve directamente a la lista de verificación de migración al final. Cada hash de commit enlaza a su diff en GitHub.

FREAK reemplazado por ORB; API de descriptor rediseñada (major)

El descriptor de puntos clave FREAK se eliminó y se reemplazó por ORB: image.FREAK ya no existe (usa image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() ya no toman un argumento inicial de tipo de descriptor (se infiere del objeto), match_descriptor() ahora devuelve una tupla de 8 elementos (cx, cy, x, y, w, h, match_count, rotation) (el último elemento es un recuento en bruto, no un porcentaje), y draw_keypoints() requiere un objeto de puntos clave en lugar de una lista (x, y, angle) en bruto. find_keypoints() ganó corner_detector / max_keypoints / scale_factor con valores predeterminados cambiados.

Commits: e2d0c4840, bba8e5a9e, 6000684cb

Renombrado de funciones automáticas del sensor (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() se renombraron a sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (los nombres antiguos se eliminaron). Cada una ganó una palabra clave opcional value= para establecer un valor manual en lugar de automático.

Commits: 1b22a2961

Histograma / estadísticas rediseñados como APIs de objetos (major)

La superficie de histograma/estadísticas se rediseñó en image.get_histogram() / get_statistics() / get_percentile() basados en objetos que devuelven objetos de histograma/estadísticas. Los antiguos resultados planos de histograma/estadísticas y los métodos bin_count / l_bin_count / a_bin_count / b_bin_count se eliminaron (usa len(histogram.bins()), etc.).

Commits: 011108412, 9f37c83de

scale de find_features() renombrado (major)

image.find_features() (Haar) renombró su palabra clave scale= a scale_factor=. Actualiza las llamadas find_features(cascade, scale=...) a scale_factor=....

Commits: 96e4f770c

find_blobs() devuelve objetos; find_markers() eliminado (minor)

image.find_blobs() ahora devuelve objetos de mancha (blob) con accesores con nombre (el acceso por índice sigue funcionando por compatibilidad hacia atrás), y image.find_markers() se eliminó — usa find_blobs(..., merge=True, margin=...) en su lugar. La función de retorno (callback) avanzada de filtro de manchas (blob) de color ya no es compatible.

Commits: af15ec6eb

img.copy_to_fb() reemplazado (minor)

El método img.copy_to_fb() se reemplazó por una palabra clave copy_to_fb= en image.Image / load_image(). Usa image.Image(path, copy_to_fb=True) para cargar imágenes grandes directamente en el búfer de fotogramas (frame buffer).

Commits: 1645ab94b

compress() rechaza calidades fuera de rango (behavior)

image.compress() / compressed() ahora generan un error cuando quality está fuera de 1–100 en lugar de recortar silenciosamente. Recorta quality a 1–100 antes de llamar. Por separado, el búfer JPEG del OpenMV 3 se redujo de 64 KB a 23000 bytes, por lo que los fotogramas grandes ahora pueden generar falta de memoria — reduce la calidad JPEG o el tamaño de fotograma.

Commits: 9efd7474a, 9a7c3defc

El zoom de lens_corr() ahora es funcional (behavior)

image.lens_corr() ahora aplica realmente su argumento zoom (antes se analizaba pero era inefectivo), por lo que la salida difiere para los scripts que pasaban un zoom no predeterminado. Vuelve a revisar el ajuste de lens_corr().

Commits: d6b49adef

Lista de verificación de migración

Para una migración limpia a v2.1.0, el trabajo típico es:

  1. Reemplaza image.FREAK por image.ORB, elimina el argumento de tipo de descriptor y actualiza el desempaquetado de tupla de match_descriptor() / draw_keypoints() al objeto de puntos clave (el rediseño de ORB).

  2. Renombra sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() a las formas set_auto_* (el renombrado de funciones automáticas).

  3. Mueve el código de histograma/estadísticas a los métodos de objeto (el rediseño de histograma/estadísticas).

  4. Renombra scale= de find_features() a scale_factor= (el renombrado de find_features).

  5. Usa los accesores del objeto de mancha (blob) y reemplaza find_markers() por find_blobs(merge=True, ...) (el cambio de find_blobs); reemplaza img.copy_to_fb() por la palabra clave copy_to_fb= (el cambio de copy_to_fb).

  6. Recorta la calidad de compress() a 1–100 y vuelve a revisar los tamaños JPEG en el OpenMV 3 (el cambio de compress); reajusta el zoom de lens_corr() (el cambio de lens_corr).

Todos los demás scripts funcionan sin cambios.