{"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&#039;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 jutustan, kuidas mul \u00f5nnestus OpenCV k\u00e4ivitada STM32746G plaadil.<\/p>\n<p><\/p>\n<p>Kui otsingumootorisse sisestada midagi sellist nagu &laquo;OpenCV STM32 v\u00e4ljapanekul&raquo;, leiab \u00fcsna palju inimesi, kes on huvitatud selle raamatukogu kasutamisest STM32 plaatidel v\u00f5i muudel mikrokontrolleritel.<br \/>\nOn mitmeid videoid, mis pealkirja j\u00e4rgi peaksid n\u00e4itama vajalikku, kuid tavaliselt (k\u00f5ikides videotest, mida olen n\u00e4inud) tehti STM32 plaadil ainult kaamerapildi saamine ja tulemuse kuvamine ekraanil, samas kui pildit\u00f6\u00f6tlus tehti kas tavalisel arvutil v\u00f5i v\u00f5imsamatel plaatidel (nt 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 selgitab, et OpenCV on k\u00f5ige populaarsem arvutin\u00e4gemise teek, seega on rohkem arendajaid sellega tuttavad, ja v\u00f5imalus k\u00e4ivitada laua jaoks valmis kood mikrokontrolleril lihtsustab arendusprotsessi m\u00e4rkimisv\u00e4\u00e4rselt. Aga miks siiani pole populaarseid valmis lahendusi selle probleemi jaoks?<\/p>\n<p><\/p>\n<p>Probleem OpenCV kasutamisega v\u00e4ikestel plaatidel on seotud kahe omadusega:<\/p>\n<p><\/p>\n<ul>\n<li>Kui isegi minimaalsete moodulitega kogu teek kompileerida, ei mahu see sama STM32F7Discovery v\u00e4lkm\u00e4llu (isegi ilma operatsioonis\u00fcsteemita) liiga suure koodi t\u00f5ttu (mitu megabaidi k\u00e4su).<\/li>\n<li>Teek ise on kirjutatud C++-s, seega\n<ul>\n<li>on vajalik C++ k\u00e4itusaeg (v\u00e4lja arvatud ja muud).<\/li>\n<li>Puudub LibC\/Posix tugi, mida tavaliselt leidub sisseehitatud s\u00fcsteemide operatsioonis\u00fcsteemides \u2014 vajalik on C++ standardteek ja STL standardteek (n\u00e4iteks vektor ja nii edasi).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portimine Emboxile<\/h1>\n<p><\/p>\n<p>Kuna enne m\u00f5ne programmi portimist operatsioonis\u00fcsteemi on alati hea proovida seda koguda just sellisena, nagu arendajad ette n\u00e4gid. Meie juhul ei teki selle probleemiga mingeid raskusi \u2014 allikaid saab leida <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHubis<\/a><\/noindex>, teek kogutakse GNU\/Linuxi tavap\u00e4rase cmake abil.<\/p>\n<p><\/p>\n<p>Hea uudis on see, et OpenCV-d saab v\u00e4lja pakkuda staatilise teekina, mis muudab portimise lihtsamaks. Kogume teeki tavalise konfigureerimisega ja vaatame, kui palju ruumi see n\u00f5uab. Iga moodul kogutakse eraldi teekina.<\/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>Nagu viimasest reast n\u00e4ha, v\u00f5tab .bss ja .data mitte palju ruumi, kuid kood on \u00fcle 70 MiB. On selge, et kui see linkida staatiliselt konkreetse rakendusega, v\u00e4heneb koodi maht.<\/p>\n<p><\/p>\n<p>Proovime eemaldada nii palju mooduleid kui v\u00f5imalik, et koguda minimaalne n\u00e4ide (mis n\u00e4iteks lihtsalt kuvab OpenCV versiooni), seega vaatame <code>cmake .. -LA<\/code> ja l\u00fclitame valikutes v\u00e4lja k\u00f5ik, mis v\u00e4lja l\u00fclitatav on.<\/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 on see ainult \u00fcks raamatukogu moodul, teiselt poolt, see on ilma koodi suuruse optimeerimiseta (<code>-Os<\/code>). ~3 MiB koodi \u2014 see on endiselt piisavalt palju, kuid juba annab lootust edule.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">K\u00e4ivitamine emulaatoris<\/h2>\n<p><\/p>\n<p>Emulaatoris on palju lihtsam debugida, seega veendume esmalt, et teek t\u00f6\u00f6tab qemu-s. Emuleeritavaks platvormiks valisin Integrator\/CP, kuna see on ka ARM ja Embox toetab selle platvormi graafikat.<\/p>\n<p><\/p>\n<p>Emboxis on mehhanism v\u00e4liste raamatukogude koostamiseks, millega lisame OpenCV moodulina (edastades k\u00f5ik need valikud &laquo;minimaalsest&raquo; koostamisest staatiliste raamatukogudena), seej\u00e4rel lisan lihtsa rakenduse, mis v\u00e4lja n\u00e4eb j\u00e4rgmist moodi:<\/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>Kogume s\u00fcsteemi, k\u00e4ivitame \u2014 saame oodatud v\u00e4ljundi.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox:\/#opencv_version                                                     \nOpenCV: \nOpenCV 4.0.1 \u00fcldine konfiguratsioon =====================================\n  Versioonikontroll:               bd6927bdf-dirty\n\n  Platvorm:\n    Ajastamine:                   2019-06-21T10:02:18Z\n    Alus:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Siht:                      \u00dcldine arm-unknown-none\n    CMake:                       3.14.5\n    CMake generaator:             Unix Makefiles\n    CMake ehitust\u00f6\u00f6riist:            \/usr\/bin\/make\n    Konfiguratsioon:               Debug\n\n  CPU\/HW omadused:\n    Baas:\n      taotletud:                 DETECT\n      keelatud:                  VFPV3 NEON\n\n  C\/C++:\n    Koostatud d\u00fcnaamiliste teekidena?:      EI<\/code><\/pre>\n<p><\/p>\n<p>J\u00e4rgmine samm on k\u00e4ivitada m\u00f5ni n\u00e4ide, parim on valida m\u00f5ni standardne, mida pakuvad arendajad ise. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">oma veebilehelt<\/a><\/noindex>. 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\u00e4idet tuli veidi \u00fcmber kirjutada, et kuvada tulemust otse raami puhveris. See tuli teha, kuna funktsioon <code>imshow()<\/code> suudab kuvada pilte l\u00e4bi QT, GTK ja Windowsi liideste, mida STM32 kontekstis kindlasti ei ole. Tegelikult saab QT-d samuti k\u00e4ivitada STM32F7Discovery-l, aga sellest r\u00e4\u00e4gitakse juba teises artiklis \ud83d\ude42<\/p>\n<p><\/p>\n<p>P\u00e4rast l\u00fchikest uurimist, millises formaadis piiride tuvastamise tulemused salvestatakse, saame pildi.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery&#039;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&#039;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 riistvara m\u00e4lusegmenti, mida saame kasulikult kasutada.<\/p>\n<p><\/p>\n<ol>\n<li>320KiB t\u00f6\u00f6m\u00e4lu<\/li>\n<li>1MiB v\u00e4lkm\u00e4lu pildi jaoks<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND-m\u00e4lupulk<\/li>\n<li>MicroSD-kaardi pesa<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-kaarti v\u00f5ib kasutada piltide salvestamiseks, kuid minimaalsete n\u00e4idete k\u00e4ivitamise kontekstis pole see eriti kasulik.<br \/>\nKuva eraldusv\u00f5ime on 480&#215;272, mis t\u00e4hendab, et raamibuffri m\u00e4lumaht ulatub 522240 baitini 32-bitises s\u00fcgavuses, st see on suurem kui operatiivm\u00e4lu suurus, seega paigutame raamibuffri ja hunniku (mis on vajalik ka OpenCV jaoks, et salvestada andmeid piltide ja abistruktuuride jaoks) SDRAM-i, kogu muu (m\u00e4lu virnade ja muude s\u00fcsteemsete vajaduste jaoks) saadetakse RAM-i.<\/p>\n<p><\/p>\n<p>Kui v\u00f5tta minimaalne konfiguratsioon STM32F7Discovery jaoks (eemaldada kogu v\u00f5rk, k\u00f5ik k\u00e4sud, teha virnad v\u00f5imalikult v\u00e4ikseks jne) ja lisada sinna OpenCV n\u00e4idetega, siis vajalik m\u00e4lu oleks j\u00e4rgmine:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">   tekst    andmed     bss     dec     hex failinimi\n2876890  459208  312736 3648834  37ad42 build\/base\/bin\/embox<\/code><\/pre>\n<p><\/p>\n<p>Need for those who are not very familiar with where the sections go, I'll explain: in <code>.text<\/code> ja <code>.rodata<\/code> lie instructions and constants (roughly speaking, readonly data), in <code>.data<\/code> lie modifiable data, in <code>.bss<\/code> on &laquo;nullitud&raquo; muutujad, mille jaoks on aga siiski vajalik ruum (see sektsioon &laquo;saadetakse&raquo; RAM-i).<\/p>\n<p><\/p>\n<p>The good news is that <code>.data<\/code>\/<code>.bss<\/code> must fit, but the trouble is <code>.text<\/code> there's only 1MiB of memory for the image. You can remove the image from the example and read it, for instance, from an SD card into memory at startup, but fruits.png weighs about 330KiB, so that won't solve the problem: most of the <code>.text<\/code> n\u00e4iteks n\u00e4ha ja lugeda pilti SD-kaardilt k\u00e4ivitamisel, kuid fruits.png kaalub umbes 330KiB, seega see probleem ei lahenda: enamik <code>.text<\/code> consists precisely of OpenCV code.<\/p>\n<p><\/p>\n<p>P\u00f5him\u00f5tteliselt j\u00e4\u00e4b vaid \u00fcks asi - osa koodist QSPI-pulga peale laadimine (sel on spetsiaalne t\u00f6\u00f6re\u017eiim m\u00e4lukaardistamiseks s\u00fcsteemi bussile, nii et protsessor saab nendele andmetele otse juurde p\u00e4\u00e4seda). Sellega tekib probleem: esiteks pole QSPI-pulga m\u00e4lu kohe p\u00e4rast seadme taask\u00e4ivitamist saadaval (m\u00fc\u00fcgile peab eraldi initsialiseerima m\u00e4lu-mapped-re\u017eiimi), teiseks ei saa seda m\u00e4lu 'flash'-ida tavap\u00e4rase laadijaga.<\/p>\n<p><\/p>\n<p>L\u00f5puks otsustati s\u00fcnkroonida kogu kood QSPI-sse ja kirjutada see oma laadimisseadmestikku, mis saab vajaliku binaari TFTP kaudu.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Tulemus<\/h1>\n<p><\/p>\n<p>Idee portida see teek Emboxile tekkis umbes aasta tagasi, kuid mitmel p\u00f5hjusel on see korduvalt edasi l\u00fckatud. \u00dcks neist p\u00f5hjustest on libstdc++ ja standardne mallide teek. C++ toe toimetamine Emboxis \u00fcletab selle artikli raames k\u00e4sitletava teema ulatuse, seega \u00fctlen lihtsalt, et oleme suutnud saavutada vajaliku toetuse selle teegi t\u00f6\u00f6ks \ud83d\ude42.<\/p>\n<p><\/p>\n<p>L\u00f5puks saadi need probleemid \u00fcletatud (v\u00e4hemalt piisavalt, et OpenCV n\u00e4ide t\u00f6\u00f6taks) ning n\u00e4ide k\u00e4ivitus. Plaadil kulus 40 pikemat sekundit servade tuvastamiseks Canny filtriga. See on muidugi liiga kaua (on ideid, kuidas seda optimeerida, sellest v\u00f5iks kirjutada eraldi artikli, kui see \u00f5nnestub). <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV STM32F7-Discovery&#039;l\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>K\u00fcll aga oli vahe-eesm\u00e4rk protot\u00fc\u00fcbi loomine, mis n\u00e4itaks OpenCV k\u00e4itamise p\u00f5him\u00f5ttelise v\u00f5imaluse STM32-l, seega on see eesm\u00e4rk saavutatud, hurraa!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: samm-sammuline juhend<\/h4>\n<p><\/p>\n<p>0: Laadige Emboxi l\u00e4htekood, n\u00e4iteks nii:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    git clone https:\/\/github.com\/embox\/embox &amp;&amp; cd .\/embox<\/code><\/pre>\n<p><\/p>\n<p>1: Alustame laadija koostamisest, mis 'flash' QSPI-pulga.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>N\u00fc\u00fcd tuleb seadistada v\u00f5rk, kuna laadime kujundi TFTP kaudu. Arvutite ja hosti IP-aadresside m\u00e4\u00e4ramiseks 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>gateway<\/code> \u2014 hosti aadress, kust pilt laaditakse, <code>address<\/code> \u2014 seadme aadress.<\/p>\n<p><\/p>\n<p>P\u00e4rast seda koondame laadija:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Tavaline laadimine laadijale (palun andke andeks m\u00e4ng s\u00f5nadega) seadmesse \u2014 siin pole midagi spetifilist, tuleb seda teha nagu igasuguste muude rakenduste puhul STM32F7Discovery jaoks. Kui te ei tea, kuidas seda teha, v\u00f5ite sellest lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">siin<\/a><\/noindex>.<br \/>\n3: Pildi kompileerimine OpenCV konfigureerimisega.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-platform\/opencv\/stm32f7discovery\n    make<\/code><\/pre>\n<p><\/p>\n<p>4: Sektsioonide v\u00e4ljav\u00f5tmine ELF-ist, mis tuleb QSPI-sse kirjutada, failis 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, nii et saate selle k\u00e4ivitada<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Vajalik binaar -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Tftp abil laadime qspi.bin.bin QSPI-m\u00e4lupulgale. Selleks tuleb hostis kopeerida qspi.bin tftp-serveri juurkatalooge (tavaliselt on see \/srv\/tftp\/ v\u00f5i \/var\/lib\/tftpboot\/; vajalikud paketid on saadaval enamikus tuntud distributsioonides, neid nimetatakse tavaliselt tftpd v\u00f5i tftp-hpa, m\u00f5nikord tuleb teha <code>systemctl start tftpd.service<\/code> 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 laadijana) tuleb t\u00e4ita j\u00e4rgmine k\u00e4sk (eeldame, 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 vajalik 'h\u00fcpata' QSPI-m\u00e4llu. Konkreetne asukoht varieerub s\u00f5ltuvalt sellest, kuidas pilt lingitakse, seda aadressi saab vaadata k\u00e4suga <code>mem 0x90000000<\/code> (algus aadress mahtus pildi teise 32-bitise s\u00f5na); lisaks tuleb seadistada suurus lippudega <code>-s<\/code>, steki aadress asub aadressil 0x90000000, n\u00e4iteks:<\/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                stekist        esimese\n                           instruktsiooni\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; servad 20<\/code><\/pre>\n<p><\/p>\n<p>ja naudime 40-sekundiliste piiride otsingut \ud83d\ude42<\/p>\n<p><\/p>\n<p>Kui miski l\u00e4heb valesti, siis kirjutage issue <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">meie reposse<\/a><\/noindex>, v\u00f5i embox-devel@googlegroups.com listi, v\u00f5i kommenteerige siin.<\/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 4.9.10 - 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 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 &quot;OpenCV on STM32 board&quot;, \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\" \/>\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) 4.9.10\" \/>\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 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 &quot;OpenCV on STM32 board&quot;, \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\" \/>\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 | ProHoster","description":"Olen \u00fcks Emboxi operatsioonis\u00fcsteemi arendajatest ja siin artiklis r\u00e4\u00e4gin, kuidas sain OpenCV-d STM32746G plaadil t\u00f6\u00f6le panna. Kui otsingusse tr\u00fckkida midagi nagu \"OpenCV STM32 plaadil\", siis leiab \u00fcsna palju inimesi, keda huvitab selle teegi kasutamine STM32 v\u00f5i muude mikrokontrollerite peal. On mitu videot, mis, tundub","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 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 &quot;OpenCV on STM32 board&quot;, \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","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"},"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}]}}