{"id":37914,"date":"2019-10-31T22:20:31","date_gmt":"2019-10-31T19:20:31","guid":{"rendered":"https:\/\/prohoster.info\/blog\/opencv-na-stm32f7-discovery\/"},"modified":"2019-10-31T22:20:31","modified_gmt":"2019-10-31T19:20:31","slug":"opencv-na-stm32f7-discovery","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV STM32F7-Discovery-l","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery-l\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Olen \u00fcks operatsioonis\u00fcsteemi arendajatest <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, ja selles artiklis r\u00e4\u00e4kisin sellest, kuidas suutsin OpenCV-d STM32746G plaadil k\u00e4ivitada.<\/p>\n<p><\/p>\n<p>Kui otsite midagi nagu &#171;OpenCV STM32 plaadil&#187;, leiate palju inimesi, kes on huvitatud selle raamatukogu kasutamisest STM32 plaatidel v\u00f5i teistel mikrokontrolleritel.<br \/>\nOn mitmeid videoid, mis pealkirja p\u00f5hjal peaksid demonstreerima seda, mida on vaja, kuid tavaliselt (k\u00f5igis videot, mida olen n\u00e4inud) on STM32 plaadil tehtud ainult pildi saamine kaamerast ja tulemuse kuvamine ekraanil, samas kui pildi t\u00f6\u00f6tlemine toimus kas tavalises arvutis v\u00f5i v\u00f5imsamatel plaatidel (n\u00e4iteks Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Miks see on keeruline?<\/h1>\n<p><\/p>\n<p>Otsingup\u00e4ringute populaarsus on tingitud sellest, et OpenCV on k\u00f5ige populaarsem arvutin\u00e4gemise teek, seega on paljud arendajad selle eest tuttavad, ja v\u00f5imalus k\u00e4ivitada lauaarvutiks m\u00f5eldud kood mikroprotsessoril lihtsustab arendamisprotsessi. Kuid miks ei ole siiani populaarseid lahenduste retsepte selle probleemi lahendamiseks?<\/p>\n<p><\/p>\n<p>OpenCV kasutamise probleem v\u00e4iksematel plaatidel on seotud kahe omadusega:<\/p>\n<p><\/p>\n<ul>\n<li>Kui teegi isegi minimaalse moodulite kogumiga kokku panna, siis STM32F7Discovery v\u00e4lkm\u00e4lusse lihtsalt ei mahu (isegi ilma operatsioonis\u00fcsteemita) v\u00e4ga suure koodi t\u00f5ttu (mitu megabaidi instruktsioone)<\/li>\n<li>Ise teek on kirjutatud C++-s, seega\n<ul>\n<li>On vajalik C++ jooksuta teatamine (erandid jne)<\/li>\n<li>V\u00e4he LibC\/Posix toe, mis tavaliselt on integreeritud s\u00fcsteemide ops\u00fcsteemidesse \u2014 on vajalik C++ standardraamatukogu ja STL malliraamatukogu (vector jne)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portimine Emboxi<\/h1>\n<p><\/p>\n<p>Nagu tavaliselt, enne kui porteerite m\u00f5nda programmide ops\u00fcsteemi, on hea proovida see koguda sellisel kujul, nagu arendajad selle ette n\u00e4gid. Meie juhul ei ole sellega probleeme \u2014 algkoodid on saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHubis<\/a><\/noindex>, teeki saab GNU\/Linux'is tavalise cmake abil kokku panna.<\/p>\n<p><\/p>\n<p>Headest uudistest \u2014 OpenCV-d saab otse v\u00e4lja\u00f5ppe kaudu kokku panna staatilise teegina, mis muudab portimise lihtsamaks. Kogume teegi standardse config-iga ja vaatame, palju ruumi nad kasutavad. Iga moodul kogutakse eraldi teegina.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">&gt; size lib\/*so --totals\n   text    data     bss     dec     hex filename\n1945822   15431     960 1962213  1df0e5 lib\/libopencv_calib3d.so\n17081885     170312   25640 17277837    107a38d lib\/libopencv_core.so\n10928229     137640   20192 11086061     a928ed lib\/libopencv_dnn.so\n 842311   25680    1968  869959   d4647 lib\/libopencv_features2d.so\n 423660    8552     184  432396   6990c lib\/libopencv_flann.so\n8034733   54872    1416 8091021  7b758d lib\/libopencv_gapi.so\n  90741    3452     304   94497   17121 lib\/libopencv_highgui.so\n6338414   53152     968 6392534  618ad6 lib\/libopencv_imgcodecs.so\n21323564     155912  652056 22131532    151b34c lib\/libopencv_imgproc.so\n 724323   12176     376  736875   b3e6b lib\/libopencv_ml.so\n 429036    6864     464  436364   6a88c lib\/libopencv_objdetect.so\n6866973   50176    1064 6918213  699045 lib\/libopencv_photo.so\n 698531   13640     160  712331   ade8b lib\/libopencv_stitching.so\n 466295    6688     168  473151   7383f lib\/libopencv_video.so\n 315858    6972   11576  334406   51a46 lib\/libopencv_videoio.so\n76510375     721519  717496 77949390    4a569ce (TOTALS)<\/code><\/pre>\n<p><\/p>\n<p>Viimane rida n\u00e4itab, et .bss ja .data ei v\u00f5ta palju ruumi, kuid koodi on enam kui 70 MiB. On selge, et kui see staatiliselt kindla rakendusega siduda, siis koodi maht v\u00e4heneb.<\/p>\n<p><\/p>\n<p>Proovime eemaldada v\u00f5imalikult palju mooduleid, et koostada minimaalne n\u00e4ide (mis n\u00e4iteks lihtsalt kuvab OpenCV versiooni), nii et vaatame. <code>cmake .. -LA<\/code> ja blokeerime k\u00f5ik valikutes, mida on v\u00f5imalik blokeerida.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">        -DBUILD_opencv_java_bindings_generator=OFF \n        -DBUILD_opencv_stitching=OFF \n        -DWITH_PROTOBUF=OFF \n        -DWITH_PTHREADS_PF=OFF \n        -DWITH_QUIRC=OFF \n        -DWITH_TIFF=OFF \n        -DWITH_V4L=OFF \n        -DWITH_VTK=OFF \n        -DWITH_WEBP=OFF<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">&gt; size lib\/libopencv_core.a --totals\n   text    data     bss     dec     hex filename\n3317069   36425   17987 3371481  3371d9 (TOTALS)<\/code><\/pre>\n<p><\/p>\n<p>\u00dchelt poolt, see on ainult \u00fcks teegi moodul, teiselt poolt, see pole koodi suuruse optimeerimise t\u00f5ttu (<code>-Os<\/code>). ~3 MiB koodi \u2013 see on ikka veel piisavalt palju, kuid annab juba lootust edule.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">K\u00e4ivitamine emulaatoris<\/h2>\n<p><\/p>\n<p>Emulaatoris on lihtsam siluda, seega veendume k\u00f5igepealt, et teek t\u00f6\u00f6tab qemu-s. Emuleeritud platvormiks valisin Integrator\/CP, kuna esiteks on see samuti ARM ja teiseks toetab Embox selle platvormi jaoks graafika v\u00e4ljundit.<\/p>\n<p><\/p>\n<p>Emboks on mehhanism v\u00e4liste raamatukogude kokkupanekuks, millega lisame OpenCV modulina (edastades k\u00f5ik need valikud &#171;minimaalset&#187; kokkupanekut jaoks staatiliste raamatukogudena), p\u00e4rast seda lisame lihtsa rakenduse, mis n\u00e4eb v\u00e4lja selline:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">version.cpp:\n\n#include \n#include \n\nint main() {\n    printf(\"OpenCV: %s\", cv::getBuildInformation().c_str());\n\n    return 0;\n}<\/code><\/pre>\n<p><\/p>\n<p>Kompileerime s\u00fcsteemi, k\u00e4ivitame \u2013 saame oodatud v\u00e4ljundi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox: \/#opencv_version                                                     \nOpenCV: \n\u00dcldine konfiguratsioon OpenCV 4.0.1 =====================================\n  Versioonikontroll:               bd6927bdf-dirty\n\n  Platvorm:\n    Aeg:                          2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Sihitarget:                  \u00dcldine arm-unknown-none\n    CMake:                       3.14.5\n    CMake generaator:            Unix Makefiles\n    CMake ehitusvahend:         \/usr\/bin\/make\n    Konfiguratsioon:             Debug\n\n  CPU\/HW omadused:\n    Alus:\n      n\u00f5utud:                    DETECT\n      keelatud:                  VFPV3 NEON\n\n  C\/C++:\n    Ehitatud d\u00fcnaamilisteks teekideks?:      EI\n<br> Edasi on teised kogumise parameetrid - milliste lippudega see kompileeritud on,\n  millised OpenCV moodulid on kogumisse kaasatud jne.<\/code><\/pre>\n<p><\/p>\n<p>J\u00e4rgmine samm on k\u00e4ivitada m\u00f5ni n\u00e4idis, parem oleks m\u00f5ni standardne, mida arendajad ise pakuvad. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">oma veebilehel<\/a><\/noindex>. Ma valisin <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">Canny servade detektori<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>N\u00e4idis tuli natuke \u00fcmber kirjutada, et tulemus otse frame bufferisse kuvada. Seda tuli teha, kuna funktsioon <code>imshow()<\/code> oskab pilte kuvada QT, GTK ja Windowsi liideste kaudu, mida STM32 seadistuses kindlasti ei ole. Tegelikult saab QT-d ka STM32F7Discovery-l k\u00e4ivitada, aga sellest r\u00e4\u00e4gitakse juba teises artiklis \ud83d\ude42<\/p>\n<p><\/p>\n<p>P\u00e4rast l\u00fchikest arutelu, millises formaadis servade detektori t\u00f6\u00f6 tulemus hoitakse, saame pildi.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery-l\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Originaalpilt<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery-l\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Tulemus<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">K\u00e4ivitus STM32F7Discovery-l<\/h2>\n<p><\/p>\n<p>32F746GDISCOVERY-l on mitu m\u00e4lusegmenti, mida saame erinevalt kasutada<\/p>\n<p><\/p>\n<ol>\n<li>320KiB j\u00e4rgnevat m\u00e4lu<\/li>\n<li>1MiB v\u00e4lkm\u00e4lu pildifaili jaoks<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND v\u00e4lkm\u00e4lukaart<\/li>\n<li>microSD m\u00e4lukaardi pesad<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-kaarti saab kasutada piltide salvestamiseks, kuid minimaalse n\u00e4idise k\u00e4itamise kontekstis ei ole see eriti kasulik.<br \/>\nEkraanil on eraldusv\u00f5ime 480&#215;272, mis t\u00e4hendab, et raami puhvri jaoks vajalik m\u00e4lu on 522 240 baiti 32-bitise s\u00fcgavuse juures, st see on rohkem kui operatiivm\u00e4lu suurus, seega paigutame raami puhvri ja hunniku (mis on vajalik ka OpenCV-le, et hoida pildiv\u00e4lja ja abistruktuure) SDRAM-i, k\u00f5ik muu (m\u00e4lu virnade ja muude s\u00fcsteemi vajaduste jaoks) l\u00e4heb RAM-i.<\/p>\n<p><\/p>\n<p>Kui v\u00f5tta STM32F7Discovery minimaalne konfiguratsioon (k\u00f5ik v\u00f5rgud v\u00e4lja visata, k\u00f5ik k\u00e4sud, stekke v\u00f5imalikult v\u00e4ikesteks teha jne) ja lisada sinna OpenCV koos n\u00e4idistega, on n\u00f5utav m\u00e4lu j\u00e4rgmine:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">   text    data     bss     dec     hex filename\n2876890  459208  312736 3648834  37ad42 build\/base\/bin\/embox<\/code><\/pre>\n<p><\/p>\n<p>Nende jaoks, kes ei ole eriti tuttavad sellega, kuhu sektsioonid paigutatakse, selgitan: <code>.text<\/code> ja <code>.rodata<\/code> sisaldavad juhiseid ja konstande (lihtsalt \u00f6eldes, readonly-andmeid), <code>.data<\/code> sisaldavad muudetavaid andmeid, <code>.bss<\/code> on &#171;nullitud&#187; muutujad, millele on siiski vaja ruumi (see osa &#171;saab&#187; minna RAM-i).<\/p>\n<p><\/p>\n<p>Hea uudis on see, et <code>.data<\/code>\/<code>.bss<\/code> peavad mahutama, aga probleem on selles, et <code>.text<\/code> ruumi on ainult 1MiB. N\u00e4iteks saab n\u00e4idisekraanist pildi eemaldada ja lugeda seda SD-kaardilt m\u00e4llu k\u00e4ivitamisel, aga fruits.png kaalub umbes 330KiB, nii et see probleem ei lahenda: suurem osa <code>.text<\/code> koostis on t\u00f5epoolest OpenCV kood. <code>.text<\/code> P\u00f5him\u00f5tteliselt j\u00e4\u00e4b \u00fcle vaid \u00fcks \u2014 laadida koodi osa QSPI-m\u00e4lupulgale (sel on spetsiaalne t\u00f6\u00f6re\u017eiim, mis v\u00f5imaldab m\u00e4lu s\u00fcsteembussile kaardistada, mist\u00f5ttu protsessor saab neile andmetele otse juurde p\u00e4\u00e4seda). Kuid on \u00fcks probleem: esiteks, QSPI-m\u00e4lupulga m\u00e4lu ei ole kohe p\u00e4rast seadme taask\u00e4ivitamist saadaval (moodul tuleb eraldi initsialiseerida), teiseks ei saa seda m\u00e4lupulka tavalise laadijaga \"v\u00e4lja kirjutada\".<\/p>\n<p><\/p>\n<p>Suuresti on j\u00e4\u00e4nud vaid \u00fcks asi \u2014 laadida osa koodist QSPI-flashi (sellel on spetsiaalne t\u00f6\u00f6re\u017eiim m\u00e4lu kartograafi jaoks, nii et protsessor saab nendele andmetele otse juurde p\u00e4\u00e4seda). Sellega kaasneb probleem: k\u00f5igepealt ei ole QSPI-flashi m\u00e4lu kohe p\u00e4rast seadme taask\u00e4ivitamist saadaval (peab eraldi initsialiseerima m\u00e4lu kaardistamise re\u017eiimi), teiseks ei saa seda m\u00e4lu harjumusp\u00e4rase laadijaga &#171;flashida&#187;.<\/p>\n<p><\/p>\n<p>Idee portida see teek Emboxile tekkis umbes aasta tagasi, kuid see l\u00fckati korduvalt edasi erinevatel p\u00f5hjustel. \u00dcks neist on libstdc++ ja standardne malliraamatukogu toetus. C++ toetuse probleem Emboxis j\u00e4\u00e4b sellest artiklist v\u00e4ljapoole, seega \u00fctlen vaid, et meil \u00f5nnestus saavutada vajaliku mahuga toetus selle teegi jaoks \ud83d\ude42<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Tulemus<\/h1>\n<p><\/p>\n<p>L\u00f5ppkokkuv\u00f5ttes need probleemid \u00fcletati (v\u00e4hemalt piisavas ulatuses OpenCV n\u00e4idise t\u00f6\u00f6ks) ja n\u00e4idis k\u00e4ivitus. 40 pikka sekundit v\u00f5tab arvel servade leidmine Canny filtriga. See on muidugi liiga pikk (on m\u00f5tteid, kuidas seda optimeerida, sellest v\u00f5iks kirjutada eraldi artikli juhul, kui see \u00f5nnestub).<\/p>\n<p><\/p>\n<p>Siiski oli vahe-eesm\u00e4rk luua protot\u00fc\u00fcp, mis n\u00e4itab p\u00f5him\u00f5ttelist v\u00f5imalust k\u00e4ivitada OpenCV STM32-l, seega see eesm\u00e4rk saavutati, hurraa! <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery-l\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>tl;dr: samm-sammuline juhend<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">0: Laadige Emboxi allikakoodid alla, n\u00e4iteks nii:<\/h4>\n<p><\/p>\n<p>git clone https:\/\/github.com\/embox\/embox &amp;&amp; cd .\/embox<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    1: Alustame laadija kogumisega, mis \"v\u00e4lja kirjutab\" QSPI m\u00e4lupulga.<\/code><\/pre>\n<p><\/p>\n<p>1: Alustame laadija kokkupanekust, mis &#171;flashib&#187; QSPI-flashi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    tee confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>N\u00fc\u00fcd tuleb seadistada v\u00f5rk, kuna me laadime kujutise TFTP kaudu. IP-aadresside seadmiseks plaadil ja hostil tuleb muuta faili conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Konfiguratsiooni n\u00e4idis:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">iface eth0 inet static\n    address 192.168.2.2\n    netmask 255.255.255.0\n    gateway 192.168.2.1\n    hwaddress aa:bb:cc:dd:ee:02<\/code><\/pre>\n<p><\/p>\n<p><code>v\u00e4rav<\/code> \u2014 hosti aadress, kust kuvandi laadimine toimub, <code>aadress<\/code> \u2014 seadme aadress.<\/p>\n<p><\/p>\n<p>P\u00e4rast seda kogume k\u00e4ivitaja:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    tee<\/code><\/pre>\n<p><\/p>\n<p>2: Tavaline k\u00e4ivitaja laadimine seadmele (palun vabandage m\u00e4ngu s\u00f5na) \u2014 siin pole midagi spetsiifilist, seda tuleb teha nagu iga teise rakenduse puhul STM32F7Discovery jaoks. Kui te ei tea, kuidas seda teha, saate lugeda sellest <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">siit<\/a><\/noindex>.<br \/>\n3: Kujutise kompileerimine OpenCV konfiguratsiooniga.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-platform\/opencv\/stm32f7discovery\n    make<\/code><\/pre>\n<p><\/p>\n<p>4: ELF sektsioonide eraldamine, mis tuleb kirjutada QSPI-sse, faili qspi.bin<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    arm-none-eabi-objcopy -O binary build\/base\/bin\/embox build\/base\/bin\/qspi.bin \n        --only-section=.text --only-section=.rodata \n        --only-section='.ARM.ex*' \n        --only-section=.data<\/code><\/pre>\n<p><\/p>\n<p>Kaustas conf on skript, mis seda teeb, seega on v\u00f5imalik see k\u00e4ivitada<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Vajalik binarne fail -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: TFTP abil laadime qspi.bin.bin QSPI-m\u00e4lupulgale. Hostis tuleb qspi.bin kopeerida tftp-serveri juurkaustasse (tavaliselt on see \/srv\/tftp\/ v\u00f5i \/var\/lib\/tftpboot\/; vastava serveri paketid on enamiku populaarsete distributsioonide jaoks olemas, tavaliselt nimetatakse tftpd v\u00f5i tftp-hpa, m\u00f5nikord tuleb teha <code>systemctl start tftpd.service<\/code> selle k\u00e4ivitamiseks).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    # \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f tftpd\n    sudo cp build\/base\/bin\/qspi.bin \/srv\/tftp\n    # \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f tftp-hpa\n    sudo cp build\/base\/bin\/qspi.bin \/var\/lib\/tftpboot<\/code><\/pre>\n<p><\/p>\n<p>Emboxis (st. k\u00e4ivitajas) tuleb sisestada selline k\u00e4sk (eeldades, et serveri aadress on 192.168.2.1):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; qspi_loader qspi.bin 192.168.2.1<\/code><\/pre>\n<p><\/p>\n<p>6: K\u00e4sk <code>goto<\/code> on vaja &#171;h\u00fcpata&#187; QSPI-m\u00e4lu. Konkreetne koht varieerub s\u00f5ltuvalt sellest, kuidas pilt on lingitud, seda aadressi saab vaadata k\u00e4suga <code>mem 0x90000000<\/code> (algusaadress on teise 32-bitise s\u00f5na kujutisest); samuti on vajalik seada virna m\u00e4rk s\u00fcmboliga <code>-s<\/code>, virna aadress asub aadressil 0x90000000, n\u00e4ide:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt;mem 0x90000000\n    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275\n                      \u2191           \u2191\n              see aadress    see  aadress \n                virnast        esimese\n                           k\u00e4su\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Lipp -i on vajalik, et keelata katkestused s\u00fcsteemi initsialiseerimise ajal<\/code><\/pre>\n<p><\/p>\n<p>7: K\u00e4ivitame<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>ja naudime 40-sekundilist servade otsingu \ud83d\ude42<\/p>\n<p><\/p>\n<p>Kui midagi l\u00e4heb valesti, kirjutage probleem meie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">kodule<\/a><\/noindex>, v\u00f5i embox-devel@googlegroups.com, v\u00f5i kommentaarides siit.<\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/457724\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Embox, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c OpenCV \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 STM32746G. \u0415\u0441\u043b\u0438 \u0432\u0431\u0438\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 &#171;OpenCV on STM32 board&#187;, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 STM32 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u0435\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0441\u0443\u0434\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28450,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47OpenCV \u043d\u0430 STM32F7-Discovery | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:20:31+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:20:31+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47OpenCV STM32F7-Discovery-l | ProHoster","description":"Olen \u00fcks operatsioonis\u00fcsteemi arendajatest","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47OpenCV \u043d\u0430 STM32F7-Discovery | ProHoster","og:description":"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:20:31+00:00","article:modified_time":"2019-10-31T19:20:31+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37914","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 19:45:21","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:18:22","updated":"2026-01-23 19:45:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}