{"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\/sl\/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;\" \/> Sem razvijalec operacijskega sistema <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">Embox<\/a><\/noindex>, v tem \u010dlanku pa bom predstavil, kako sem uspel zagnati OpenCV na STM32746G plo\u0161\u010di.<\/p>\n<p><\/p>\n<p>\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.<br \/>\nObstaja ve\u010d videov, ki, sode\u010d po naslovu, naj bi prikazovali to, kar potrebujete, vendar obi\u010dajno (v vseh videih, ki sem jih videl) na STM32 plo\u0161\u010di samo pridobivajo sliko iz kamere in prikazujejo rezultat na ekranu, obdelava slik pa poteka bodisi na obi\u010dajnem ra\u010dunalniku bodisi na zmogljivej\u0161ih plo\u0161\u010dah (na primer Raspberry Pi).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"pochemu-eto-slozhno\">Zakaj je to zahtevno?<\/h1>\n<p><\/p>\n<p>Priljubljenost iskalnih poizvedb je razlo\u017eena s tem, da je OpenCV najbolj priljubljena knji\u017enica za ra\u010dunalni\u0161ki vid, kar pomeni, da je z njo seznanjenih ve\u010d razvijalcev, pa tudi mo\u017enost zagona kode, pripravljene za namizje, na mikrokrmilniku znatno poenostavi postopek razvoja. Ampak zakaj \u0161e vedno ni nekaterih popularnih re\u0161itev za to te\u017eavo?<\/p>\n<p><\/p>\n<p>Te\u017eava pri uporabi OpenCV na manj\u0161ih plo\u0161\u010dah je povezana z dvema zna\u010dilnostma:<\/p>\n<p><\/p>\n<ul>\n<li>\u010ce knji\u017enico skompilirate, tudi z minimalnim naborom modulov, v flash pomnilnik STM32F7Discovery preprosto ne bo \u0161la (tudi brez ra\u010dunanja operacijskega sistema) zaradi zelo velike kode (ve\u010d megabajtov ukazov)<\/li>\n<li>Sama knji\u017enica je napisana v C++, kar pomeni\n<ul>\n<li>Potrebna je podpora C++ runtime-a (izjeme itd.)<\/li>\n<li>Pomanjkanje podpore za LibC\/Posix, ki je obi\u010dajno prisotna v operacijskih sistemih za vgrajene sisteme \u2014 potrebna je standardna knji\u017enica C++ in standardna knji\u017enica predlog STL (vector itd.)<\/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>Kot obi\u010dajno, pred portiranjem kakr\u0161ne koli programske opreme v operacijski sistem ni slabo poskusiti sestaviti v obliki, kot so jo na\u010drtovali razvijalci. V na\u0161em primeru s tem ni te\u017eav \u2014 izvorne kode lahko najdete na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\">GitHubu<\/a><\/noindex>, knji\u017enico je mogo\u010de sestaviti pod GNU\/Linux z obi\u010dajnim cmake-om.<\/p>\n<p><\/p>\n<p>Iz dobrih novic \u2014 OpenCV lahko iz \u0161katlice sestavite kot stati\u010dno knji\u017enico, kar olaj\u0161a portiranje. Sestavimo knji\u017enico s standardno konfiguracijo in preverimo, koliko prostora zasedejo. Vsak modul se sestavi v lo\u010deno knji\u017enico.<\/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>Kot je razvidno iz zadnjega vrstice, .bss in .data ne zavzemata veliko prostora, toda koda pa presega 70 MiB. Jasno je, da bo pri stati\u010dni povezavi s specifi\u010dno aplikacijo koda manj\u0161a.<\/p>\n<p><\/p>\n<p>Poskusimo odstraniti \u010dim ve\u010d modulov, da zgradimo minimalen primer (ki na primer preprosto izpi\u0161e razli\u010dico OpenCV), zato poglejte <code>cmake .. -LA<\/code> in onemogo\u010damo vse, kar se lahko onemogo\u010di, v mo\u017enostih.<\/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>Po eni strani gre le za en modul knji\u017enice, po drugi strani pa je to brez optimizacije s strani kompajlerja za velikost kode (<code>-Os<\/code>). ~3 MiB kode \u2013 to je \u0161e vedno precej veliko, vendar \u017ee daje upanje na uspeh.<\/p>\n<p><\/p>\n<h2 id=\"zapusk-v-emulyatore\">Zagon v emulatorju<\/h2>\n<p><\/p>\n<p>Na emulatorju je debugiranje precej la\u017eje, zato najprej preverimo, ali knji\u017enica deluje na qemu. Kot emulirana platforma sem izbral Integrator\/CP, saj je to prav tako ARM, poleg tega pa Embox podpira izhod grafike za to platformo.<\/p>\n<p><\/p>\n<p>\u0412 Embox \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c OpenCV \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c (\u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0432\u0441\u0435 \u0442\u0435 \u0436\u0435 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f &#171;\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439&#187; \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a), \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/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>Zgradimo sistem, za\u017eenemo \u2013 dobimo pri\u010dakovani izhod.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">root@embox: \/#opencv_version                                                     \nOpenCV: \nGeneral configuration for OpenCV 4.0.1 =====================================\n  Version control:               bd6927bdf-dirty\n\n  Platform:\n    Timestamp:                   2019-06-21T10:02:18Z\n    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64\n    Target:                      Generic arm-unknown-none\n    CMake:                       3.14.5\n    CMake generator:             Unix Makefiles\n    CMake build tool:            \/usr\/bin\/make\n    Configuration:               Debug\n\n  CPU\/HW features:\n    Baseline:\n      requested:                 DETECT\n      disabled:                  VFPV3 NEON\n\n  C\/C++:\n    Built as dynamic libs?:      NO<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0438\u0437 \u0442\u0435\u0445, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/examples.html\">\u0443 \u0441\u0435\u0431\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435<\/a><\/noindex>. \u042f \u0432\u044b\u0431\u0440\u0430\u043b <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.opencv.org\/4.1.0\/d6\/d56\/samples_2cpp_2edge_8cpp-example.html\">\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0433\u0440\u0430\u043d\u0438\u0446 \u041a\u044d\u043d\u043d\u0438<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043e \u0444\u0440\u044d\u0439\u043c-\u0431\u0443\u0444\u0444\u0435\u0440. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c, \u0442.\u043a. \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>imshow()<\/code> \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b QT, GTK \u0438 Windows, \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0434\u043b\u044f STM32 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, QT \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 STM32F7Discovery, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0443\u0436\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \ud83d\ude42<\/p>\n<p><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u0432 \u043a\u0430\u043a\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u043d\u0438\u0446, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/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>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430<\/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>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/em><\/p>\n<p><\/p>\n<h2 id=\"zapusk-na-stm32f7discovery\">\u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430 STM32F7Discovery<\/h2>\n<p><\/p>\n<p>\u041d\u0430 32F746GDISCOVERY \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<\/p>\n<p><\/p>\n<ol>\n<li>320KiB \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li>1MiB \u0444\u043b\u044d\u0448-\u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0437\u0430<\/li>\n<li>8MiB SDRAM<\/li>\n<li>16MiB QSPI NAND-\u0444\u043b\u044d\u0448\u043a\u0430<\/li>\n<li>\u0420\u0430\u0437\u044a\u0451\u043c \u0434\u043b\u044f microSD-\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438<\/li>\n<\/ol>\n<p><\/p>\n<p>SD-\u043a\u0430\u0440\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<br \/>\n\u0414\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 480&#215;272, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0444\u0435\u0440 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 522 240 \u0431\u0430\u0439\u0442 \u043f\u0440\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 32 \u0431\u0438\u0442\u0430, \u0442.\u0435. \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0431\u0443\u0444\u0444\u0435\u0440 \u0438 \u043a\u0443\u0447\u0443 (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f OpenCV, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440) \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u0432 SDRAM, \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (\u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0442\u044d\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043d\u0443\u0436\u0434\u044b) \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432 RAM.<\/p>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f STM32F7Discovery (\u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u044e \u0441\u0435\u0442\u044c, \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u044d\u043a\u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0442.\u0434.) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 OpenCV \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438, \u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/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 tiste, ki niso ravno seznanjeni s tem, katere sekcije kam spadajo, naj pojasnim: v <code>.text<\/code> in <code>.rodata<\/code> le\u017ee navodila in konstante (preprosto re\u010deno, readonly-podatki), v <code>.data<\/code> le\u017ee podatki, ki jih je mogo\u010de spreminjati, v <code>.bss<\/code> \u043b\u0435\u0436\u0438\u0442 &#171;\u0437\u0430\u043d\u0443\u043b\u0451\u043d\u043d\u044b\u0435&#187; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0443\u0436\u043d\u043e \u043c\u0435\u0441\u0442\u043e (\u044d\u0442\u0430 \u0441\u0435\u043a\u0446\u0438\u044f &#171;\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f&#187; \u0432 RAM).<\/p>\n<p><\/p>\n<p>Dobre novice so, da <code>.data<\/code>\/<code>.bss<\/code> morajo biti shranjene, medtem ko je <code>.text<\/code> te\u017eava \u2014 pod sliko je le 1MiB pomnilnika. Lahko odstranimo <code>.text<\/code> sliko iz primera in jo preberemo, na primer, s SD-kartice v pomnilnik ob zagonu, vendar fruits.png tehta pribli\u017eno 330KiB, tako da ta te\u017eave ne re\u0161i: velika ve\u010dina <code>.text<\/code> sestavlja prav to koda OpenCV.<\/p>\n<p><\/p>\n<p>\u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0451\u0442\u0443, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u2014 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 QSPI-\u0444\u043b\u044d\u0448\u043a\u0443 (\u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446. \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043b\u044f \u043c\u044d\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0448\u0438\u043d\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0430\u043c\u044f\u0442\u044c QSPI-\u0444\u043b\u044d\u0448\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c memory-mapped-\u0440\u0435\u0436\u0438\u043c), \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0435\u043b\u044c\u0437\u044f &#171;\u043f\u0440\u043e\u0448\u0438\u0442\u044c&#187; \u044d\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u043c.<\/p>\n<p><\/p>\n<p>Na koncu je bilo odlo\u010deno, da se bo celotna koda povezala v QSPI, in se jo bo nalo\u017eilo s samostojnim zagonskim programom, ki bo pridobival ustrezen binarni datoteko po TFTP.<\/p>\n<p><\/p>\n<h1 id=\"rezultat\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/h1>\n<p><\/p>\n<p>Ideja o prenosu te knji\u017enice na Embox se je pojavila \u017ee pred pribli\u017eno letom dni, vendar je bila ve\u010dkrat odlo\u017eena iz razli\u010dnih razlogov. Eden od teh razlogov je podpora libstdc++ in standardni knji\u017enici predlogov. Problem s podporo C++ v Emboxu presega obseg te vsebine, zato naj povem le, da nam je uspelo dose\u010di to podporo v potrebni meri za delovanje te knji\u017enice \ud83d\ude42<\/p>\n<p><\/p>\n<p>Na koncu so bile te te\u017eave premagane (vsaj v zadostni meri za delovanje primera OpenCV) in primer se je zagnal. Iskanje meja s Canny filtri traja 40 dolgotrajnih sekund. To je seveda predolgo (obstajajo ideje, kako to optimizirati, o tem pa bi lahko napisali poseben \u010dlanek v primeru uspeha). <\/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>Kljub temu je bila vmesna naloga ustvariti prototip, ki bi pokazal na\u010delno mo\u017enost uporabe OpenCV na STM32, zato je ta cilj dose\u017een, hura!<\/p>\n<h4 id=\"tldr-poshagovaya-instrukciya\">tl;dr: korak za korakom navodila<\/h4>\n<p><\/p>\n<p>0: Prenesemo vire Embox, na primer tako:<\/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: \u041d\u0430\u0447\u043d\u0451\u043c \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#171;\u043f\u0440\u043e\u0448\u044c\u0451\u0442&#187; QSPI-\u0444\u043b\u044d\u0448\u043a\u0443.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make confload-arm\/stm32f7cube<\/code><\/pre>\n<p><\/p>\n<p>Sedaj je potrebno nastaviti omre\u017eje, ker bomo prenesli sliko preko TFTP. Da bi dodelili IP-naslove kartici in gostitelju, je treba spremeniti datoteko conf\/rootfs\/network.<\/p>\n<p><\/p>\n<p>Primer 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>prehod<\/code> \u2014 naslov gostitelja, s katerega bo slika nalo\u017eena, <code>naslov<\/code> \u2014 naslov kartice.<\/p>\n<p><\/p>\n<p>Po tem zberemo zaganjalnik:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    make<\/code><\/pre>\n<p><\/p>\n<p>2: Obi\u010dajno nalaganje zaganjalnika (oprosti za besedno igro) na kartico \u2014 tukaj ni ni\u010d posebnega, morate to storiti kot pri kateri koli drugi aplikaciji za STM32F7Discovery. \u010ce ne veste, kako to narediti, lahko preberete o tem. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/embox\/blog\/349034\/\">tukaj<\/a><\/noindex>.<br \/>\n3: Kompilacija slike s konfiguracijo 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: Izvle\u010denje iz ELF sekcij, ki jih je treba zapisati v QSPI, v qspi.bin<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    arm-none-eabi-objcopy -O binary build\/base\/bin\/embox build\/base\/bin\/qspi.bin \n        --only-section=.text --only-section=.rodata \n        --only-section='.ARM.ex*' \n        --only-section=.data<\/code><\/pre>\n<p><\/p>\n<p>V direktoriju conf se nahaja skripta, ki to stori, tako da jo lahko za\u017eenete.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    .\/conf\/qspi_objcopy.sh # Potreben binar \u2014 build\/base\/bin\/qspi.bin<\/code><\/pre>\n<p><\/p>\n<p>5: S pomo\u010djo tftp nalo\u017eimo qspi.bin na QSPI-pomnilnik. Na gostitelju je treba qspi.bin kopirati v korensko mapo tftp-stre\u017enika (ponavadi je to \/srv\/tftp\/ ali \/var\/lib\/tftpboot\/; paketi za ustrezen stre\u017enik so na voljo v ve\u010dini priljubljenih distribucij, obi\u010dajno se imenuje tftpd ali tftp-hpa, v\u010dasih je potrebno zagnati <code>systemctl start tftpd.service<\/code> za za\u010detek).<\/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 Embox-u (t.j. v zaganjalniku) je treba izvesti ukaz (predvidevamo, da je naslov stre\u017enika 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: S pomo\u010djo ukaza <code>goto<\/code> \u043d\u0443\u0436\u043d\u043e &#171;\u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c&#187; \u0432 QSPI-\u043f\u0430\u043c\u044f\u0442\u044c. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0437 \u0441\u043b\u0438\u043d\u043a\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>mem 0x90000000<\/code> (naslov za\u010detka je zapisan v druge 32-bitne besede slike); prav tako bo potrebno nastaviti sklad s flagom <code>-s<\/code>, naslov sklada le\u017ei na naslovu 0x90000000, primer:<\/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 naslov    to je  naslov \n                sklada        prve\n                           instrukcije\n\n    embox&gt;goto -i 0x9000c27f -s 0x20023200 # Flag -i je potreben, da prepre\u010di prekinitve med inicializacijo sistema<\/code><\/pre>\n<p><\/p>\n<p>7: Za\u010dnite<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">    embox&gt; edges 20<\/code><\/pre>\n<p><\/p>\n<p>in u\u017eivajte v 40-sekundnem iskanju meja \ud83d\ude42<\/p>\n<p><\/p>\n<p>\u010ce bo pri\u0161lo do te\u017eav, pi\u0161ite na te\u017eave v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/embox\/embox\">na\u0161em repozitoriju<\/a><\/noindex>, ali na mailing listo embox-devel@googlegroups.com, ali v komentarje tukaj.<\/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.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/opencv-na-stm32f7-discovery\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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":"Sem razvijalec operacijskega sistema","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/opencv-na-stm32f7-discovery","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/37914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=37914"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/37914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/28450"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=37914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=37914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=37914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}