{"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\/no\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV p\u00e5 STM32F7-Discovery","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV p\u00e5 STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Eg er ein av utviklarane av operativsystemet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, og i denne artikkelen vil eg fortelje om korleis eg fekk OpenCV til \u00e5 fungere p\u00e5 STM32746G-brettet.<\/p>\n<p><\/p>\n<p>Hvis du skriver noe som &#171;OpenCV p\u00e5 STM32-kort&#187; i s\u00f8kemotoren, kan du finne mange som er interessert i \u00e5 bruke dette biblioteket p\u00e5 STM32-kort eller andre mikrokontrollere.<br \/>\nDet fins fleire videoar som, ut fr\u00e5 tittelen, skal demonstrere det som er n\u00f8dvendig, men som regel (i alle videoar eg har sett) vart det p\u00e5 STM32-brettet berre henta bilde fr\u00e5 eit kamera og vist resultatet p\u00e5 skjermen, medan sj\u00f8lve bildebehandlinga vart gjort enten p\u00e5 ein vanlig datamaskin eller p\u00e5 kraftigare brett (for eksempel Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Kvifor er dette vanskeleg?<\/h1>\n<p><\/p>\n<p>Populariteten til s\u00f8kjerane kan forklarast med at OpenCV er det mest popul\u00e6re biblioteket for datamaskinsyn, noko som betyr at fleire utviklarar er kjent med det, og moglegheita for \u00e5 k\u00f8yre ferdig kode for desktop p\u00e5 ein mikrokontroller gjer utviklingsprosessen mykje enklare. Men kvifor finst det fortsatt inga popul\u00e6re konkrete l\u00f8ysing p\u00e5 dette problemet?<\/p>\n<p><\/p>\n<p>Problemet med \u00e5 bruke OpenCV p\u00e5 sm\u00e5 brett heng saman med to s\u00e6rtrekk:<\/p>\n<p><\/p>\n<ul>\n<li>Dersom ein kompilerer biblioteket med til og med det minimale settet av moduler, vil det rett og slett ikkje f\u00e5 plass i flash-minnet til STM32F7Discovery (utan \u00e5 ta med OS) p\u00e5 grunn av den store st\u00f8rrelsen p\u00e5 koden (flere megabyte instruksjonar)<\/li>\n<li>Selve biblioteket er skrive i C++, og det betyr\n<ul>\n<li>At ein treng st\u00f8tte for C++-runtime (unntak m.m.)<\/li>\n<li>Lite st\u00f8tte for LibC\/Posix, som vanlegvis finst i operativsystem for innebygde system - ein treng standardbibliotek for C++ og standardmalbiblioteket STL (vektor m.m.)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"portirovanie-na-embox\">Portering til Embox<\/h1>\n<p><\/p>\n<p>Som vanleg, f\u00f8r ein porterer programvare til operativsystemet, b\u00f8r ein pr\u00f8ve \u00e5 bygge det slik utviklarane hadde tenkt. I v\u00e5rt tilfelle oppst\u00e5r det ikkje problem med dette - kjeldene kan bli funne p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHub<\/a><\/noindex>, biblioteket kan bli bygd for GNU\/Linux med vanleg cmake.<\/p>\n<p><\/p>\n<p>Av gode nyheiter er at OpenCV kan bli bygd som eit statisk bibliotek, noko som gjer porteringa enklare. Me byggjer biblioteket med standardkonfigurasjonen og sj\u00e5 kor mykje plass det tar. Kvar modul blir bygd som eit eige bibliotek.<\/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>Som syns i den siste linjen, tar .bss og .data ikke s\u00e5 mye plass, men kodene er over 70 MiB. Det er klart at dersom dette bindes statisk med en spesifikk applikasjon, vil koden bli mindre.<\/p>\n<p><\/p>\n<p>La oss pr\u00f8ve \u00e5 fjerne s\u00e5 mange moduler som mulig for \u00e5 samle et minimalt eksempel (som for eksempel bare viser versjonen av OpenCV), s\u00e5 vi ser. <code>cmake .. -LA<\/code> og deaktiverer alle opsjoner som kan deaktiveres.<\/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>P\u00e5 den ene siden er dette bare \u00e9n modul av biblioteket, men p\u00e5 den andre siden er dette uten optimalisering av kompilatoren for kode st\u00f8rrelse (<code>-Os<\/code>). ~3 MiB kode er fortsatt en god del, men gir allerede h\u00e5p om suksess.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Kj\u00f8ring i emulator<\/h2>\n<p><\/p>\n<p>Det er mye enklere \u00e5 feils\u00f8ke i emulator, s\u00e5 f\u00f8rst skal vi sikre oss at biblioteket fungerer p\u00e5 qemu. Som emulert plattform valgte jeg Integrator\/CP, fordi dette er ogs\u00e5 ARM, og i tillegg st\u00f8tter Embox grafikkutgang for denne plattformen.<\/p>\n<p><\/p>\n<p>Embox har en mekanisme for \u00e5 bygge eksterne biblioteker, ved hjelp av den legger vi til OpenCV som et modul (ved \u00e5 overf\u00f8re de samme alternativene for &#171;minimal&#187; bygging i form av statiske biblioteker), etter dette legger jeg til en enkel applikasjon som ser slik ut:<\/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>Vi bygger systemet, starter det \u2014 og f\u00e5r den forventede utgangen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox:\/$opencv_version                                                     \nOpenCV: \nGenerell konfigurasjon for OpenCV 4.0.1 =====================================\n  Versjonskontroll:               bd6927bdf-dirty\n\n  Plattform:\n    Tidsstempel:                   2019-06-21T10:02:18Z\n    Vert:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    M\u00e5l:                      Generisk arm-unknown-none\n    CMake:                       3.14.5\n    CMake-generator:             Unix Makefiles\n    CMake byggeverkt\u00f8y:            \/usr\/bin\/make\n    Konfigurasjon:               Debug\n\n  CPU\/HW-funksjoner:\n    Grunnlinje:\n      forespurt:                 DETECT\n      deaktivert:                  VFPV3 NEON\n\n  C\/C++:\n    Bygget som dynamiske biblioteker?:      NEI<\/code><\/pre>\n<p><\/p>\n<p>Neste steg er \u00e5 kj\u00f8re et eksempel, helst et standard eksempel fra utviklerne selv <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">p\u00e5 deres nettside<\/a><\/noindex>. Jeg valgte <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">Canny kantdetektor<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Eksemplet m\u00e5tte skrives om litt for \u00e5 vise bildet med resultatet direkte i framebuffer. Dette m\u00e5tte gj\u00f8res fordi funksjonen <code>imshow()<\/code> kan tegne bilder via grensesnittene QT, GTK og Windows, som selvf\u00f8lgelig ikke vil v\u00e6re i konfigurasjonen for STM32. Faktisk kan QT ogs\u00e5 kj\u00f8res p\u00e5 STM32F7Discovery, men det vil bli behandlet i en annen artikkel \ud83d\ude42<\/p>\n<p><\/p>\n<p>Etter en kort avklaring om hvilket format resultatet fra kantdetektoren lagres i, f\u00e5r vi bildet.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV p\u00e5 STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Det originale bildet<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV p\u00e5 STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Resultatet<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">Kj\u00f8ring p\u00e5 STM32F7Discovery<\/h2>\n<p><\/p>\n<p>P\u00e5 32F746GDISCOVERY er det flere maskinvareminnesegmenter som vi kan bruke p\u00e5 forskjellige m\u00e5ter<\/p>\n<p><\/p>\n<ol>\n<li>320KiB RAM<\/li>\n<li>1MiB flashminne for bildet<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND-flash<\/li>\n<li>Grensesnitt for microSD-kort<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-kortet kan brukes til \u00e5 lagre bilder, men i sammenheng med \u00e5 kj\u00f8re et minimalt eksempel er det ikke veldig nyttig.<br \/>\nSkjermen har en oppl\u00f8sning p\u00e5 480&#215;272, noe som betyr at minnet for framebufferen vil v\u00e6re 522 240 byte med en dybde p\u00e5 32 bit, alts\u00e5 mer enn st\u00f8rrelsen p\u00e5 RAM, s\u00e5 framebufferen og haugen (som ogs\u00e5 trengs for OpenCV for \u00e5 lagre data for bilder og hjelpestrukturer) vil bli plassert i SDRAM, alt annet (minnet for stakker og andre systembehov) vil g\u00e5 til RAM.<\/p>\n<p><\/p>\n<p>Hvis vi tar en minimal konfigurasjon for STM32F7Discovery (fjerner alt nettverk, alle kommandoer, gj\u00f8r stakkene s\u00e5 sm\u00e5 som mulig osv.) og legger til OpenCV med eksempler, vil minnebehovet v\u00e6re f\u00f8lgende:<\/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>For those who are not very familiar with how sections are arranged, let me explain: in <code>.text<\/code> og <code>.rodata<\/code> are stored instructions and constants (roughly speaking, readonly data), in <code>.data<\/code> are mutable data stored, in <code>.bss<\/code> liggende &#171;nulstilte&#187; variabler, som likevel trenger plass (denne seksjonen &#171;g\u00e5r&#187; til RAM).<\/p>\n<p><\/p>\n<p>The good news is that <code>.data<\/code>\/<code>.bss<\/code> should fit, but there's a problem \u2014 there is only 1MiB of memory for the image. You can discard 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: a large part <code>.text<\/code> consists precisely of OpenCV code. <code>.text<\/code> Basically, there is only one solution left \u2014 to load part of the code onto the QSPI flash chip (it has a special operating mode for mapping memory onto the system bus, so the processor can directly access this data). However, there is a problem: firstly, the memory of the QSPI flash is not available immediately after resetting the device (you need to separately initialize the memory-mapped mode), and secondly, you cannot \"flash\" this memory with the usual bootloader. <code>.text<\/code> As a result, it was decided to link all the code into QSPI and flash it with a custom bootloader that will obtain the necessary binary via TFTP.<\/p>\n<p><\/p>\n<p>I det store og hele gjenst\u00e5r det bare \u00e9n ting \u2014 laste en del kode til QSPI-flash (den har en spes. driftsmodus for \u00e5 mappe minnet til systembussen, slik at prosessoren kan f\u00e5 tilgang til disse dataene direkte). Dette medf\u00f8rer et problem: for det f\u00f8rste er QSPI-flash-minnet ikke tilgjengelig umiddelbart etter omstart av enheten (det m\u00e5 initialiseres separat i memory-mapped-modus), for det andre kan du ikke &#171;flash&#187; dette minnet med den vanlige bootloaderen.<\/p>\n<p><\/p>\n<p>Ultimately, these problems were overcome (at least to a sufficient extent for the OpenCV example to work), and the example ran. The board takes 40 long seconds to find edges with the Canny filter. This is, of course, too long (there are ideas on how to optimize this, and I could write a separate article on it if successful).<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Resultatet<\/h1>\n<p><\/p>\n<p>Nevertheless, the intermediate goal was to create a prototype that demonstrates the principle possibility of running OpenCV on STM32, and thus, this goal was achieved, hooray!<\/p>\n<p><\/p>\n<p>tl;dr: step-by-step guide <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV p\u00e5 STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>0: Download the Embox sources, for instance, like this:<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">git clone https:\/\/github.com\/embox\/embox &amp;&amp; cd .\/embox<\/h4>\n<p><\/p>\n<p>1: Let's start with building the bootloader that will \"flash\" the QSPI flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>1: La oss begynne med \u00e5 bygge bootloaderen som &#171;flasher&#187; QSPI-flash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>N\u00e5 m\u00e5 vi konfigurere nettverket, ettersom vi skal laste opp bildet via TFTP. For \u00e5 angi IP-adressene til kortet og verten, m\u00e5 du endre filen conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Eksempel p\u00e5 konfigurasjon:<\/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 adressen til verten som bildet skal lastes opp fra, <code>address<\/code> \u2014 adressen til kortet.<\/p>\n<p><\/p>\n<p>Etter dette bygger vi oppstartslasteren:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    lag<\/code><\/pre>\n<p><\/p>\n<p>2: Alminnelig lasting av oppstartslasteren (unnskyld ordspillet) p\u00e5 kortet \u2014 det er ingenting spesifikt her, det m\u00e5 gj\u00f8res som med hvilken som helst annen applikasjon for STM32F7Discovery. Hvis du ikke vet hvordan dette gj\u00f8res, kan du lese om det <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">here<\/a><\/noindex>.<br \/>\n3: Kompilering av bildet med konfigurasjon for 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: Utdrag fra ELF-seksjoner som m\u00e5 skrives til QSPI, i 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>I katalogen conf finnes det et skript som gj\u00f8r dette, s\u00e5 du kan starte det<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # N\u00f8dvendig bin\u00e6r -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Ved hjelp av tftp laster vi opp qspi.bin.bin til QSPI-flashminnet. P\u00e5 verten m\u00e5 du kopiere qspi.bin til rotmappen til tftp-serveren (vanligvis er dette \/srv\/tftp\/ eller \/var\/lib\/tftpboot\/; pakkene for den aktuelle serveren finnes i de fleste popul\u00e6re distribusjoner, ofte kalt tftpd eller tftp-hpa, noen ganger m\u00e5 du gj\u00f8re <code>systemctl start tftpd.service<\/code> for \u00e5 starte).<\/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>P\u00e5 Embox (dvs. i oppstartslasteren) m\u00e5 du utf\u00f8re f\u00f8lgende kommando (vi antar at serverens adresse er 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: Med kommandoen <code>goto<\/code> du m\u00e5 &#171;hoppe&#187; inn i QSPI-minnet. Den spesifikke lokasjonen vil variere avhengig av hvordan bildet linkses, denne adressen kan sees med kommandoen. <code>mem 0x90000000<\/code> (startadressen ligger i det andre 32-bits ordet i bildet); det vil ogs\u00e5 v\u00e6re n\u00f8dvendig \u00e5 sette stakken med flagg <code>-s<\/code>, stakkens adresse ligger p\u00e5 adressen 0x90000000, eksempel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt;mem 0x90000000\n    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275\n                      \u2191           \u2191\n              dette er adressen    dette er adressen \n                til stakken        til den f\u00f8rste\n                           instruksjonen\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Flagget -i er n\u00f8dvendig for \u00e5 forhindre avbrudd under systeminitialisering<\/code><\/pre>\n<p><\/p>\n<p>7: Kj\u00f8r<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>og nyt 40 sekunder med kantdeteksjon \ud83d\ude42<\/p>\n<p><\/p>\n<p>Hvis noe g\u00e5r galt \u2014 skriv en issue i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">v\u00e5r repository<\/a><\/noindex>, eller p\u00e5 mailinglisten embox-devel@googlegroups.com, eller i kommentarene her.<\/p>\n<p>Kilde: <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\/no\/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=\"nn_NO\" \/>\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\/no\/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 p\u00e5 STM32F7-Discovery | ProHoster","description":"Eg er ein av utviklarane av operativsystemet","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}