pátek 29. listopadu 2013

Čtení čísel z displejů

Občas se stává že je třeba získat měřené hodnoty z přístrojů, kde neexistuje žádný elektrický výstup. Může se jednat například o běžné kapesní multimetry se kterými lze udělat malý měřící systém za zlomek ceny skutečných laboratorních přístrojů, nebo například o meteostanice, kde můžeme z levného domácího modelu udělat třeba počasí online. Speciálních aplikací je pak celá řada, speciální stroje a přístroje s displejem kde je třeba na něco dohlížet, testy přístrojů, apod. K celkem spolehlivému získání čísel stačí PC s OS Linux a běžná webkamera.

První je třeba získat šikovný balíček ssocr, obsahující jakýsi rozboznávací ocr algoritmus, ovšem optimalizovaný na sedmisegmentové numerické displeje. V případě jiného typu displeje, kde se font podobá klasickému písmu zřejmě vyhoví běžný program OCR. Se sedmi segmenty si ovšem zřejmě neporadí. Balíček je ve zdrojovém kódu, je třeba ho zkompilovat a řádně začlenit do systému, což ovšem nečiní žádné problémy (testováno na XUbuntu 12.06 32bit).

https://www.unix-ag.uni-kl.de/~auerswal/ssocr/
Stránky šikovného balíčku ssocr.

Hlavní program ssocr funguje tak, že z fotografie displeje extrahuje nejdříve rámeček s displejem, poté jednotlivé číslice a segmenty. Na závěr podle jasu segmentů odhaduje rozsvícené číslo. Nejdříve tedy musíme získat snímek displeje, k čemuž lze výborně použít již známý prográmek fswebcam. Syntaxe příkazu může vypadat například takto:

fswebcam -d /dev/video0 -S 100 --png 1 -F 10 test.png

Snímek pořídíme ze zařízení video0, což je v testovaném případě obyčejná USB webkamera. Volba -S 100 zajistí ustálení jasu snímku po startu kamery, tím, že se prvních 100 snímků po inicializaci kamery zahodí a uloží se až snímek další. Pro uložení použijeme bezeztrátový fromát png. Volba -F 10 zajistí integraci 10 snímků do snímku výsledného, čímž se zmenší šum. Když v průběhu integrace číslo přeskočí, může nastat potíž s přečením. Čtení se pak musí zopakovat.

Snímek pořízený kamerou
Nyní následuje volání ssocr obsahuje kromě jména souboru snímku také příkaz crop pro oříznutí snímku na rámeček displeje se čtyřmi číselnými parametry, první dva jsou souřadnice levého horního rohu rámečku, další je šířka a poslední výška rámečku.

ssocr crop 77 213 48 30 -d 3 test.png -t 30 -D -P

Volba -d 3 značí že budeme číst tři číslice. V případě zadání -1 je počet určen autodetekcí, což je vhodné jen v některých případech, kdy je počet číslic skutečně variabilní a kdy se případná chyba ošetří nějak jinak. Volba -t 30 určuje rozhodovací práh světlých a tmavých segmentů v procentech jasu celého rámečku displeje. Pro testování je vhodné přidat volby -P (ladící textový výpis) a -D (uložení obrázku rámečku displeje a rozpoznávaných linií).

Vyjmutý obrázek displeje a rozpoznávaných linií
Voleb má samozřejmě program ssocr mnohem více. Problém může nastat s aktivními displeji kde jsou aktivní segmenty jasnější než neaktivní. Možná bude třeba obraz dalším externím programem invertovat a odbarvit. Po odladění je možné zbavit se potřeby ukládání snímku spojením programu fswebcam a ssocr pomocí roury.

fswebcam -d /dev/video0 --png 1 -F 10 - 2>/dev/null | ssocr crop 77 213 48 30 -d 3  -t 30  -

Jako výsledek obdržíme číslo 150 a v případě zapnutých ladících informací ještě řadu dalších informací, například schéma detekovaných aktivních segmentů složený ze znaků.

Obrázek terminálu s výpisem části ladících informací
(Pořízený špatně, ale to mi bohužel došlo až příliš pozdě.)


Sestava kamery sledující teplotu na displeji pájky