vision
El repositorio es privado por ahora. Esta página describe qué hace el paquete y cómo se verificó.
Qué hace
- Imágenes. Imágenes en escala de grises, muestreo bilineal, pirámides, un desenfoque de caja.
- Características. Esquinas FAST-9 repartidas por el cuadro, flujo Lucas-Kanade piramidal con verificación de ida y vuelta, descriptores BRIEF orientados y emparejamiento por distancia de Hamming.
- Geometría. Rotaciones y poses, traslación entre dos vistas con RANSAC, triangulación, pose a partir de correspondencias 3D-2D, refinamiento de Gauss-Newton y bundle adjustment sobre una ventana deslizante.
- Alineación directa. Una pose resuelta fotométricamente contra una pirámide, con una búsqueda de profundidad sobre la línea epipolar para iniciarla.
- Inercial. Un filtro complementario para la orientación y la gravedad, preintegración de la IMU y la escala métrica visual-inercial.
- Planos. Detección en una nube de puntos, seguimiento entre actualizaciones con polígonos de borde, y rayos para hit tests.
Un ejemplo
Esquinas en un cuadro, seguidas en el siguiente con flujo Lucas-Kanade:
import <list>;
import <vision/image>;
import <vision/fast>;
import <vision/klt>;
ImageRef first = a.ref();
FastConfig fast;
List<Corner> corners;
vision_fast(&first, &fast, &corners);
List<V2> from;
for (i in 0..corners.size) from.push(corners.data[i].px);
Pyramid pa;
Pyramid pb;
pa.build(first, 3);
pb.build(b.ref(), 3);
KltConfig klt;
List<FlowResult> flow;
vision_klt_track(&pa, &pb, from.data, from.size, null, 0, &klt, &flow);
// flow.data[i].ok() y flow.data[i].px: a dónde se movió la esquina i
Cada struct de configuración trae los valores por defecto del original, así que
KltConfig klt; ya es una configuración que funciona. Con dos cuadros de prueba
el ejemplo imprime 152 corners, 150 tracked, median motion (5.00, -2.00) px.
Los mismos bits que el C++
Las pruebas del paquete enlazan el núcleo en C++ de tinyvio, fijado en un commit y
compilado con -ffp-contract=off como sus builds de WebAssembly, contra cada
módulo, y comparan cada resultado bit por bit sobre cuadros y una secuencia de IMU
generados para la prueba. Corren en cada commit:
| Módulo | Casos | Diferencias |
|---|---|---|
| geometry | 110,384 | 0 |
| klt | 73,724 | 0 |
| descriptors | 16,674 | 0 |
| plane | 6,300 | 0 |
| imu | 4,782 | 0 |
| direct | 3,768 | 0 |
| bundle | 1,500 | 0 |
| calibrate | 300 | 0 |
| fast | 150 | 0 |
Dos cosas que un build de C++ hace de forma implícita se vuelven explícitas. Los
elementos empatados se ordenan como los ordena libc++, porque el <sort>
de Eskiu es el algoritmo de libc++. Y el sin y el cos de un mismo
ángulo pasan por una sola llamada a sincos en las plataformas de Apple, como
los fusiona clang ahí.
Dónde corre
vision es Eskiu puro, así que se compila donde se compile Eskiu: sus pruebas corren en
macOS, Linux y Windows, y se compila cruzado para iOS, Android (arm64, armv7, x86_64) y
WebAssembly. Los resultados son los mismos bits en toda plataforma cuya biblioteca de C
redondee igual sin, cos y las demás funciones matemáticas.
El mismo código, con los nombres propios de tinyvio, es el motor en Eskiu de tinyvio. Al reproducir una grabación por su API de C da la misma salida que el motor en C++ en macOS, WebAssembly, el simulador de iOS y el emulador de Android. Ver el caso de estudio de ReactVision.
eskiu