{"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\/hr\/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;\" \/> Ja sam jedan od programera operativnog sustava <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, a u ovom \u0107u \u010dlanku objasniti kako sam uspio pokrenuti OpenCV na STM32746G plo\u010di.<\/p>\n<p><\/p>\n<p>Ako u pretra\u017eiva\u010du upi\u0161ete ne\u0161to poput &#171;OpenCV na STM32 plo\u010di&#187;, mo\u017eete prona\u0107i prili\u010dno mnogo onih koji se zanimaju za kori\u0161tenje ove biblioteke na STM32 plo\u010dama ili drugim mikrokontrolerima.<br \/>\nPostoji nekoliko videa koji, sude\u0107i po naslovu, trebaju pokazati ono \u0161to nam treba, ali obi\u010dno (u svim videima koje sam vidio) na STM32 plo\u010di se samo prikazivala slika s kamere i rezultat na ekranu, dok se sama obrada slike odvijala ili na obi\u010dnom ra\u010dunalu ili na sna\u017enijim plo\u010dama (na primjer, Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Za\u0161to je to te\u0161ko?<\/h1>\n<p><\/p>\n<p>Popularnost pretra\u017eiva\u010dkih upita obja\u0161njava se time \u0161to je OpenCV najpopularnija biblioteka za ra\u010dunalni vid, \u0161to zna\u010di da su mnogi programeri upoznati s njom, a mogu\u0107nost pokretanja gotovog koda za radnu povr\u0161inu na mikrokontroleru zna\u010dajno olak\u0161ava proces razvoja. No, za\u0161to jo\u0161 uvijek nema nekih popularnih gotovih recepata za rje\u0161avanje ovog problema?<\/p>\n<p><\/p>\n<p>Problem kori\u0161tenja OpenCV-a na malim plo\u010dama povezan je s dvije osobitosti:<\/p>\n<p><\/p>\n<ul>\n<li>Ako se biblioteka kompajlira \u010dak i s minimalnim skupom modula, jednostavno ne\u0107e stati u flash memoriju iste STM32F7Discovery (\u010dak i bez uzimanja u obzir OS) zbog jako velikog koda (nekoliko megabajta instrukcija).<\/li>\n<li>Sama biblioteka napisana je na C++, \u0161to zna\u010di\n<ul>\n<li>Potrebna je podr\u0161ka za plus runtime (izuzeci i sl.)<\/li>\n<li>Nedovoljna je podr\u0161ka za LibC\/Posix, koja obi\u010dno postoji u operativnim sustavima za ugra\u0111ene sustave \u2014 potrebna je standardna biblioteka plus i standardna biblioteka predlo\u0161ka STL (vector i sl.).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portiranje na Embox<\/h1>\n<p><\/p>\n<p>Kao i obi\u010dno, prije portiranja bilo kakvih programa u operativni sustav, dobro je poku\u0161ati ga sastaviti u obliku u kojem su ga zamislili programeri. U na\u0161em slu\u010daju s ovim nema problema \u2014 izvorni kodovi mogu se prona\u0107i na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">githubu<\/a><\/noindex>, biblioteka se sastavlja s GNU\/Linux uobi\u010dajenim cmake-om.<\/p>\n<p><\/p>\n<p>Od dobrih vijesti \u2014 OpenCV se ina\u010de mo\u017ee sastaviti kao stati\u010dka biblioteka, \u0161to olak\u0161ava portiranje. Sastavljamo biblioteku sa standardnom konfiguracijom i gledamo koliko prostora zauzimaju. Svaki modul se sastavlja u zasebnu biblioteku.<\/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>Kao \u0161to se mo\u017ee vidjeti iz posljednjeg retka, .bss i .data ne zauzimaju toliko puno prostora, ali kod ima vi\u0161e od 70 MiB. Jasno je da \u0107e, ako se to stati\u010dki pove\u017ee s odre\u0111enom aplikacijom, koda biti manje.<\/p>\n<p><\/p>\n<p>Poku\u0161at \u0107emo ukloniti \u0161to je vi\u0161e modula mogu\u0107e da bismo dobili minimalni primjer (koji, na primjer, jednostavno ispisuje verziju OpenCV), pa da vidimo. <code>cmake .. -LA<\/code> i isklju\u010dujemo sve \u0161to se mo\u017ee isklju\u010diti u opcijama.<\/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>S jedne strane, to je samo jedan modul biblioteke, ali s druge strane, to je bez optimizacije kompajlera za veli\u010dinu koda (<code>-Os<\/code>). ~3 MiB koda \u2014 to je jo\u0161 uvijek dovoljno puno, ali ve\u0107 pru\u017ea nadu za uspjeh.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Pokretanje u emulatoru<\/h2>\n<p><\/p>\n<p>Debugging na emulatoru je puno jednostavnije, pa se najprije uvjeravamo da biblioteka radi na qemu. Kao emulirana platforma odabrao sam Integrator\/CP, jer, prvo, to je tako\u0111er ARM, a drugo, Embox podr\u017eava ispis grafike za ovu platformu.<\/p>\n<p><\/p>\n<p>U Embox-u postoji mehanizam za izgradnju vanjskih biblioteka, s pomo\u0107u kojeg dodajemo OpenCV kao modul (proslijediv\u0161i sve iste opcije za &#171;minimalnu&#187; izgradnju u obliku stati\u010dkih biblioteka), nakon toga dodajem jednostavnu aplikaciju koja izgleda ovako:<\/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>Gradimo sustav, pokre\u0107emo \u2014 dobijamo o\u010dekivani izlaz.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox: \/#opencv_version                                                     \nOpenCV: \nOp\u0107a konfiguracija za OpenCV 4.0.1 =====================================\n  Kontrola verzije:               bd6927bdf-dirty\n\n  Platforma:\n    Vrijeme:                      2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Cilj:                        Op\u0107i arm-unknown-none\n    CMake:                       3.14.5\n    CMake generator:             Unix Makefiles\n    CMake alat za izgradnju:     \/usr\/bin\/make\n    Konfiguracija:               Debug\n\n  CPU\/HW zna\u010dajke:\n    Osnovno:\n      zatra\u017eeno:                 DETECT\n      onemogu\u0107eno:               VFPV3 NEON\n\n  C\/C++:\n    Izgra\u0111eno kao dinami\u010dke biblioteke?:      NE<\/code><\/pre>\n<p><\/p>\n<p>Sljede\u0107i korak \u2014 pokrenuti neki primjer, najbolje neki standardni od onih koji nude sami programeri <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">na svojoj web stranici<\/a><\/noindex>. Odabrao sam <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">detektor rubova Canny<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Primjer je trebalo malo prepraviti kako bi se slika s rezultatom direktno prikazivala u frame bufferu. To je bilo potrebno jer funkcija <code>imshow()<\/code> mo\u017ee prikazivati slike putem QT-a, GTK-a i Windows-a, kojih, naravno, ne\u0107e biti u konfiguraciji za STM32. U stvari, QT se mo\u017ee pokrenuti na STM32F7Discovery, ali o tome \u0107e biti rije\u010di u drugom \u010dlanku \ud83d\ude42<\/p>\n<p><\/p>\n<p>Nakon kratkog istra\u017eivanja u kojem formatu se \u010duva rezultat rada detektora rubova, dobivamo sliku.<\/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>Izvorna slika<\/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>Rezultat<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">Pokretanje na STM32F7Discovery<\/h2>\n<p><\/p>\n<p>Na 32F746GDISCOVERY postoji nekoliko hardverskih dijelova memorije koje mo\u017eemo koristiti<\/p>\n<p><\/p>\n<ol>\n<li>320KiB radne memorije<\/li>\n<li>1MiB flash memorije za sliku<\/li>\n<li>8MiB SDRAM-a<\/li>\n<li>16MiB QSPI NAND-flash<\/li>\n<li>Utika\u010d za microSD karticu<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-karticu mo\u017eemo koristiti za pohranu slika, ali u kontekstu pokretanja minimalnog primjera, to nije previ\u0161e korisno.<br \/>\nPrikaz ima rezoluciju 480&#215;272, \u0161to zna\u010di da \u0107e memorija za framebuffer iznositi 522 240 bajtova pri dubini od 32 bita, dakle, to je vi\u0161e od veli\u010dine radne memorije, tako da \u0107emo framebuffer i hrpu (koja \u0107e biti potrebna, izme\u0111u ostalog, za OpenCV, kako bi se pohranili podaci za slike i pomo\u0107ne strukture) smjestiti u SDRAM, dok \u0107e sve ostalo (memorija za stog i druge sustavne potrebe) i\u0107i u RAM.<\/p>\n<p><\/p>\n<p>Ako uzmemo minimalnu konfiguraciju za STM32F7Discovery (izbacimo cijelu mre\u017eu, sve naredbe, napravimo stekove \u0161to manjim itd.) i dodamo OpenCV s primjerima, potrebna \u0107e memorija biti sljede\u0107a:<\/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>Za one koji nisu upoznati s tim koja se odjeljenja gdje nalaze, obja\u0161njavam: u <code>.text<\/code> i <code>.rodata<\/code> se nalaze upute i konstante (grobno re\u010deno, readonly-podaci), u <code>.data<\/code> se nalaze promjenjivi podaci, u <code>.bss<\/code> nalaze se &#171;zeroed&#187; varijable koje, ipak, trebaju prostor (ova sekcija &#171;ide&#187; u RAM).<\/p>\n<p><\/p>\n<p>Dobra vijest je da <code>.data<\/code>\/<code>.bss<\/code> moraju se smjestiti, ali <code>.text<\/code> problem - za sliku ima samo 1MiB memorije. Mo\u017ee se izbaciti iz <code>.text<\/code> primjera i \u010ditati je, na primjer, s SD kartice u memoriju pri pokretanju, ali fruits.png te\u017ei otprilike 330KiB, tako da to ne rje\u0161ava problem: ve\u0107i dio <code>.text<\/code> se sastoji upravo od koda OpenCV.<\/p>\n<p><\/p>\n<p>U osnovi, ostaje samo jedno \u2014 u\u010ditavanje dijela koda na QSPI-flash (ima poseban na\u010din rada za mapiranje memorije na sustavnu sabirnicu, tako da \u0107e procesor mo\u0107i izravno pristupati tim podacima). Pri tome se javlja problem: prvo, QSPI-flash memorija nije dostupna odmah nakon ponovnog pokretanja ure\u0111aja (morate posebno inicijalizirati na\u010din rada mapirane memorije), a drugo, ne mo\u017eete &#171;programirati&#187; ovu memoriju konvencionalnim bootloaderom.<\/p>\n<p><\/p>\n<p>Na kraju je odlu\u010deno da se cijeli kod pove\u017ee u QSPI, a da se ugradi vlastitim bootloaderom koji \u0107e dobiti potrebni binarni fajl putem TFTP-a.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Rezultat<\/h1>\n<p><\/p>\n<p>Ideja o portovanju ove biblioteke na Embox pojavila se jo\u0161 prije otprilike godinu dana, ali se to iz razli\u010ditih razloga neprekidno odga\u0111alo. Jedan od njih je podr\u0161ka za libstdc++ i standardnu biblioteku predlo\u017eaka. Problem podr\u0161ke za C++ u Emboxu prelazi okvire ovog \u010dlanka, stoga \u0107u ovdje samo re\u0107i da smo uspjeli posti\u0107i tu podr\u0161ku u potrebnoj mjeri za rad ove biblioteke \ud83d\ude42<\/p>\n<p><\/p>\n<p>Na kraju su ti problemi prevazi\u0111eni (barem u dovoljnoj mjeri za rad primjera OpenCV), i primjer je pokrenut. 40 dugih sekundi traje pretra\u017eivanje granica filtriranjem Canny-ja. To je, naravno, predugo (postoje razmi\u0161ljanja o tome kako to optimizirati, o tome bi se moglo napisati poseban \u010dlanak u slu\u010daju uspjeha). <\/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>Ipak, me\u0111u ciljevima je bio razvoj prototipa koji \u0107e pokazati principijelnu mogu\u0107nost pokretanja OpenCV-a na STM32, i stoga je taj cilj postignut, hura!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: upute korak po korak<\/h4>\n<p><\/p>\n<p>0: Preuzimamo izvorne kodove Embox, na primjer ovako:<\/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: Po\u010det \u0107emo s izradom bootloader-a koji &#171;programira&#187; QSPI-flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Sada je potrebno konfigurirati mre\u017eu, jer \u0107emo u\u010ditati sliku putem TFTP-a. Da bismo postavili IP adrese za plo\u010du i doma\u0107ina, potrebno je promijeniti datoteku conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Primjer konfiguracije:<\/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 doma\u0107ina sa kojeg \u0107e se slika u\u010ditati, <code>address<\/code> \u2014 adresa plo\u010de.<\/p>\n<p><\/p>\n<p>Nakon toga sastavljamo u\u010ditava\u010d:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Uobi\u010dajeno u\u010ditavanje u\u010ditava\u010da (ispri\u010davam se na igri rije\u010di) na plo\u010du \u2014 ovdje nema ni\u0161ta specifi\u010dno, potrebno je to u\u010diniti kao za bilo koju drugu aplikaciju za STM32F7Discovery. Ako ne znate kako to u\u010diniti, mo\u017eete pro\u010ditati o tome <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">ovdje<\/a><\/noindex>.<br \/>\n3: Kompilacija slike s konfiguracijom za 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: Izdvajanje iz ELF sekcija koje je potrebno zapisati u QSPI, u 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>U direktoriju conf nalazi se skripta koja to radi, stoga je mo\u017eete pokrenuti<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Potreban binarni -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Putem tftp u\u010ditajte qspi.bin na QSPI-flash. Na doma\u0107inu je potrebno kopirati qspi.bin u root mapu tftp poslu\u017eitelja (to je obi\u010dno \/srv\/tftp\/ ili \/var\/lib\/tftpboot\/; paketi za odgovaraju\u0107i poslu\u017eitelj postoje u ve\u0107ini popularnih distribucija, obi\u010dno se zove tftpd ili tftp-hpa, ponekad je potrebno <code>systemctl start tftpd.service<\/code> za pokretanje).<\/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 Emboxu (tj. u u\u010ditava\u010du) potrebno je izvr\u0161iti ovakav naredbu (pretpostavljamo da je adresa poslu\u017eitelja 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: Pomo\u0107u naredbe <code>goto<\/code> treba &#171;sko\u010diti&#187; u QSPI-memoriju. Specifi\u010dna lokacija \u0107e varirati ovisno o tome kako je slika povezana, ovu adresu mo\u017eete provjeriti naredbom <code>mem 0x90000000<\/code> (adresa po\u010detka nalazi se u drugom 32-bitnom wordu slike); tako\u0111er, potrebno je postaviti stack s oznakom <code>-s<\/code>, adresa stacka se nalazi na adresi 0x90000000, primjer:<\/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                stacka        prve\n                           instrukcije\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Oznaka -i je potrebna da se prekidanja onemogu\u0107e tijekom inicijalizacije sustava<\/code><\/pre>\n<p><\/p>\n<p>7: Pokre\u0107emo<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>i u\u017eivamo u 40-sekundnoj potrazi za rubovima \ud83d\ude42<\/p>\n<p><\/p>\n<p>Ako ne\u0161to po\u0111e po zlu \u2014 pi\u0161ite issue u <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">na\u0161 repozitorij<\/a><\/noindex>, ili na mailing listu embox-devel@googlegroups.com, ili u komentarima ovdje.<\/p>\n<p>Izvor: <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.5 - 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\/hr\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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":"Ja sam jedan od programera operativnog sustava","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}