Vytvoření mobilního skeneru dokumentů s nulovými závislostmi:prostředí a nastavení

Pro tento projekt jsem měl dva hlavní cíle:dozvědět se o algoritmech a technikách počítačového vidění používaných při skenování dokumentů a využít tyto znalosti k vytvoření programu, který bych ve skutečnosti raději používal před existujícími aplikacemi, jako je CamScanner.

Chtěl jsem mít možnost používat svůj konečný produkt na iOS, macOS, Android a Windows, ale nechtěl jsem udržovat čtyři samostatné nativní kódové báze. Flutter se zdál být dobrou volbou, ale v Dartu se moc nevyznám a předpokládané výkonnostní výhody Fluttera oproti webovým aplikacím jsou podle mých místních testů přehnané. Proto jsem se rozhodl pro svůj skener dokumentů použít architekturu progresivní webové aplikace (PWA).

Počítačové vidění často zahrnuje několik drahých operací na obrázku, takže by bylo logické použít WebAssembly pro skutečnou detekci dokumentů a používat JavaScript pouze pro uživatelské rozhraní. Přestože jsem docela obeznámen s Rustem a kompilací do WASM, jsem fanouškem posouvání JS na jeho limity a chtěl jsem vidět, jak rychlý může být JavaScript pro tak výpočetně náročný úkol; Ukázalo se, že JS je ve skutečnosti dostatečně rychlý pro skener dokumentů i na mobilních zařízeních nižší třídy. (Bez ohledu na to v současné době vytvářím verzi „finálního produktu“ této aplikace s WASM, správným uživatelským rozhraním a několika knihovnami. Měla by být rychlejší a uživatelsky přívětivější než stávající prototyp).

S ohledem na tato omezení jsem se pustil do práce hackováním projektu Parcel 2 pomocí TypeScript, integrace předběžného ukládání do mezipaměti pracovníka služby Parcel a mého pluginu pro generování manifestu PWA. Toto je moje standardní nastavení pro všechny mé nové projekty, ale obvykle tam přidávám i React a Emotion; bohužel jsem se již v tuto chvíli zavázal k mantře "nulové závislosti", takže jediné balíčky, které jsem nainstaloval, byly nástroje pro sestavení. Další krok:zjistit, jak přesně funguje detekce dokumentů, abych mohl aplikaci skutečně sestavit.