{"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\/sk\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV na STM32F7-Discovery","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV na STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Som jedn\u00fdm z v\u00fdvoj\u00e1rov opera\u010dn\u00e9ho syst\u00e9mu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, a v tomto \u010dl\u00e1nku v\u00e1m poviem, ako sa mi podarilo spusti\u0165 OpenCV na doske STM32746G.<\/p>\n<p><\/p>\n<p>Ak sa do vyh\u013ead\u00e1va\u010da nap\u00ed\u0161e nie\u010do ako \u201eOpenCV na doske STM32\u201c, n\u00e1jde sa dos\u0165 ve\u013ea t\u00fdch, ktor\u00ed sa zauj\u00edmaj\u00fa o pou\u017eitie tejto kni\u017enice na dosk\u00e1ch STM32 alebo in\u00fdch mikrocontrolleroch.<br \/>\nExistuje nieko\u013eko vide\u00ed, ktor\u00e9, pod\u013ea n\u00e1zvu, by mali demon\u0161trova\u0165 to, \u010do potrebujete, ale zvy\u010dajne (vo v\u0161etk\u00fdch vide\u00e1ch, ktor\u00e9 som videl) sa na doske STM32 iba z\u00edskavali obr\u00e1zky z kamery a zobrazoval sa v\u00fdsledok na obrazovke, pri\u010dom samotn\u00e9 spracovanie obrazu sa vykon\u00e1valo bu\u010f na be\u017enom po\u010d\u00edta\u010di, alebo na silnej\u0161\u00edch dosk\u00e1ch (napr\u00edklad Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Pre\u010do je to \u0165a\u017ek\u00e9?<\/h1>\n<p><\/p>\n<p>Popularita vyh\u013ead\u00e1vac\u00edch dopytov je sp\u00f4soben\u00e1 t\u00fdm, \u017ee OpenCV je najob\u013e\u00fabenej\u0161ia kni\u017enica po\u010d\u00edta\u010dov\u00e9ho videnia, a teda je s \u0148ou obozn\u00e1men\u00fdch viac v\u00fdvoj\u00e1rov, a navy\u0161e mo\u017enos\u0165 sp\u00fa\u0161\u0165a\u0165 k\u00f3d pripraven\u00fd pre desktop na mikrokontrol\u00e9ri v\u00fdrazne zjednodu\u0161uje proces v\u00fdvoja. Ale pre\u010do st\u00e1le neexistuj\u00fa nejak\u00e9 popul\u00e1rne hotov\u00e9 recepty na rie\u0161enie tohto probl\u00e9mu?<\/p>\n<p><\/p>\n<p>Probl\u00e9m pou\u017e\u00edvania OpenCV na mal\u00fdch dosk\u00e1ch s\u00favis\u00ed s dvoma vlastnos\u0165ami:<\/p>\n<p><\/p>\n<ul>\n<li>Ak skompilujete kni\u017enicu aj s minim\u00e1lnym po\u010dtom modulov, do flash pam\u00e4te STM32F7Discovery sa jednoducho nezmest\u00ed (aj bez oh\u013eadu na OS) kv\u00f4li ve\u013emi ve\u013ek\u00e9mu k\u00f3du (nieko\u013eko megabajtov in\u0161trukci\u00ed)<\/li>\n<li>Samotn\u00e1 kni\u017enica je nap\u00edsan\u00e1 v C++, a teda\n<ul>\n<li>Je potrebn\u00e1 podpora C++ runtime (v\u00fdnimky a pod.)<\/li>\n<li>Malo je podpory LibC\/Posix, ktor\u00e9 s\u00fa zvy\u010dajne k dispoz\u00edcii v OS pre zabudovan\u00e9 syst\u00e9my \u2014 potrebn\u00e1 je \u0161tandardn\u00e1 kni\u017enica C++ a \u0161tandardn\u00e1 kni\u017enica \u0161abl\u00f3n STL (vector a pod.)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portovanie na Embox<\/h1>\n<p><\/p>\n<p>Ako zvy\u010dajne, pred portovan\u00edm ak\u00fdchko\u013evek programov do opera\u010dn\u00e9ho syst\u00e9mu nie je zl\u00e9 pok\u00fasi\u0165 sa ho zostavi\u0165 v takom form\u00e1te, ak\u00fd zam\u00fd\u0161\u013eali v\u00fdvoj\u00e1ri. V na\u0161om pr\u00edpade s t\u00fdm nie s\u00fa \u017eiadne probl\u00e9my \u2014 zdrojov\u00e9 k\u00f3dy m\u00f4\u017eete n\u00e1js\u0165 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">github-e<\/a><\/noindex>, kni\u017enica sa zostavuje pod GNU\/Linux pomocou be\u017en\u00e9ho cmake-a.<\/p>\n<p><\/p>\n<p>Z dobr\u00fdch spr\u00e1v \u2014 OpenCV sa d\u00e1 z vy\u017eaduje zostavi\u0165 ako statick\u00e1 kni\u017enica, \u010do u\u013eah\u010duje portovanie. Zostavujeme kni\u017enicu so \u0161tandardn\u00fdm konfigur\u00e1ciou a sledujeme, ko\u013eko miesta zaberaj\u00fa. Ka\u017ed\u00fd modul sa zostavuje do samostatnej kni\u017enice.<\/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>Ako vypl\u00fdva z posledn\u00e9ho riadku, .bss a .data nezaberaj\u00fa ve\u013ea miesta, av\u0161ak k\u00f3d presahuje 70 MiB. Je jasn\u00e9, \u017ee ak by to bolo staticky linkovan\u00e9 s konkr\u00e9tnou aplik\u00e1ciou, ve\u013ekos\u0165 k\u00f3du by sa zmen\u0161ila.<\/p>\n<p><\/p>\n<p>Sk\u00fasime odstr\u00e1ni\u0165 \u010do najviac modulov, aby sme vytvorili minim\u00e1lny pr\u00edklad (ktor\u00fd napr\u00edklad jednoducho zobraz\u00ed verziu OpenCV), tak\u017ee sa pozrime <code>cmake .. -LA<\/code> a v mo\u017enostiach vypneme v\u0161etko, \u010do je mo\u017en\u00e9 vypn\u00fa\u0165.<\/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>Na jednej strane ide len o jeden modul kni\u017enice, na druhej strane, to je bez optimaliz\u00e1cie kompil\u00e1torom pod\u013ea ve\u013ekosti k\u00f3du (<code>-Os<\/code>). ~3 MiB k\u00f3du \u2014 to je st\u00e1le dos\u0165 ve\u013ea, ale u\u017e d\u00e1va n\u00e1dej na \u00faspech.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Spustenie v emul\u00e1tore<\/h2>\n<p><\/p>\n<p>Na emul\u00e1tore sa odlad\u00ed ove\u013ea jednoduch\u0161ie, tak\u017ee sa najprv uist\u00edme, \u017ee kni\u017enica funguje na qemu. Ako emulovan\u00fa platformu som si zvolil Integrator\/CP, preto\u017ee jednak je to tie\u017e ARM a jednak Embox podporuje grafick\u00fd v\u00fdstup pre t\u00fato platformu.<\/p>\n<p><\/p>\n<p>V Emboxe existuje mechanizmus na zostavenie extern\u00fdch kni\u017en\u00edc, pomocou ktor\u00e9ho prid\u00e1vame OpenCV ako modul (pri\u010dom odovzd\u00e1vame v\u0161etky tieto mo\u017enosti pre \u201eminim\u00e1lnu\u201c zostavu v podobe statick\u00fdch kni\u017en\u00edc), po \u010dom prid\u00e1vam najjednoduch\u0161iu aplik\u00e1ciu, ktor\u00e1 vyzer\u00e1 takto:<\/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>Zostav\u00edme syst\u00e9m, spust\u00edme \u2014 a dostaneme o\u010dak\u00e1van\u00fd v\u00fdstup.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox:\\\/\\#opencv_version                                                     \nOpenCV: \nGeneral configuration for OpenCV 4.0.1 =====================================\n  Version control:               bd6927bdf-dirty\n\n  Platform:\n    Timestamp:                   2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Target:                      Generic arm-unknown-none\n    CMake:                       3.14.5\n    CMake generator:             Unix Makefiles\n    CMake build tool:            \\\/usr\\\/bin\\\/make\n    Configuration:               Debug\n\n  CPU\\\/HW features:\n    Baseline:\n      requested:                 DETECT\n      disabled:                  VFPV3 NEON\n\n  C\\\/C++:\n    Built as dynamic libs?:      NO<\/code><\/pre>\n<p><\/p>\n<p>Dal\u0161\u00edm krokem je spustit n\u011bjak\u00fd p\u0159\u00edklad, nejl\u00e9pe n\u011bjak\u00fd standardn\u00ed od samotn\u00fdch v\u00fdvoj\u00e1\u0159\u016f <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">na jejich webu<\/a><\/noindex>. Vybral jsem si <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">detektor hranic Canny<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>P\u0159\u00edklad jsem musel m\u00edrn\u011b p\u0159epsat, abych mohl zobrazit obr\u00e1zek s v\u00fdsledkem p\u0159\u00edmo ve frame bufferu. To bylo nutn\u00e9, proto\u017ee funkce <code>imshow()<\/code> dok\u00e1\u017ee vykreslovat obr\u00e1zky p\u0159es rozhran\u00ed QT, GTK a Windows, kter\u00e9 samoz\u0159ejm\u011b v konfiguraci pro STM32 ur\u010dit\u011b nebude. Ve skute\u010dnosti je tak\u00e9 mo\u017en\u00e9 spustit QT na STM32F7Discovery, ale to bude pops\u00e1no v jin\u00e9m \u010dl\u00e1nku \ud83d\ude42<\/p>\n<p><\/p>\n<p>Po kr\u00e1tk\u00e9m zkoum\u00e1n\u00ed, v jak\u00e9m form\u00e1tu je uchov\u00e1v\u00e1n v\u00fdstup detektoru hranic, z\u00edsk\u00e1me obr\u00e1zek.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV na STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Origin\u00e1ln\u00ed obr\u00e1zek<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV na STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>V\u00fdsledok<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">Spu\u0161t\u011bn\u00ed na STM32F7Discovery<\/h2>\n<p><\/p>\n<p>Na 32F746GDISCOVERY je n\u011bkolik hardwarov\u00fdch odd\u00edl\u016f pam\u011bti, kter\u00e9 m\u016f\u017eeme tak \u010di onak vyu\u017e\u00edt<\/p>\n<p><\/p>\n<ol>\n<li>320KiB RAM<\/li>\n<li>1MiB flash pam\u011bti pro image<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND flash<\/li>\n<li>Slot pro microSD kartu<\/li>\n<\/ol>\n<p><\/p>\n<p>SD kartu lze pou\u017e\u00edt pro ukl\u00e1d\u00e1n\u00ed obr\u00e1zk\u016f, ale v kontextu spu\u0161t\u011bn\u00ed minim\u00e1ln\u00edho p\u0159\u00edkladu to nen\u00ed p\u0159\u00edli\u0161 u\u017eite\u010dn\u00e9.<br \/>\nDisplej m\u00e1 rozl\u00ed\u0161enie 480\u00d7272, \u010do znamen\u00e1, \u017ee pam\u00e4\u0165 pre r\u00e1mov\u00fd buffer bude 522 240 bajtov pri h\u013abke 32 bitov, t.j. je to viac ako ve\u013ekos\u0165 opera\u010dnej pam\u00e4te, tak\u017ee r\u00e1mov\u00fd buffer a halda (ktor\u00e1 bude potrebn\u00e1 vr\u00e1tane pre OpenCV na ukladanie d\u00e1t pre obr\u00e1zky a pomocn\u00e9 \u0161trukt\u00fary) bud\u00fa umiestnen\u00e9 v SDRAM, v\u0161etko ostatn\u00e9 (pam\u00e4\u0165 pre stacky a in\u00e9 syst\u00e9mov\u00e9 potreby) p\u00f4jde do RAM.<\/p>\n<p><\/p>\n<p>Pokud vezmeme minim\u00e1ln\u00ed konfiguraci pro STM32F7Discovery (vyhodit celou s\u00ed\u0165, v\u0161echny p\u0159\u00edkazy, ud\u011blat stacky co nejmen\u0161\u00ed atd.) a p\u0159id\u00e1me tam OpenCV s p\u0159\u00edklady, bude po\u017eadovan\u00e1 pam\u011b\u0165 n\u00e1sleduj\u00edc\u00ed:<\/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>Pre t\u00fdch, ktor\u00ed nie s\u00fa ve\u013emi obozn\u00e1men\u00ed s t\u00fdm, do ktor\u00fdch sekci\u00ed \u010do patr\u00ed, vysvetl\u00edm: v <code>.text<\/code> a <code>.rodata<\/code> s\u00fa ulo\u017een\u00e9 in\u0161trukcie a kon\u0161tanty (hrub\u00fdm sp\u00f4sobom readonly-d\u00e1ta), v <code>.data<\/code> s\u00fa ulo\u017een\u00e9 modifikovate\u013en\u00e9 d\u00e1ta, v <code>.bss<\/code> s\u00fa tam \u201enulovan\u00e9\u201c premenn\u00e9, ktor\u00fdm v\u0161ak potrebujeme miesto (t\u00e1to sekcia p\u00f4jde do RAM).<\/p>\n<p><\/p>\n<p>Dobr\u00e1 spr\u00e1va je, \u017ee <code>.data<\/code>\/<code>.bss<\/code> mus\u00ed sa zmesti\u0165, ale s <code>.text<\/code> probl\u00e9m \u2014 pre obrazec je len 1MiB pam\u00e4te. M\u00f4\u017eete odstr\u00e1ni\u0165 z <code>.text<\/code> obr\u00e1zka z pr\u00edkladu a na\u010d\u00edta\u0165 ho, napr\u00edklad, z SD karty do pam\u00e4te pri spusten\u00ed, ale fruits.png v\u00e1\u017ei pribli\u017ene 330KiB, tak\u017ee to probl\u00e9m nevyrie\u0161i: v\u00e4\u010d\u0161ia \u010das\u0165 <code>.text<\/code> sa sklad\u00e1 pr\u00e1ve z k\u00f3du OpenCV.<\/p>\n<p><\/p>\n<p>Vo ve\u013ekom zost\u00e1va len jedno \u2014 na\u010d\u00edtanie \u010dasti k\u00f3du na QSPI-flash (m\u00e1 \u0161peci\u00e1lny re\u017eim prev\u00e1dzky na mapovanie pam\u00e4te na syst\u00e9mov\u00fa zbernicu, tak\u017ee procesor m\u00f4\u017ee k t\u00fdmto d\u00e1tam pristupova\u0165 priamo). Pri tom vznik\u00e1 probl\u00e9m: po prv\u00e9, pam\u00e4\u0165 QSPI-flash nie je dostupn\u00e1 hne\u010f po re\u0161tarte zariadenia (je potrebn\u00e9 osobitne inicializova\u0165 re\u017eim mapovania pam\u00e4te), a po druh\u00e9, nem\u00f4\u017eeme \u201enaprogramova\u0165\u201c t\u00fato pam\u00e4\u0165 obvykl\u00fdm bootloaderom.<\/p>\n<p><\/p>\n<p>Nakoniec sme sa rozhodli zl\u00fa\u010di\u0165 cel\u00fd k\u00f3d do QSPI a nap\u00e1li\u0165 ho vlastn\u00fdm nab\u00edja\u010dom, ktor\u00fd z\u00edska potrebn\u00fd bin\u00e1rny s\u00fabor pomocou TFTP.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">V\u00fdsledok<\/h1>\n<p><\/p>\n<p>N\u00e1pad portova\u0165 t\u00fato kni\u017enicu na Embox sa objavil pred pribli\u017ene rokom, ale opakovane to bolo odlo\u017een\u00e9 z r\u00f4znych d\u00f4vodov. Jedn\u00fdm z nich je podpora libstdc++ a \u0161tandardnej \u0161abl\u00f3novej kni\u017enice. Probl\u00e9m podpory C++ v Embox presahuje r\u00e1mec tohto \u010dl\u00e1nku, tak\u017ee tu len poviem, \u017ee sa n\u00e1m podarilo dosiahnu\u0165 t\u00fato podporu v potrebnom rozsahu na pr\u00e1cu tejto kni\u017enice \ud83d\ude42<\/p>\n<p><\/p>\n<p>Nakoniec boli tieto probl\u00e9my prekonan\u00e9 (aspo\u0148 v dostato\u010dnej miere na fungovanie pr\u00edkladu OpenCV) a pr\u00edklad sa spustil. H\u013eadanie okrajov pomocou Cannyho filtra trv\u00e1 dos\u0165 dlh\u00fdch 40 sek\u00fand. To je samozrejme pr\u00edli\u0161 dlho (existuj\u00fa \u00favahy, ako tento proces optimalizova\u0165, o tom by sa mohla nap\u00edsa\u0165 samostatn\u00e1 \u010dl\u00e1nok v pr\u00edpade \u00faspechu). <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV na STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Napriek tomu, medzi\u010dasov\u00fdm cie\u013eom bolo vytvorenie prototypu, ktor\u00fd preuk\u00e1\u017ee z\u00e1sadn\u00fa mo\u017enos\u0165 spustenia OpenCV na STM32, a preto bol tento cie\u013e dosiahnut\u00fd, hur\u00e1!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: krok-za-krokom n\u00e1vod<\/h4>\n<p><\/p>\n<p>0: Stiahneme zdrojov\u00e9 k\u00f3dy Embox, napr\u00edklad takto:<\/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: Za\u010dneme so zostaven\u00edm bootloadera, ktor\u00fd \u201enaprogramuje\u201c QSPI-flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Teraz je potrebn\u00e9 nastavi\u0165 sie\u0165, preto\u017ee budeme na\u010d\u00edtava\u0165 obraz cez TFTP. Aby bolo mo\u017en\u00e9 nastavi\u0165 IP adresy dosky a hostite\u013ea, je potrebn\u00e9 zmeni\u0165 s\u00fabor conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Pr\u00edklad konfigur\u00e1cie:<\/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 adresa hostite\u013ea, z ktor\u00e9ho sa bude na\u010d\u00edtava\u0165 obraz, <code>address<\/code> \u2014 adresa dosky.<\/p>\n<p><\/p>\n<p>Po tomto zostav\u00edme zav\u00e1dza\u010d:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Be\u017en\u00e9 na\u010d\u00edtanie zav\u00e1dza\u010da (prep\u00e1\u010dte za slovn\u00fa hra\u010dku) na dosku \u2014 tu nie je ni\u010d \u0161pecifick\u00e9, treba to urobi\u0165 ako pre ak\u00fako\u013evek in\u00fa aplik\u00e1ciu pre STM32F7Discovery. Ak neviete, ako to urobi\u0165, m\u00f4\u017eete si o tom pre\u010d\u00edta\u0165. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">tu<\/a><\/noindex>.<br \/>\n3: Kompil\u00e1cia obrazu s konfigur\u00e1ciou pre OpenCV.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-platform\/opencv\/stm32f7discovery\n    make<\/code><\/pre>\n<p><\/p>\n<p>4: Extrakcia z ELF sekci\u00ed, ktor\u00e9 je potrebn\u00e9 zap\u00edsa\u0165 do QSPI, do 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>V adres\u00e1ri conf je skript, ktor\u00fd to rob\u00ed, tak\u017ee ho m\u00f4\u017eete spusti\u0165<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Potrebn\u00fd bin\u00e1rny s\u00fabor -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Pomocou tftp na\u010d\u00edtame qspi.bin na QSPI flash disk. Na hostite\u013eovi je potrebn\u00e9 skop\u00edrova\u0165 qspi.bin do kore\u0148ov\u00e9ho prie\u010dinka tftp servera (obe lok\u00e1cie s\u00fa zvy\u010dajne \/srv\/tftp\/ alebo \/var\/lib\/tftpboot\/; bal\u00edky pre pr\u00edslu\u0161n\u00fd server s\u00fa v v\u00e4\u010d\u0161ine popul\u00e1rnych distrib\u00faci\u00ed, zvy\u010dajne sa naz\u00fdvaj\u00fa tftpd alebo tftp-hpa, niekedy je potrebn\u00e9 <code>systemctl start tftpd.service<\/code> na spustenie).<\/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>Na Emboxe (t.j. v zav\u00e1dza\u010di) je potrebn\u00e9 vykona\u0165 tento pr\u00edkaz (predpoklad\u00e1me, \u017ee adresa servera je 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: Pomocou pr\u00edkazu <code>goto<\/code> je potrebn\u00e9 \u201esko\u010di\u0165\u201c do QSPI-pam\u00e4te. Konkr\u00e9tna lokalita sa bude l\u00ed\u0161i\u0165 v z\u00e1vislosti od toho, ako je obraz zlinkovan\u00fd, t\u00fato adresu si m\u00f4\u017eeme pozrie\u0165 pr\u00edkazom <code>mem 0x90000000<\/code> (adresa za\u010diatku sa nach\u00e1dza v druhom 32-bitovom slove obrazu); tie\u017e bude potrebn\u00e9 nastavi\u0165 z\u00e1sobn\u00edk s praporkom <code>-s<\/code>, adresa z\u00e1sobn\u00edka je na adrese 0x90000000, pr\u00edklad:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt;mem 0x90000000\n    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275\n                      \u2191           \u2191\n              to je adresa    to je adresa \n                z\u00e1sobn\u00edka        prvej\n                           in\u0161trukcie\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Prapor -i je potrebn\u00fd na zak\u00e1zanie preru\u0161enia po\u010das inicializ\u00e1cie syst\u00e9mu<\/code><\/pre>\n<p><\/p>\n<p>7: Sp\u00fa\u0161\u0165ame<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>a u\u017e\u00edvame si 40-sekundov\u00e9 h\u013eadanie hran\u00edc \ud83d\ude42<\/p>\n<p><\/p>\n<p>Ak sa nie\u010do pokaz\u00ed \u2014 nap\u00ed\u0161te issue do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">n\u00e1\u0161ho repozit\u00e1ra<\/a><\/noindex>, alebo do mailing listu embox-devel@googlegroups.com, alebo do koment\u00e1rov tu.<\/p>\n<p>Zdroj: <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.4 - 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\/sk\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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 na STM32F7-Discovery | ProHoster","description":"Som jedn\u00fdm z v\u00fdvoj\u00e1rov opera\u010dn\u00e9ho syst\u00e9mu","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}