eskiuv0.12.0
Paquete

vision

El núcleo de visión por computadora de un tracker visual-inercial, en Eskiu y sin ninguna biblioteca de C además de libm. Sale de tinyvio, el tracker de ReactVision detrás del AR web de ViroReact, y calcula los mismos bits que el C++ de tinyvio. Más de 200,000 casos comparados bit por bit con el C++, 0 diferencias.

El repositorio es privado por ahora. Esta página describe qué hace el paquete y cómo se verificó.

Qué hace

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óduloCasosDiferencias
geometry110,3840
klt73,7240
descriptors16,6740
plane6,3000
imu4,7820
direct3,7680
bundle1,5000
calibrate3000
fast1500

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.

Empieza en un minuto.

Instala el compilador con un comando, o corre un programa en el navegador primero.