{"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\/sq\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV n\u00eb STM32F7-Discovery","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV n\u00eb STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Un\u00eb jam nj\u00eb nga zhvilluesit e sistemit t\u00eb operimit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, dhe n\u00eb k\u00ebt\u00eb artikull do t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si arrita t\u00eb aktivizoj OpenCV n\u00eb pllak\u00ebn STM32746G.<\/p>\n<p><\/p>\n<p>N\u00ebse shkruani di\u00e7ka si &#171;OpenCV on STM32 board&#187; n\u00eb nj\u00eb motor k\u00ebrkimi, mund t\u00eb gjeni shum\u00eb njer\u00ebz q\u00eb jan\u00eb t\u00eb interesuar p\u00ebr p\u00ebrdorimin e k\u00ebsaj biblioteke n\u00eb bordet STM32 ose n\u00eb mikrokontroller\u00eb t\u00eb tjer\u00eb.<br \/>\nEkzistojn\u00eb disa video q\u00eb, sipas titullit, duhet t\u00eb demonstrojn\u00eb at\u00eb q\u00eb duhet, por zakonisht (n\u00eb t\u00eb gjitha videoto q\u00eb kam par\u00eb) n\u00eb pllak\u00ebn STM32 \u00ebsht\u00eb kryer vet\u00ebm marrja e pamjes nga Kamera dhe shfaqja e rezultatit n\u00eb ekran, nd\u00ebrsa vet\u00eb p\u00ebrpunimi i imazhit b\u00ebhej ose n\u00eb nj\u00eb kompjuter t\u00eb zakonsh\u00ebm, ose n\u00eb pllaka m\u00eb t\u00eb fuqishme (p.sh., Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Pse \u00ebsht\u00eb e v\u00ebshtir\u00eb?<\/h1>\n<p><\/p>\n<p>Popullariteti i k\u00ebrkimeve shpjegohet me faktin se OpenCV \u00ebsht\u00eb biblioteka m\u00eb popullore e vizionit kompjuterik, dhe kjo do t\u00eb thot\u00eb se shum\u00eb m\u00eb shum\u00eb zhvillues jan\u00eb t\u00eb njohur me t\u00eb, dhe mund\u00ebsia p\u00ebr t\u00eb aktivizuar kodin e gatsh\u00ebm p\u00ebr desktop n\u00eb mikrokontroller e thjeshton ndjesh\u00ebm procesin e zhvillimit. Por pse ende nuk ka ndonj\u00eb recet\u00eb t\u00eb njohur t\u00eb gatshme p\u00ebr zgjidhjen e k\u00ebsaj problemi?<\/p>\n<p><\/p>\n<p>Problemi i p\u00ebrdorimit t\u00eb OpenCV n\u00eb pllaka t\u00eb vogla \u00ebsht\u00eb i lidhur me dy karakteristika:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00ebse e kompiloni bibliotek\u00ebn madje edhe me nj\u00eb grup minimal module, n\u00eb memorien flash t\u00eb po asaj STM32F7Discovery ajo thjesht nuk do t\u00eb hyj\u00eb (madje pa marr\u00eb parasysh OS-n\u00eb) p\u00ebr shkak t\u00eb kodit shum\u00eb t\u00eb madh (disa megabajt instrukcionesh)<\/li>\n<li>Biblioteka vet\u00eb \u00ebsht\u00eb shkruar n\u00eb C++, dhe kjo do t\u00eb thot\u00eb\n<ul>\n<li>Duhet mb\u00ebshtetje p\u00ebr runtime-in e C++ (p\u00ebrjashtime etj.)<\/li>\n<li>Ka pak mb\u00ebshtetje LibC\/Posix, t\u00eb cilat zakonisht jan\u00eb n\u00eb OS-t\u00eb p\u00ebr sisteme t\u00eb integruara \u2014 nevojitet biblioteka standarde e C++ dhe biblioteka standarde e templatit STL (vektori etj.)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portimi n\u00eb Embox<\/h1>\n<p><\/p>\n<p>Si zakonisht, para se t\u00eb portoni ndonj\u00eb program n\u00eb nj\u00eb sistem operativ, nuk do t\u00eb ishte keq t\u00eb provoni ta nd\u00ebrtoni at\u00eb n\u00eb form\u00ebn q\u00eb e kan\u00eb menduar zhvilluesit. N\u00eb rastin ton\u00eb nuk ka probleme me k\u00ebt\u00eb \u2014 burimet mund t\u00eb gjenden n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHub<\/a><\/noindex>, biblioteka nd\u00ebrtrohet n\u00ebn GNU\/Linux me cmake t\u00eb zakonsh\u00ebm.<\/p>\n<p><\/p>\n<p>Nga lajmet e mira \u2014 OpenCV nga kutia mund t\u00eb nd\u00ebrtohet n\u00eb form\u00ebn e nj\u00eb biblioteke statike, gj\u00eb q\u00eb e b\u00ebn portimin m\u00eb t\u00eb leht\u00eb. Nd\u00ebrtojm\u00eb bibliotek\u00ebn me konfigurimin standard dhe shikojm\u00eb sa hap\u00ebsir\u00eb po z\u00eb. \u00c7do modul nd\u00ebrtohet n\u00eb nj\u00eb bibliotek\u00eb t\u00eb ve\u00e7ant\u00eb.<\/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>Si\u00e7 duket nga rreshti i fundit, .bss dhe .data nuk z\u00ebn\u00eb aq shum\u00eb hap\u00ebsir\u00eb, por ka mbi 70 MiB kod. E qart\u00eb \u00ebsht\u00eb se n\u00ebse kjo lidhet statikisht me nj\u00eb aplikacion t\u00eb caktuar, kodi do t\u00eb zvog\u00eblohet.<\/p>\n<p><\/p>\n<p>Le t\u00eb p\u00ebrpiqemi t\u00eb heqim sa m\u00eb shum\u00eb module q\u00eb t\u00eb jet\u00eb e mundur, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb krijojm\u00eb nj\u00eb shembull minimal (i cili, p\u00ebr shembull, thjesht do t\u00eb tregoj\u00eb versionin e OpenCV), k\u00ebshtu q\u00eb po shohim <code>cmake .. -LA<\/code> dhe fikim n\u00eb opsione gjith\u00e7ka q\u00eb mund t\u00eb fiket.<\/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>Nga nj\u00ebra an\u00eb, ky \u00ebsht\u00eb vet\u00ebm nj\u00eb modul i bibliotek\u00ebs, nga ana tjet\u00ebr, ky \u00ebsht\u00eb pa optimizimin e kompilerit p\u00ebr madh\u00ebsin\u00eb e kodit (<code>-Os<\/code>). ~3 MiB kod \u2014 kjo \u00ebsht\u00eb ende e konsiderueshme, por tashm\u00eb jep shpres\u00eb p\u00ebr sukses.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Ekzekutimi n\u00eb emulator<\/h2>\n<p><\/p>\n<p>N\u00eb emulator \u00ebsht\u00eb shum\u00eb m\u00eb e leht\u00eb t\u00eb b\u00ebsh debug, prandaj, fillimisht sigurohemi q\u00eb biblioteka funksionon n\u00eb qemu. Si platform\u00eb e emuluar kam zgjedhur Integrator\/CP, sepse, nga nj\u00ebra an\u00eb, \u00ebsht\u00eb gjithashtu ARM dhe, nga ana tjet\u00ebr, Embox mb\u00ebshtet daljen grafike p\u00ebr k\u00ebt\u00eb platform\u00eb.<\/p>\n<p><\/p>\n<p>N\u00eb Embox ekziston nj\u00eb mekaniz\u00ebm p\u00ebr nd\u00ebrtimin e bibliotekave t\u00eb jashtme, me ndihm\u00ebn e tij shtojm\u00eb OpenCV si nj\u00eb modul (duke kaluar t\u00eb gjitha opsionet p\u00ebr nd\u00ebrtimin &#171;minimal&#187; n\u00eb form\u00ebn e bibliotekave statike), pas k\u00ebsaj shtoj nj\u00eb aplikacion t\u00eb thjesht\u00eb q\u00eb duket k\u00ebshtu:<\/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>Nd\u00ebrtojm\u00eb sistemin, e ekzekutojm\u00eb \u2014 dhe marrim rezultatin e pritur.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox:\/*opencv_version *\/\nOpenCV: \nKonfigurimi i p\u00ebrgjithsh\u00ebm p\u00ebr OpenCV 4.0.1 =====================================\n  Kontrolli i versionit:               bd6927bdf-dirty\n\n  Platforma:\n    Data e koh\u00ebs:                   2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Objektivi:                      Generic arm-unknown-none\n    CMake:                       3.14.5\n    Generatori i CMake:             Unix Makefiles\n    Instrumenti p\u00ebr nd\u00ebrtimin e CMake:            \/usr\/bin\/make\n    Konfigurimi:               Debug\n\n  Tiparet e CPU\/HW:\n    Baz\u00eb:\n      e k\u00ebrkuar:                 DETECT\n      e ndaluar:                  VFPV3 NEON\n\n  C\/C++:\n    Nd\u00ebrtuar si biblioteka dinamike?:      JO<\/code><\/pre>\n<p><\/p>\n<p>Hapi tjet\u00ebr \u00ebsht\u00eb t\u00eb ekzekutoni nj\u00eb shembull, m\u00eb mir\u00eb ndonj\u00eb standard nga ata q\u00eb ofrohen nga vet\u00eb zhvilluesit <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">n\u00eb faqen tuaj<\/a><\/noindex>. Kam zgjedhur <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">detektor t\u00eb skajeve K\u00ebni<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Shembulli ishte paksa e nevojshme ta rregulloja, p\u00ebr t\u00eb shfaqur imazhin me rezultatin direkt n\u00eb frame-buffer. Duhej ta b\u00ebja k\u00ebt\u00eb, pasi funksioni <code>imshow()<\/code> di t\u00eb vizatoj\u00eb imazhe p\u00ebrmes interface-ve QT, GTK dhe Windows, t\u00eb cilat, natyrisht, n\u00eb konfigurimin p\u00ebr STM32 nuk do t\u00eb jen\u00eb. N\u00eb t\u00eb v\u00ebrtet\u00eb, QT gjithashtu mund t\u00eb ekzekutohet n\u00eb STM32F7Discovery, por p\u00ebr k\u00ebt\u00eb do t\u00eb flitet n\u00eb nj\u00eb artikull tjet\u00ebr \ud83d\ude42<\/p>\n<p><\/p>\n<p>Pas nj\u00eb sqarimi t\u00eb shkurt\u00ebr mbi se n\u00eb cilin format ruhet rezultati i pun\u00ebs s\u00eb detektorit t\u00eb skajeve, marrim imazhin.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV n\u00eb STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Imazhi origjinal<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV n\u00eb STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Rezultati<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">Ekzekutimi n\u00eb STM32F7Discovery<\/h2>\n<p><\/p>\n<p>N\u00eb 32F746GDISCOVERY ka disa seksione t\u00eb ndryshme t\u00eb memories q\u00eb mund t'i p\u00ebrdorim n\u00eb nj\u00eb m\u00ebnyr\u00eb ose n\u00eb nj\u00eb tjet\u00ebr<\/p>\n<p><\/p>\n<ol>\n<li>320KiB memorie t\u00eb p\u00ebrkohshme<\/li>\n<li>1MiB memorie flash p\u00ebr figur\u00ebn<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND-flash<\/li>\n<li>Priza p\u00ebr kart\u00ebn microSD<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-karta mund t\u00eb p\u00ebrdoret p\u00ebr ruajtjen e imazheve, por n\u00eb kontekstin e ekzekutimit t\u00eb nj\u00eb shembulli minimal nuk \u00ebsht\u00eb shum\u00eb e dobishme.<br \/>\nEkrani ka nj\u00eb rezolut\u00eb 480&#215;272, e cila do t\u00eb thot\u00eb se memoria p\u00ebr frame buffer do t\u00eb jet\u00eb 522 240 byte n\u00eb thell\u00ebsi 32-bit, pra kjo \u00ebsht\u00eb m\u00eb shum\u00eb se madh\u00ebsia e memories operative, k\u00ebshtu q\u00eb frame buffer dhe sasia (e cila do t\u00eb nevojitet gjithashtu p\u00ebr OpenCV, p\u00ebr t\u00eb ruajtur t\u00eb dh\u00ebnat p\u00ebr imazhet dhe strukturat ndihm\u00ebse) do t\u00eb vendosen n\u00eb SDRAM, gjith\u00e7ka tjet\u00ebr (memoria p\u00ebr stek\u00ebt dhe nevojat e tjera sistemore) do t\u00eb d\u00ebrgohet n\u00eb RAM.<\/p>\n<p><\/p>\n<p>N\u00ebse merrni konfigurimin minimal p\u00ebr STM32F7Discovery (hiqni t\u00eb gjith\u00eb rrjetin, t\u00eb gjitha komandat, b\u00ebni stekat sa m\u00eb t\u00eb vogla dhe etj.) dhe e shtoni OpenCV me shembuj, kjo do t\u00eb ishte p\u00ebr sa i p\u00ebrket memories s\u00eb k\u00ebrkuar:<\/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>P\u00ebr ata q\u00eb nuk jan\u00eb shum\u00eb t\u00eb njohur me sekuencat q\u00eb shkojn\u00eb ku, le t\u00eb shpjegoj: n\u00eb <code>.text<\/code> dhe <code>.rodata<\/code> jan\u00eb ruajtur instruksionet dhe konstantet (p\u00ebr ta th\u00ebn\u00eb thjesht, t\u00eb dh\u00ebnat pa lexim), n\u00eb <code>.data<\/code> jan\u00eb t\u00eb dh\u00ebnat e ndryshueshme, n\u00eb <code>.bss<\/code> ka &#171;variablat e anulura&#187;, t\u00eb cil\u00ebve megjithat\u00eb u nevojitet hap\u00ebsira (kjo seksion do t\u00eb &#171;shkoj\u00eb&#187; n\u00eb RAM).<\/p>\n<p><\/p>\n<p>Lajmi i mir\u00eb \u00ebsht\u00eb se <code>.data<\/code>\/<code>.bss<\/code> duhen vendosur, por me <code>.text<\/code> problem \u2014 p\u00ebr imazhin ka vet\u00ebm 1MiB memorie. Mund ta heqim nga <code>.text<\/code> imazhin e shembujve dhe ta lexojm\u00eb, p\u00ebr shembull, nga karta SD n\u00eb memorie gjat\u00eb aktivizimit, por fruits.png ka pesh\u00eb rreth 330KiB, k\u00ebshtu q\u00eb kjo problem nuk e zgjidh: pjesa m\u00eb e madhe <code>.text<\/code> p\u00ebrb\u00ebhet pik\u00ebrisht nga kodi OpenCV.<\/p>\n<p><\/p>\n<p>N\u00eb thelb, mbetet vet\u00ebm nj\u00eb gj\u00eb \u2014 ngarkimi i nj\u00eb pjes\u00eb t\u00eb kodit n\u00eb QSPI-flash (ajo ka nj\u00eb mod t\u00eb ve\u00e7ant\u00eb t\u00eb funksionimit p\u00ebr hartimin e memories n\u00eb autobusin sistemor, n\u00eb m\u00ebnyr\u00eb q\u00eb procesori t\u00eb mund t\u00eb aksesoj\u00eb k\u00ebto t\u00eb dh\u00ebna drejtp\u00ebrdrejt). Kjo sjell nj\u00eb problem: s\u00eb pari, memoria e QSPI-flash nuk \u00ebsht\u00eb e disponueshme menj\u00ebher\u00eb pas ributimit t\u00eb pajisjes (duhet t\u00eb inicializohet ve\u00e7mas moda memory-mapped), s\u00eb dyti, nuk mund ta &#171;programosh&#187; k\u00ebt\u00eb memorie me bootloaderin e zakonsh\u00ebm.<\/p>\n<p><\/p>\n<p>N\u00eb fund, u vendos t\u00eb lidhet i gjith\u00eb kodi n\u00eb QSPI, dhe ta flashojm\u00eb me nj\u00eb boot loader t\u00eb shkruar nga vet\u00eb, i cili do t\u00eb merrte binarin e nevojsh\u00ebm p\u00ebrmes TFTP.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Rezultati<\/h1>\n<p><\/p>\n<p>Ideja p\u00ebr t\u00eb portuar k\u00ebt\u00eb bibliotek\u00eb n\u00eb Embox ka lindur rreth nj\u00eb viti m\u00eb par\u00eb, por her\u00eb pas here \u00ebsht\u00eb shtyr\u00eb p\u00ebr shkak t\u00eb arsyeve t\u00eb ndryshme. Nj\u00ebra prej tyre \u00ebsht\u00eb mb\u00ebshtetje p\u00ebr libstdc++ dhe standardin e bibliotekave t\u00eb templatuara. Problemi i mb\u00ebshtetjes C++ n\u00eb Embox del p\u00ebrtej k\u00ebtij artikulli, ndaj k\u00ebtu do t\u00eb them vet\u00ebm se arrit\u00ebm t\u00eb sigurojm\u00eb k\u00ebt\u00eb mb\u00ebshtetje n\u00eb mas\u00ebn e nevojshme p\u00ebr funksionimin e k\u00ebsaj biblioteke \ud83d\ude42<\/p>\n<p><\/p>\n<p>N\u00eb fund, k\u00ebto probleme u kap\u00ebrcyen (t\u00eb pakt\u00ebn, n\u00eb mas\u00ebn e mjaftueshme p\u00ebr funksionimin e shembujve OpenCV), dhe shembulli u aktivizua. 40 sekonda t\u00eb gjata k\u00ebrkon blloku p\u00ebr t\u00eb gjetur kufijt\u00eb me filtrin Canny. Kjo, natyrisht, \u00ebsht\u00eb shum\u00eb e gjat\u00eb (ka propozime se si ta optimizojm\u00eb k\u00ebt\u00eb proces, p\u00ebr k\u00ebt\u00eb mund t\u00eb shkruajm\u00eb nj\u00eb artikull t\u00eb ve\u00e7ant\u00eb n\u00eb rast suksesi). <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV n\u00eb STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Megjithat\u00eb, q\u00ebllimi nd\u00ebrmjet\u00ebs ishte krijimi i nj\u00eb prototipi q\u00eb do t\u00eb tregonte mund\u00ebsin\u00eb themelore t\u00eb aktivizimit t\u00eb OpenCV n\u00eb STM32, p\u00ebrkat\u00ebsisht, ky q\u00ebllim u arrit, urime!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: udh\u00ebzim hap pas hapi<\/h4>\n<p><\/p>\n<p>0: Shkarkoni burimet e Embox, p\u00ebr shembull k\u00ebshtu:<\/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: Le t\u00eb fillojm\u00eb me nd\u00ebrtimin e bootloader-it, i cili do t\u00eb &#171;programoj\u00eb&#187; QSPI-flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Tani duhet t\u00eb konfiguroni rrjetin, sepse do ta ngarkojm\u00eb imazhin p\u00ebrmes TFTP. P\u00ebr t\u00eb caktuar adresat IP t\u00eb kart\u00ebs dhe hostit, duhet t\u00eb modifikoni skedarin conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Shembulli i konfigurimit:<\/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 e hostit nga ku do t\u00eb ngarkohet imazhi, <code>address<\/code> \u2014 adresa e kart\u00ebs.<\/p>\n<p><\/p>\n<p>Pasi t\u00eb keni b\u00ebr\u00eb k\u00ebt\u00eb, ndjekim krijimin e ngarkuesit:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Ngarkimi normal i ngarkuesit (falni p\u00ebr loj\u00ebn me fjal\u00eb) n\u00eb kart\u00eb \u2014 k\u00ebtu nuk ka asgj\u00eb specifike, duhet b\u00ebr\u00eb si p\u00ebr \u00e7do tjet\u00ebr aplikacion p\u00ebr STM32F7Discovery. N\u00ebse nuk e dini se si b\u00ebhet, mund t\u00eb lexoni p\u00ebr k\u00ebt\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">k\u00ebtu<\/a><\/noindex>.<br \/>\n3: Kompilimi i imazhit me konfigurimin p\u00ebr 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: Nxjerrja nga ELF e seksioneve q\u00eb duhet t\u00eb shkruhen n\u00eb QSPI, n\u00eb 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>N\u00eb direktorin\u00eb conf ndodhet nj\u00eb skript q\u00eb e b\u00ebn k\u00ebt\u00eb, k\u00ebshtu q\u00eb mund ta filloni at\u00eb<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    ..\/conf\/qspi_objcopy.sh # Binaries i nevojsh\u00ebm -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Me ndihm\u00ebn e tftp ngarkoni qspi.bin.bin n\u00eb QSPI-flash. N\u00eb host, p\u00ebr k\u00ebt\u00eb duhet t\u00eb kopjoni qspi.bin n\u00eb dosjen rr\u00ebnj\u00ebsore t\u00eb serverit tftp (zakonisht \u00ebsht\u00eb \/srv\/tftp\/ ose \/var\/lib\/tftpboot\/; paketat p\u00ebr serverin p\u00ebrkat\u00ebs jan\u00eb t\u00eb disponueshme n\u00eb shumic\u00ebn e shp\u00ebrndarjeve popullore, zakonisht quhen tftpd ose tftp-hpa, ndonj\u00ebher\u00eb duhet t\u00eb b\u00ebni <code>systemctl start tftpd.service<\/code> p\u00ebr t\u00eb filluar).<\/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>N\u00eb Embox (pra, n\u00eb ngarkues) duhet t\u00eb ekzekutoni k\u00ebt\u00eb komand\u00eb (duke supozuar se adresa e serverit \u00ebsht\u00eb 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: Me ndihm\u00ebn e komand\u00ebs <code>goto<\/code> duhet t\u00eb &#171;kesh nj\u00eb k\u00ebrcim&#187; n\u00eb memorien QSPI. Lokacioni konkret do t\u00eb variroj\u00eb n\u00eb var\u00ebsi t\u00eb m\u00ebnyr\u00ebs sesi p\u00ebrgatitet imazhi, adres\u00ebn mund ta shihni me komand\u00ebn <code>mem 0x90000000<\/code> (adresa e fillimit p\u00ebrdoret n\u00eb fjal\u00ebn e dyt\u00eb 32-bit t\u00eb imazhit); gjithashtu do t\u00eb k\u00ebrkohet t\u00eb vendosni flamurin e stack-ut <code>-s<\/code>, adresa e stack-ut ndodhet n\u00eb adres\u00ebn 0x90000000, shembull:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt;mem 0x90000000\n    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275\n                      \u2191           \u2191\n              kjo \u00ebsht\u00eb adresa    kjo \u00ebsht\u00eb  adresa \n                e stack-ut        e par\u00eb\n                           e instrukcionit\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Flamuri -i \u00ebsht\u00eb i nevojsh\u00ebm p\u00ebr t\u00eb ndaluar nd\u00ebrprerjet gjat\u00eb inicimit t\u00eb sistemit<\/code><\/pre>\n<p><\/p>\n<p>7: Nisim<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>dhe shijoni k\u00ebrkimin e kufijve p\u00ebr 40 sekonda \ud83d\ude42<\/p>\n<p><\/p>\n<p>N\u00ebse ndodhi ndonj\u00eb problem \u2014 shkruani nj\u00eb \u00e7\u00ebshtje n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">repositori yn\u00eb<\/a><\/noindex>, ose n\u00eb list\u00ebn e postimeve embox-devel@googlegroups.com, ose n\u00eb komentet k\u00ebtu.<\/p>\n<p>Burimi: <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.2.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\/sq\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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 n\u00eb STM32F7-Discovery | ProHoster","description":"Un\u00eb jam nj\u00eb nga zhvilluesit e sistemit t\u00eb operimit","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}