{"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\/da\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","title":{"rendered":"OpenCV auf STM32F7-Discovery","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"OpenCV auf STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a2248ee685ee210ce8f7781435dd1d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/> Jeg er en af udviklerne af operativsystemet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, og i denne artikel vil jeg fort\u00e6lle, hvordan jeg har f\u00e5et OpenCV til at k\u00f8re p\u00e5 STM32746G boardet.<\/p>\n<p><\/p>\n<p>Hvis du s\u00f8ger efter noget som &#171;OpenCV p\u00e5 STM32-boards&#187;, kan du finde en del, der er interesseret i at bruge dette bibliotek p\u00e5 STM32-boards eller andre mikrokontrollere.<br \/>\nDer er flere videoer, som efter titlen at d\u00f8mme burde demonstrere, hvad der er n\u00f8dvendigt, men normalt (i alle videoerne, jeg har set) blev der kun udf\u00f8rt billedoptagelse fra et kamera og visning af resultatet p\u00e5 sk\u00e6rmen. Selve billedbehandlingen blev enten foretaget p\u00e5 en almindelig computer eller p\u00e5 kraftigere boards (for eksempel Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Hvorfor er det sv\u00e6rt?<\/h1>\n<p><\/p>\n<p>Populariteten af s\u00f8gningerne skyldes, at OpenCV er det mest popul\u00e6re bibliotek til computer vision, hvilket betyder, at flere udviklere kender det. Desuden g\u00f8r muligheden for at k\u00f8re desktop-kode p\u00e5 en mikrokontroller udviklingsprocessen betydeligt nemmere. Men hvorfor findes der stadig ikke nogle popul\u00e6re opskrifter til at l\u00f8se dette problem?<\/p>\n<p><\/p>\n<p>Problemet med at bruge OpenCV p\u00e5 sm\u00e5 boards er relateret til to egenskaber:<\/p>\n<p><\/p>\n<ul>\n<li>Selv hvis man kompilere biblioteket med det minimale s\u00e6t moduler, vil det simpelthen ikke kunne v\u00e6re i flashhukommelsen p\u00e5 STM32F7Discovery (endda uden at tage hensyn til OS) p\u00e5 grund af den meget store kode (flere megabyte instruktioner)<\/li>\n<li>Selve biblioteket er skrevet i C++, hvilket betyder\n<ul>\n<li>Der er behov for support til C++ runtime (undtagelser osv.)<\/li>\n<li>Der er lidt support til LibC\/Posix, som normalt findes i operativsystemer til indlejrede systemer \u2014 der er brug for en standard C++ bibliotek og standard template library STL (vector osv.)<\/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 s\u00e6dvanligt, f\u00f8r man porterer programmer til et operativsystem, er det en god id\u00e9 at fors\u00f8ge at bygge det i den form, som udviklerne havde til hensigt. I vores tilf\u00e6lde er der ikke problemer med dette \u2014 kildefilerne kan findes p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHub<\/a><\/noindex>, biblioteket kan bygges til GNU\/Linux med det almindelige cmake.<\/p>\n<p><\/p>\n<p>Fra de gode nyheder \u2013 OpenCV kan fra starten bygges som et statisk bibliotek, hvilket g\u00f8r porteringen lettere. Vi bygger biblioteket med standardkonfigurationen og ser, hvor meget plads de optager. Hvert modul bygges som et separat bibliotek.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">&gt; st\u00f8rrelse lib\/*so --totals\n   tekst    data     bss     dec     hex filnavn\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 det ses fra den sidste linje, optager .bss og .data ikke s\u00e5 meget plads, men koden er over 70 MiB. Det st\u00e5r klart, at hvis dette er linket statisk til en specifik applikation, vil koden fylde mindre.<\/p>\n<p><\/p>\n<p>Lad os pr\u00f8ve at fjerne s\u00e5 mange moduler som muligt for at sammenstille et minimalt eksempel (som f.eks. blot vil udskrive versionen af OpenCV), s\u00e5 her ser vi. <code>cmake .. -LA<\/code> og deaktiverer alle muligheder, der 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; st\u00f8rrelse lib\/libopencv_core.a --totals\n   tekst    data     bss     dec     hex filnavn\n3317069   36425   17987 3371481  3371d9 (TOTALS)<\/code><\/pre>\n<p><\/p>\n<p>P\u00e5 den ene side er det kun \u00e9n modul af biblioteket, men p\u00e5 den anden side er det uden kompilatoroptimering for kodes st\u00f8rrelse (<code>-Os<\/code>). ~3 MiB kode \u2014 det er stadig en del, men giver allerede h\u00e5b om succes.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">K\u00f8rsel i emulator<\/h2>\n<p><\/p>\n<p>Det er langt lettere at debugge i emulatoren, s\u00e5 lad os f\u00f8rst sikre os, at biblioteket fungerer p\u00e5 qemu. Som den emulerede platform har jeg valgt Integrator\/CP, fordi det for det f\u00f8rste ogs\u00e5 er ARM, og for det andet, at Embox underst\u00f8tter grafikudgang til denne platform.<\/p>\n<p><\/p>\n<p>I Embox findes der en mekanisme til at bygge eksterne biblioteker, ved hj\u00e6lp af den kan vi tilf\u00f8je OpenCV som et modul (ved at videregive de samme indstillinger til &#171;minimal&#187; opbygning i form af statiske biblioteker), hvorefter jeg tilf\u00f8jer en meget simpel applikation, som ser s\u00e5ledes ud:<\/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, k\u00f8rer \u2014 og f\u00e5r den forventede udgang.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox: \/#opencv_version                                                     \nOpenCV: \nGenerel konfiguration for OpenCV 4.0.1 =====================================\n  Versionskontrol:               bd6927bdf-dirty\n\n  Platform:\n    Tidsstempel:                   2019-06-21T10:02:18Z\n    V\u00e6rt:                        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 bygningsv\u00e6rkt\u00f8j:            \/usr\/bin\/make\n    Konfiguration:               Debug\n\n  CPU\/HW funktioner:\n    Grundl\u00e6ggende:\n      anmodet:                 DETECT\n      deaktiveret:                  VFPV3 NEON\n\n  C\/C++:\n    Bygget som dynamiske biblioteker?:      NEJ<\/code><\/pre>\n<p><\/p>\n<p>N\u00e6ste skridt er at k\u00f8re et eksempel, helst et standard eksempel fra udviklerne selv. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">p\u00e5 deres hjemmeside.<\/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 gr\u00e6nse detektoren.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Eksemplet m\u00e5tte skrives om en smule for at vise billedet med resultaterne direkte i framebufferen. Dette var n\u00f8dvendigt, da funktionen <code>imshow()<\/code> kan tegne billeder gennem QT, GTK og Windows interfaces, som selvf\u00f8lgelig ikke vil v\u00e6re i konfigurationen for STM32. Faktisk kan QT ogs\u00e5 k\u00f8res p\u00e5 STM32F7Discovery, men det vil blive beskrevet i en anden artikel \ud83d\ude42<\/p>\n<p><\/p>\n<p>Efter kort at finde ud af, i hvilket format gr\u00e6nse detektorens resultater gemmes, f\u00e5r vi billedet.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV auf STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/127f90ad8008340d73feb6ece02e52b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Originalbilledet.<\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV auf STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/da34b3ac2561ae9f223acc5c4fe2a597.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Resultat<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">K\u00f8rsel p\u00e5 STM32F7Discovery.<\/h2>\n<p><\/p>\n<p>P\u00e5 32F746GDISCOVERY er der flere hardwareminnesektioner, som vi kan bruge p\u00e5 forskellige m\u00e5der.<\/p>\n<p><\/p>\n<ol>\n<li>320KiB RAM.<\/li>\n<li>1MiB flashhukommelse til billedet.<\/li>\n<li>8MiB SDRAM.<\/li>\n<li>16MiB QSPI NAND-flash.<\/li>\n<li>Stik til microSD-kort.<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-kortet kan bruges til at gemme billeder, men i konteksten af at k\u00f8re et minimalt eksempel er det ikke s\u00e6rligt nyttigt.<br \/>\nDisplayet har en opl\u00f8sning p\u00e5 480&#215;272, hvilket betyder, at hukommelsen til framebufferen vil v\u00e6re 522.240 byte ved en dybde p\u00e5 32 bit, dvs. dette er mere end st\u00f8rrelsen p\u00e5 den RAM, s\u00e5 vi vil placere framebufferen og bunken (som ogs\u00e5 er n\u00f8dvendig for OpenCV til at gemme data til billeder og hj\u00e6lpestrukturer) i SDRAM, mens alt andet (hukommelse til stacks og andre systembehov) vil g\u00e5 til RAM.<\/p>\n<p><\/p>\n<p>Hvis man tager den minimale konfiguration for STM32F7Discovery (fjerne alt netv\u00e6rk, alle kommandoer, g\u00f8re stakke s\u00e5 sm\u00e5 som muligt osv.) og tilf\u00f8jer OpenCV med eksempler, vil hukommelseskravene 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 where the sections go, let me explain: in <code>.text<\/code> og <code>.rodata<\/code> are the instructions and constants (roughly speaking, readonly data), in <code>.data<\/code> are the modifiable data, in <code>.bss<\/code> her ligger &#171;nulstillede&#187; variabler, der dog stadig kr\u00e6ver plads (denne sektion &#171;g\u00e5r til&#187; RAM).<\/p>\n<p><\/p>\n<p>The good news is that <code>.data<\/code>\/<code>.bss<\/code> should fit, but with <code>.text<\/code> there's a problem \u2014 there is only 1MiB of memory available for the image. You could throw away 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 doesn\u2019t solve the problem: most of it <code>.text<\/code> is made up of OpenCV code. <code>.text<\/code> Essentially, there remains only one option \u2014 to load part of the code onto the QSPI flash chip (it has a special operating mode for memory mapping to the system bus, so the processor can directly access this data). However, there is a problem: first, the QSPI flash memory is not available immediately after rebooting the device (you need to separately initialize the memory-mapped mode), and second, you cannot 'flash' this memory with the usual loader.<\/p>\n<p><\/p>\n<p>I det store hele er der kun \u00e9n ting tilbage \u2014 at indl\u00e6se en del af koden til QSPI-flash (den har en s\u00e6rskilt arbejdsmetode til at kortl\u00e6gge hukommelse til systembussen, s\u00e5 processoren kan tilg\u00e5 disse data direkte). Her opst\u00e5r der et problem: for det f\u00f8rste er QSPI-flashen ikke tilg\u00e6ngelig straks efter genstart af enheden (man skal separat initialisere memory-mapped-tilstand), for det andet kan man ikke &#171;flashe&#187; denne hukommelse med en almindelig bootloader.<\/p>\n<p><\/p>\n<p>The idea of porting this library to Embox came about about a year ago, but it was postponed time and again for various reasons. One of them was support for libstdc++ and the standard template library. The issue of C++ support in Embox goes beyond the scope of this article, so I will only say here that we managed to achieve this support to the extent necessary for this library to work \ud83d\ude42<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">Resultat<\/h1>\n<p><\/p>\n<p>As a result, these problems were overcome (at least sufficiently 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 considerations on how to optimize this, a separate article can be written if successful).<\/p>\n<p><\/p>\n<p>Nevertheless, the intermediate goal was to create a prototype that would demonstrate the fundamental possibility of running OpenCV on STM32; accordingly, this goal was achieved, hurray! <\/p>\n<p>\n<img decoding=\"async\" alt=\"OpenCV auf STM32F7-Discovery\" src=\"\/wp-content\/uploads\/2019\/09\/a400c72865ec17094efc985908914463.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>tl;dr: step-by-step guide<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">0: Download the Embox source code, for example like this:<\/h4>\n<p><\/p>\n<p>git clone https:\/\/github.com\/embox\/embox &amp;&amp; cd .\/embox<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    1: Let's start with building the bootloader that will 'flash' the QSPI flash.<\/code><\/pre>\n<p><\/p>\n<p>1: Lad os starte med at bygge bootloaderen, der &#171;flasher&#187; QSPI-flashen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    lav confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Nu skal netv\u00e6rket konfigureres, da vi skal downloade billedet via TFTP. For at angive IP-adresserne for kortet og v\u00e6rten skal du \u00e6ndre filen conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Eksempel p\u00e5 konfiguration:<\/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 v\u00e6rten, hvorfra billedet vil blive hentet, <code>address<\/code> \u2014 adressen til kortet.<\/p>\n<p><\/p>\n<p>Efter dette samler vi bootloaderen:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Normal opstart af bootloaderen (undskyld for ordspillet) p\u00e5 kortet \u2014 der er ikke noget specifikt her, det skal g\u00f8res som for enhver anden applikation til STM32F7Discovery. Hvis du ikke ved, hvordan man g\u00f8r dette, kan du l\u00e6se om det <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">her<\/a><\/noindex>.<br \/>\n3: Kompilering af billedet med konfiguration til 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: Uddragning af ELF-sektioner, der skal skrives til QSPI, til 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 mappen conf ligger der et script, som g\u00f8r dette, s\u00e5 det er muligt at k\u00f8re det<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Den n\u00f8dvendige bin\u00e6r -- build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: Ved hj\u00e6lp af tftp uploader vi qspi.bin.bin til QSPI-flash-drevet. P\u00e5 v\u00e6rten skal du kopiere qspi.bin til roden af tftp-serverens mappe (normalt er det \/srv\/tftp\/ eller \/var\/lib\/tftpboot\/; pakker til den tilsvarende server findes i de fleste popul\u00e6re distributioner, som regel heter tftpd eller tftp-hpa, nogle gange skal du k\u00f8re <code>systemctl start tftpd.service<\/code> for at 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 bootloaderen) skal du k\u00f8re f\u00f8lgende kommando (vi antager, 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: Ved hj\u00e6lp af kommandoen <code>goto<\/code> vi skal &#171;springe&#187; ind i QSPI-hukommelsen. Den specifikke placering vil variere afh\u00e6ngigt af, hvordan billedet linkes, den adresse kan ses med kommandoen <code>mem 0x90000000<\/code> (startadressen ligger i det andet 32-bits ord i billedet); det vil ogs\u00e5 v\u00e6re n\u00f8dvendigt at indstille stack-flaget <code>-s<\/code>, stakens adresse findes 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                           instruktion\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Flag -i er n\u00f8dvendigt for at forhindre afbrydelser under systeminitialisering<\/code><\/pre>\n<p><\/p>\n<p>7: Vi starter<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>og nyder en 40-sekunders kantdetektering \ud83d\ude42<\/p>\n<p><\/p>\n<p>Hvis noget g\u00e5r galt \u2014 skriv en issue i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">vores repository<\/a><\/noindex>, eller til mailinglisten embox-devel@googlegroups.com, eller i kommentarerne 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.3 - 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\/da\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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":"Jeg er en af udviklerne af operativsystemet","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}