OpenCV fuq STM32F7-Discovery

OpenCV fuq STM32F7-Discovery Jien wieħed mill-iżviluppaturi tas-sistema operattiva Embox, u f'dan l-artikolu ser nitkellem dwar kif irnexxieli nħaddem OpenCV fuq il-bord STM32746G.

Jekk ttajpja xi ħaġa bħal "OpenCV fuq bord STM32" f'magna ta 'riċerka, tista' ssib pjuttost ftit nies li huma interessati li jużaw din il-librerija fuq bordijiet STM32 jew mikrokontrolluri oħra.
Hemm diversi vidjows li, meta wieħed jiġġudika mill-isem, għandhom juru x'inhu meħtieġ, iżda ġeneralment (fil-videos kollha li rajt) fuq il-bord STM32, l-immaġni biss waslet mill-kamera u r-riżultat intwera fuq l-iskrin, u l-ipproċessar tal-immaġni innifsu sar jew fuq kompjuter regolari, jew fuq bordijiet aktar b'saħħithom (per eżempju, Raspberry Pi).

Għaliex huwa diffiċli?

Il-popolarità tal-mistoqsijiet tat-tiftix hija spjegata mill-fatt li OpenCV hija l-aktar librerija tal-viżjoni tal-kompjuter popolari, li jfisser li aktar żviluppaturi huma familjari magħha, u l-abbiltà li tħaddem kodiċi lest għad-desktop fuq mikrokontrollur tissimplifika ħafna l-proċess ta 'żvilupp. Imma għaliex għad m'hemmx riċetti popolari lesti biex issolvi din il-problema?

Il-problema ta 'l-użu ta' OpenCV fuq xalel żgħar hija relatata ma 'żewġ karatteristiċi:

  • Jekk tikkompila l-librerija anke b'sett minimu ta 'moduli, sempliċement mhux se tidħol fil-memorja flash ta' l-istess STM32F7Discovery (anke mingħajr ma tqis l-OS) minħabba kodiċi kbir ħafna (diversi megabytes ta 'struzzjonijiet)
  • Il-librerija nnifisha hija miktuba f'C++, li jfisser
    • Jeħtieġ appoġġ għal runtime pożittiv (eċċezzjonijiet, eċċ.)
    • Ftit appoġġ għal LibC/Posix, li normalment jinstab f'OS għal sistemi inkorporati - għandek bżonn librerija standard plus u librerija standard tal-mudelli STL (vettur, eċċ.)

Porting għal Embox

Bħas-soltu, qabel ma tittrasferixxi xi programmi fis-sistema operattiva, hija idea tajba li tipprova tibnih fil-forma li biha l-iżviluppaturi ħasbuha. Fil-każ tagħna, m'hemm l-ebda problemi ma 'dan - il-kodiċi tas-sors jista' jinstab fuq github, il-librerija hija mibnija taħt GNU/Linux bil-cmake tas-soltu.

L-aħbar tajba hija li OpenCV jista 'jinbena bħala librerija statika barra mill-kaxxa, li tagħmel il-porting aktar faċli. Niġbru librerija b'konfigurazzjoni standard u naraw kemm jieħdu spazju. Kull modulu jinġabar f'librerija separata.

> size lib/*so --totals
   text    data     bss     dec     hex filename
1945822   15431     960 1962213  1df0e5 lib/libopencv_calib3d.so
17081885     170312   25640 17277837    107a38d lib/libopencv_core.so
10928229     137640   20192 11086061     a928ed lib/libopencv_dnn.so
 842311   25680    1968  869959   d4647 lib/libopencv_features2d.so
 423660    8552     184  432396   6990c lib/libopencv_flann.so
8034733   54872    1416 8091021  7b758d lib/libopencv_gapi.so
  90741    3452     304   94497   17121 lib/libopencv_highgui.so
6338414   53152     968 6392534  618ad6 lib/libopencv_imgcodecs.so
21323564     155912  652056 22131532    151b34c lib/libopencv_imgproc.so
 724323   12176     376  736875   b3e6b lib/libopencv_ml.so
 429036    6864     464  436364   6a88c lib/libopencv_objdetect.so
6866973   50176    1064 6918213  699045 lib/libopencv_photo.so
 698531   13640     160  712331   ade8b lib/libopencv_stitching.so
 466295    6688     168  473151   7383f lib/libopencv_video.so
 315858    6972   11576  334406   51a46 lib/libopencv_videoio.so
76510375     721519  717496 77949390    4a569ce (TOTALS)

Kif tistgħu taraw mill-aħħar linja, .bss u .data ma jieħdux ħafna spazju, iżda l-kodiċi huwa aktar minn 70 MiB. Huwa ċar li jekk dan ikun marbut b'mod statiku ma' applikazzjoni speċifika, il-kodiċi se jsir inqas.

Ejja nippruvaw tarmi kemm jista' jkun moduli sabiex jiġi mmuntat eżempju minimu (li, pereżempju, sempliċement joħroġ il-verżjoni OpenCV), għalhekk inħarsu cmake .. -LA u itfi fl-għażliet dak kollu li jintefa.

        -DBUILD_opencv_java_bindings_generator=OFF 
        -DBUILD_opencv_stitching=OFF 
        -DWITH_PROTOBUF=OFF 
        -DWITH_PTHREADS_PF=OFF 
        -DWITH_QUIRC=OFF 
        -DWITH_TIFF=OFF 
        -DWITH_V4L=OFF 
        -DWITH_VTK=OFF 
        -DWITH_WEBP=OFF 
        <...>

> size lib/libopencv_core.a --totals
   text    data     bss     dec     hex filename
3317069   36425   17987 3371481  3371d9 (TOTALS)

Min-naħa waħda, dan huwa modulu wieħed biss tal-librerija, min-naħa l-oħra, dan huwa mingħajr ottimizzazzjoni tal-kompilatur għad-daqs tal-kodiċi (-Os). ~ 3 MiB ta 'kodiċi għadu pjuttost ħafna, iżda diġà jagħti tama għas-suċċess.

Mexxi fl-emulator

Huwa ħafna aktar faċli biex tiddibaggja fuq l-emulator, għalhekk l-ewwel kun żgur li l-librerija taħdem fuq qemu. Bħala pjattaforma emulata, għażilt Integrator / CP, għaliex l-ewwelnett, huwa wkoll ARM, u t-tieni, Embox jappoġġja l-output tal-grafika għal din il-pjattaforma.

Embox għandu mekkaniżmu għall-bini ta 'libreriji esterni, billi tużah inżidu OpenCV bħala modulu (li jgħaddi l-istess għażliet kollha għall-bini "minimu" fil-forma ta' libreriji statiċi), wara nżid applikazzjoni sempliċi li tidher bħal din:

version.cpp:

#include <stdio.h>
#include <opencv2/core/utility.hpp>

int main() {
    printf("OpenCV: %s", cv::getBuildInformation().c_str());

    return 0;
}

Aħna niġbru s-sistema, imexxuha - niksbu l-output mistenni.

root@embox:/#opencv_version                                                     
OpenCV: 
General configuration for OpenCV 4.0.1 =====================================
  Version control:               bd6927bdf-dirty

  Platform:
    Timestamp:                   2019-06-21T10:02:18Z
    Host:                        Linux 5.1.7-arch1-1-ARCH x86_64
    Target:                      Generic arm-unknown-none
    CMake:                       3.14.5
    CMake generator:             Unix Makefiles
    CMake build tool:            /usr/bin/make
    Configuration:               Debug

  CPU/HW features:
    Baseline:
      requested:                 DETECT
      disabled:                  VFPV3 NEON

  C/C++:
    Built as dynamic libs?:      NO
< Дальше идут прочие параметры сборки -- с какими флагами компилировалось,
  какие модули OpenCV включены в сборку и т.п.>

Il-pass li jmiss huwa li tmexxi xi eżempju, preferibbilment wieħed minn dawk standard offruti mill-iżviluppaturi nfushom. fuq is-sit tiegħek. Jien għażilt ditekter tal-fruntiera canny.

L-eżempju kellu jiġi kemmxejn miktub mill-ġdid biex juri l-immaġni bir-riżultat direttament fil-frejm buffer. Kelli nagħmel dan, għax. funzjoni imshow() jista 'jiġbed immaġini permezz tal-interfaces QT, GTK u Windows, li, ovvjament, żgur mhux se jkunu fil-konfigurazzjoni għal STM32. Fil-fatt, QT jista' jitħaddem ukoll fuq STM32F7Discovery, iżda dan se jiġi diskuss f'artiklu ieħor 🙂

Wara kjarifika qasira f'liema format huwa maħżun ir-riżultat tad-ditekter tat-tarf, aħna nġibu immaġni.

OpenCV fuq STM32F7-Discovery

stampa oriġinali

OpenCV fuq STM32F7-Discovery

Riżultat

Tħaddim fuq STM32F7Discovery

Fuq 32F746GDISCOVERY hemm diversi sezzjonijiet tal-memorja tal-ħardwer li nistgħu nużaw b'xi mod jew ieħor

  1. 320KiB RAM
  2. 1MiB flash għall-immaġni
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot tal-karta microSD

Kard SD tista 'tintuża biex taħżen immaġini, iżda fil-kuntest tat-tmexxija ta' eżempju minimu, dan mhux utli ħafna.
Il-wiri għandu riżoluzzjoni ta '480 × 272, li jfisser li l-memorja framebuffer se tkun 522 bytes f'fond ta' 240 bit, i.e. dan huwa aktar mid-daqs ta 'RAM, għalhekk il-framebuffer u l-borġ (li se jkunu meħtieġa, inkluż għal OpenCV, biex jaħżnu dejta għal immaġini u strutturi awżiljarji) se jkunu jinsabu f'SDRAM, kull ħaġa oħra (memorja għal munzelli u ħtiġijiet oħra tas-sistema ) se jmorru għal RAM .

Jekk nieħdu l-konfigurazzjoni minima għal STM32F7Discovery (armi n-netwerk kollu, il-kmandi kollha, nagħmlu munzelli żgħar kemm jista 'jkun, eċċ.) u żid OpenCV b'eżempji hemmhekk, il-memorja meħtieġa tkun kif ġej:

   text    data     bss     dec     hex filename
2876890  459208  312736 3648834  37ad42 build/base/bin/embox

Għal dawk li ma tantx huma familjari ma’ liema sezzjonijiet imorru fejn, se nispjega: in .text и .rodata istruzzjonijiet u kostanti (bejn wieħed u ieħor, data readonly) jinsabu fihom .data id-data hija mutevoli, .bss hemm varjabbli "nullati", li, madankollu, jeħtieġu post (din it-taqsima "jmur" għar-RAM).

L-aħbar tajba hija li .data/.bss għandu joqgħod, iżda ma .text l-inkwiet huwa li hemm biss 1MiB ta 'memorja għall-immaġni. Jista 'jintrema' l barra .text l-istampa mill-eżempju u aqraha, pereżempju, mill-karta SD fil-memorja fl-istartjar, iżda fruits.png jiżen madwar 330KiB, għalhekk dan mhux se jsolvi l-problema: l-aktar .text tikkonsisti mill-kodiċi OpenCV.

B'mod ġenerali, fadal biss ħaġa waħda - it-tagħbija ta 'parti mill-kodiċi fuq flash QSPI (għandha mod speċjali ta' operazzjoni għall-immappjar tal-memorja max-xarabank tas-sistema, sabiex il-proċessur ikun jista 'jaċċessa din id-dejta direttament). F'dan il-każ, tqum problema: l-ewwelnett, il-memorja ta 'flash drive QSPI mhix disponibbli immedjatament wara li l-apparat jerġa' jinbeda (jeħtieġ li tinizjalizza separatament il-modalità mappjata bil-memorja), u t-tieni, ma tistax "flash" din il-memorja b' bootloader familjari.

Bħala riżultat, ġie deċiż li torbot il-kodiċi kollu f'QSPI, u jteptgħa b'loader miktub minnu nnifsu li jirċievi l-binarju meħtieġ permezz ta 'TFTP.

Riżultat

L-idea li din il-librerija tiġi portjata għall-Embox dehret madwar sena ilu, iżda għal darb'oħra ġiet posposta minħabba diversi raġunijiet. Waħda minnhom hija l-appoġġ għal libstdc++ u l-librerija tal-mudelli standard. Il-problema tal-appoġġ C++ f'Embox hija lil hinn mill-ambitu ta 'dan l-artikolu, għalhekk hawn ngħid biss li rnexxielna niksbu dan l-appoġġ fl-ammont it-tajjeb biex din il-librerija taħdem 🙂

Fl-aħħar, dawn il-problemi ġew megħluba (mill-inqas biżżejjed biex l-eżempju OpenCV jaħdem), u l-eżempju dam. Huwa jieħu 40 sekonda twila biex il-bord ifittex il-konfini bl-użu tal-filtru Canny. Dan, ovvjament, huwa twil wisq (hemm kunsiderazzjonijiet dwar kif tiġi ottimizzata din il-kwistjoni, ikun possibbli li tikteb artiklu separat dwar dan f'każ ta 'suċċess).

OpenCV fuq STM32F7-Discovery

Madankollu, l-għan intermedju kien li jinħoloq prototip li se juri l-possibbiltà fundamentali li titħaddem OpenCV fuq STM32, rispettivament, dan l-għan intlaħaq, hooray!

tl;dr: struzzjonijiet pass pass

0: Niżżel is-sorsi tal-Embox, bħal dan:

    git clone https://github.com/embox/embox && cd ./embox

1: Nibdew billi nimmuntaw bootloader li se "flash" flash drive QSPI.

    make confload-arm/stm32f7cube

Issa għandek bżonn tikkonfigura n-netwerk, għaliex. Aħna se ntellgħu l-immaġni permezz ta 'TFTP. Biex tissettja l-indirizzi IP tal-bord u tal-host, trid teditja l-conf/rootfs/network.

Eżempju ta' konfigurazzjoni:

iface eth0 inet static
    address 192.168.2.2
    netmask 255.255.255.0
    gateway 192.168.2.1
    hwaddress aa:bb:cc:dd:ee:02

gateway - indirizz tal-host minn fejn l-immaġni se titgħabba, address - indirizz tal-bord.

Wara dan, niġbru l-bootloader:

    make

2: It-tagħbija tas-soltu tal-bootloader (jiddispjaċina għall-pun) fuq il-bord - m'hemm xejn speċifiku hawn, għandek bżonn tagħmel dan bħal għal kwalunkwe applikazzjoni oħra għal STM32F7Discovery. Jekk ma tafx kif tagħmel dan, tista 'taqra dwarha hawn.
3: Kumpilazzjoni ta 'immaġni b'konfigurazzjoni għal OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Estratt mit-taqsimiet ELF li għandu jinkiteb lil QSPI għal qspi.bin

    arm-none-eabi-objcopy -O binary build/base/bin/embox build/base/bin/qspi.bin 
        --only-section=.text --only-section=.rodata 
        --only-section='.ARM.ex*' 
        --only-section=.data

Hemm skript fid-direttorju tal-konf li jagħmel dan, sabiex tkun tista' tmexxiha

    ./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin

5: Billi tuża tftp, niżżel qspi.bin.bin fuq flash drive QSPI. Fuq il-host, biex tagħmel dan, ikkupja qspi.bin fil-folder tal-għeruq tas-server tftp (ġeneralment /srv/tftp/ jew /var/lib/tftpboot/; pakketti għas-server korrispondenti huma disponibbli fil-biċċa l-kbira tad-distribuzzjonijiet popolari, normalment imsejħa tftpd jew tftp-hpa, xi kultant ikollok tagħmel systemctl start tftpd.service tibda).

    # вариант для tftpd
    sudo cp build/base/bin/qspi.bin /srv/tftp
    # вариант для tftp-hpa
    sudo cp build/base/bin/qspi.bin /var/lib/tftpboot

Fuq Embox (jiġifieri fil-bootloader), trid tesegwixxi l-kmand li ġej (nassumu li s-server għandu l-indirizz 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Bil-kmand goto għandek bżonn "taqbeż" fil-memorja QSPI. Il-post speċifiku jvarja skond kif l-immaġni hija marbuta, tista 'tara dan l-indirizz mal-kmand mem 0x90000000 (l-indirizz tal-bidu jidħol fit-tieni kelma ta' 32 bit tal-immaġni); ser ikollok bżonn ukoll li jimmarka l-munzell -s, l-indirizz tal-munzell huwa f'0x90000000, eżempju:

    embox>mem 0x90000000
    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275
                      ↑           ↑
              это адрес    это  адрес 
                стэка        первой
                           инструкции

    embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы

    < Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >

7: Tnedija

    embox> edges 20

u gawdi t-tfittxija tal-fruntiera ta' 40 sekonda 🙂

Jekk xi ħaġa tmur ħażin - ikteb kwistjoni fi repożitorju tagħna, jew mal-lista tal-posta [protett bl-email], jew f'kumment hawn.

Sors: www.habr.com

Żid kumment