Difference between revisions of "Tello dron s OCR ovladanim - Jan Spirka"
(→Postup) |
m |
||
Line 48: | Line 48: | ||
== Video ukážka == | == Video ukážka == | ||
− | <youtube width="428" height="700">IUpEpZEuZ1Q</youtube> | + | <youtube width="428" height="700">IUpEpZEuZ1Q</youtube><br> |
− | <youtube | + | <youtube>883BJs2alGI</youtube> |
== Zdrojový kód == | == Zdrojový kód == | ||
[https://github.com/RoboCup-Junior-Slovensko/softverova-podpora/tree/master/dron-tello/ocr-controller Github] | [https://github.com/RoboCup-Junior-Slovensko/softverova-podpora/tree/master/dron-tello/ocr-controller Github] |
Latest revision as of 23:08, 14 June 2021
Cieľ
Vytvoriť základ pre budúcu knižnicu, ktorá bude schopná na základe spracovania obrazu ovládať pohyb drona.
Použité technológie
- Python
- OpenCV
- OCR (Tesseract)
Použité pip balíčky
- cv2
- djitellopy
- pytesseract
- time
Postup
Základom pre použitie drona Tello bude knižnica djitellopy, ktorá má v sebe zahrnuté funkcie na inicializáciu drona, komunikáciu s ním. Vďaka nej, nebude nutné ručne vytvárať sockety a posielať ich prostredníctvom UDP. Tiež nám dokáže zachytiť pakety obsahujúce video stream z drona a vyskladať nám z nich jeden celý frame, ktorý budeme môcť použiť na analýzu obrazu. Na prácu s obrazom bude použitá knižnica OpenCV a keďže dron bude ovládaný pomocou príkazov, ktoré mu budeme na kamere ukazovať, musíme doimplementovať použitie OCR systému, v našom prípade Tesseract.
Drona si musíme najprv nainicializovať, t.j. vytvoriť s ním spojenie a nastaviť mu prvotné hodnoty. Na to je potrebné zavolať funkciu initializeTello(). Inicializácia spočíva vo vytvorení inštancie drona a vytvorení spojenia pomocou príkazu connect(). Nasledujúce príkazy nastavujú počiatočnú rýchlosť drona a získanie stavu batérie. Potom je potrebné zavolať príkaz streamoff() ak už náhodou dron streamuje video a nanovo ho naštartujeme príkazom streamon().
Všetka nasledujúca funkcionalita sa bude vykonávať v nekonečnom cycle. S dronom budeme v každej iterácii udržovať spojenie pomocou príkazu connect(). Obraz z drone získame po zavolaní funkcie telloGetFrame(). V tej získame obraz predstavovaný maticou a následne ho zmenšíme pre zrýchlenie výpočtov.
Výsledný obraz si zobrazíme pre testovacie účely a začneme analýzu obrazu.
Tá spočíva z počiatočnej úpravy a to:
- prevod matice z farebného spektra na čiernobiele
- vytvorenie binárnej matice
- vyhladenie obrazu filtrom
- dilatácia vyhladenej binárnej matice
- nájdenie kontúr vo výslednej binárnej matici
Následne je potrebné odfiltrovať relevantné zhluky pixelov spraviť výrez z celkového obrazu a spúšťať OCR len v rámci týchto výrezov lebo táto operácie je veľmi náročná na výpočtové prostriedky. Pre testovacie účely bolo dobré zobraziť si medzivýsledky práce s maticami. Návratovou hodnotou funkcie je pole v obraze rozoznaných reťazcov.
Vo funkcii decodeCommand() následne prechádzame cez pole týchto reťazcov a hľadáme kľúčové slová. Princíp fungovania je jednoduchý, v prípade nájdenia zhody sa spojíme s dronom, chvíľku počkáme a spustíme potrebný príkaz pre spustenie pohybu.
Nekonečný cyklus je možné ukončiť prostredníctvom stlačenia klávesy „q“. Dron potom bezpečne pristane a nekonečný cyklus sa preruší.
Video ukážka