OpenCV ile STM32F7-Discovery

OpenCV ile STM32F7-Discovery O aʻu o se tasi o atinaʻe o le faiga faʻaogaina Embox, ma i lenei tusiga o le a ou talanoa e uiga i le auala na ou faʻatautaia ai OpenCV i luga o le STM32746G laupapa.

Afai e te taina se mea e pei o le "OpenCV on STM32 board" i totonu o se masini suʻesuʻe, e mafai ona e mauaina ni nai tagata e fiafia e faʻaoga lenei faletusi i luga o laupapa STM32 poʻo isi microcontrollers.
E tele vitio e, faʻamasino i le igoa, e tatau ona faʻaalia le mea e manaʻomia, ae masani lava (i vitio uma na ou vaʻaia) i luga o le laupapa STM32, naʻo le ata na maua mai le mea pueata ma faʻaalia le iʻuga i luga o le lau, ma o le faagasologa o ata lava ia na faia i luga o se komepiuta masani, poʻo luga o laupapa sili atu ona malosi (mo se faʻataʻitaʻiga, Raspberry Pi).

Aisea e faigata ai?

O le taʻutaʻua o suʻesuʻega o loʻo faʻamatalaina e le mea moni o OpenCV o le faletusi vaʻai komepiuta sili ona lauiloa, o lona uiga o le tele o atinaʻe e masani i ai, ma o le mafai ona faʻatautaia le komipiuta-ready code i luga o le microcontroller e faʻafaigofie tele le faʻagasologa o le atinaʻe. Ae aisea e le o iai lava ni fua masani ua saunia mo le foia o lenei faafitauli?

O le faʻafitauli o le faʻaaogaina o OpenCV i luga o laʻau laiti e fesoʻotaʻi ma ni vaega se lua:

  • Afai e te tuʻufaʻatasia le faletusi e tusa lava pe itiiti se seti o modules, o le a le fetaui i le flash memory o le STM32F7Discovery tutusa (e tusa lava pe aunoa ma le amanaia o le OS) ona o se numera tele (tele megabytes o faatonuga)
  • O le faletusi lava ia e tusia i le C++, o lona uiga
    • Manaomia le lagolago mo le lelei o le ta'avale (tuunoa, ma isi)
    • Laiti lagolago mo LibC/Posix, lea e masani ona maua i le OS mo faiga fa'apipi'i - e te mana'omia se faletusi fa'aopoopo fa'atasi ma se faletusi fa'ata'ita'i STL (vector, etc.)

Tu'u atu ile Embox

E pei ona masani ai, aʻo leʻi tuʻuina atu soʻo se polokalame i le faiga faʻaogaina, o se manatu lelei le taumafai e fausia i le tulaga na faʻamoemoeina e le au atinaʻe. I la matou tulaga, e leai ni faʻafitauli i lenei mea - o le source code e mafai ona maua i luga github, ua fausia le faletusi i lalo o le GNU/Linux ma le cmake masani.

O le tala fiafia o le OpenCV e mafai ona fausia e avea o se faletusi faʻamau i fafo o le atigipusa, lea e faigofie ai le faʻaogaina. Matou te aoina se faletusi o loʻo iai se faʻaoga masani ma vaʻai pe fia le avanoa latou te faʻaogaina. O vaega taitasi e aoina i se faletusi eseese.

> 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)

E pei ona mafai ona e vaʻaia mai le laina mulimuli, .bss ma .data e le tele avanoa, ae o le code e sili atu i le 70 MiB. E manino lava afai e fesoʻotaʻi faʻatasi lenei mea i se talosaga faʻapitoa, o le a faʻaitiitia le code.

Sei o tatou taumafai e lafo i fafo le tele o modules pe a mafai ina ia faʻapotopotoina se faʻataʻitaʻiga laʻititi (lea, mo se faʻataʻitaʻiga, o le a faʻaalia ai le OpenCV version), o lea matou te vaʻai ai. cmake .. -LA ma tape i filifiliga mea uma e tape.

        -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)

I le tasi itu, e naʻo le tasi le module o le faletusi, i le isi itu, e aunoa ma le faʻapipiʻiina o le faʻapipiʻiina mo le tele o le numera (-Os). ~ 3 MiB o le code e fai lava si tele, ae ua uma ona maua le faʻamoemoe mo le manuia.

Tamomoe i le emulator

E sili atu ona faigofie le debug i luga o le emulator, ia muamua ia mautinoa o loʻo galue le faletusi i le qemu. I le avea ai o se faʻataʻitaʻiga faʻataʻitaʻiga, na ou filifilia le Integrator / CP, aua muamua, o le ARM foʻi, ma lona lua, Embox lagolago faʻataʻitaʻiga gaioiga mo lenei tulaga.

Embox o loʻo i ai se masini mo le fausiaina o faletusi i fafo, faʻaaogaina matou te faʻaopoopoina OpenCV o se module (tuʻuina uma filifiliga tutusa mo le "laʻititi" fausia i le tulaga o faletusi static), a maeʻa ona ou faʻaopoopoina se talosaga faigofie e pei o lenei:

version.cpp:

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

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

    return 0;
}

Matou te faʻapipiʻiina le faiga, faʻatautaia - matou te maua le gaioiga faʻamoemoeina.

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 включены в сборку и т.п.>

O le isi laasaga o le faʻataʻitaʻiina lea o se faʻataʻitaʻiga, sili atu se tasi o tulaga masani na ofoina mai e le au atinaʻe lava latou. i luga o lau saite. Sa ou filifilia mea e iloa ai tuaoi.

O le faʻataʻitaʻiga e tatau ona toe tusia teisi e faʻaalia ai le ata ma le taunuuga saʻo i totonu o le faʻavaa paʻu. Sa tatau ona ou faia lenei mea, aua. galuega faatino imshow() e mafai ona tusi ata e ala i le QT, GTK ma fesoʻotaʻiga Windows, lea, ioe, o le a mautinoa lava e le o iai i totonu o le config mo STM32. O le mea moni, QT e mafai foi ona taʻavale i luga ole STM32F7Discovery, ae o le a talanoaina i se isi tusiga 🙂

A maeʻa se faʻamalamalamaga puʻupuʻu pe o le a le faʻatulagaina o le faʻaiʻuga o le mataʻitusi o loʻo teuina, matou te maua se ata.

OpenCV ile STM32F7-Discovery

ata muamua

OpenCV ile STM32F7-Discovery

iʻuga

Tamomoe ile STM32F7Discovery

I luga ole 32F746GDISCOVERY e tele vaega o mea e manatua ai meafaigaluega e mafai ona tatou faʻaogaina i se tasi auala poʻo se isi.

  1. 320KiB RAM
  2. 1MiB moli mo ata
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot card microSD

E mafai ona faʻaogaina se kata SD e teu ai ata, ae i le tulaga o le faʻatinoina o se faʻataʻitaʻiga itiiti, e le aoga tele.
O le faʻaaliga o loʻo i ai se iugafono o le 480 × 272, o lona uiga o le framebuffer memory o le a 522 bytes i le loloto o le 240 bits, i.e. e sili atu nai lo le tele o le RAM, o lea o le framebuffer ma le faaputuga (lea o le a manaʻomia, e aofia ai mo OpenCV, e teu ai faʻamatalaga mo ata ma fausaga fesoasoani) o le a tuʻuina i le SDRAM, o isi mea uma (manatua mo faʻaputu ma isi mea manaʻomia. ) o le a alu i le RAM.

Afai tatou te ave le laʻititi laʻititi mo STM32F7Discovery (lafo i fafo le fesoʻotaʻiga atoa, faʻatonuga uma, faʻapipiʻi faʻapipiʻi laʻititi pe a mafai, ma isi) ma faʻaopoopo OpenCV faʻatasi ma faʻataʻitaʻiga iina, o le manaʻoga manaʻomia o le a faʻapea:

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

Mo i latou e le masani i vaega e alu i ai, o le a ou faʻamatalaina: i .text и .rodata o fa'atonuga ma fa'atonuga (pe'ā tautala, na'o fa'amatalaga faitau) o lo'o taoto i totonu .data o faʻamatalaga e suia, .bss o loʻo i ai "nulled" fesuiaiga, lea, e ui i lea, e manaʻomia se nofoaga (o lenei vaega o le a "alu" i le RAM).

O le tala fiafia lena .data/.bss e tatau ona fetaui, ae ma .text o le faʻalavelave e naʻo le 1MiB o le manatua mo le ata. E mafai ona lafo i fafo .text le ata mai le faʻataʻitaʻiga ma faitau i ai, mo se faʻataʻitaʻiga, mai le SD card i le mafaufau i le amataga, ae o fruits.png e tusa ma le 330KiB, o lea e le foia ai le faafitauli: tele .text e aofia ai le OpenCV code.

I le lautele, e na o le tasi lava le mea o totoe - o le utaina o se vaega o le code i luga o le QSPI flash (o loʻo i ai se faiga faʻapitoa mo le faʻatulagaina o manatuaga i le pasi, ina ia mafai e le processor ona maua saʻo lenei faʻamatalaga). I lenei tulaga, e tulaʻi mai se faʻafitauli: muamua, o le manatua o le QSPI flash drive e le o maua i le taimi lava e toe faʻafouina ai le masini (e te manaʻomia le vavae ese o le faʻasologa o mafaufauga), ma lona lua, e le mafai ona e "momi" lenei manatua ma se bootloader masani.

O le iʻuga, na filifili e faʻafesoʻotaʻi uma le code i le QSPI, ma faʻapipiʻi i se bootloader tusia e le tagata lava ia o le a maua le binary manaʻomia e ala i le TFTP.

iʻuga

O le manatu e momoli lenei faletusi i Embox na aliali mai pe a ma le tausaga talu ai, ae na toe tolopoina ona o mafuaaga eseese. O se tasi oi latou o le lagolago mo libstdc ++ ma le faletusi faʻataʻitaʻi masani. O le faʻafitauli o le C ++ lagolago i Embox e sili atu i le lautele o lenei tusiga, o lea o le a naʻo loʻu fai atu na mafai ona matou ausia lenei lagolago i le aofaʻi saʻo mo lenei faletusi e galue ai 🙂

I le faaiuga, o nei faʻafitauli na faʻatoʻilaloina (a itiiti ifo e lava mo le OpenCV faʻataʻitaʻiga e galue), ma o le faʻataʻitaʻiga na tamoe. E manaʻomia le 40 sekone umi mo le laupapa e suʻe ai tuaoi e faʻaaoga ai le Canny filter. O lenei, ioe, e umi tele (o loʻo i ai iloiloga i le auala e faʻamalieina ai lenei mataupu, o le a mafai ona tusia se isi tala e uiga i lenei mea pe a manuia).

OpenCV ile STM32F7-Discovery

Ae ui i lea, o le sini autu o le fatuina lea o se faʻataʻitaʻiga o le a faʻaalia ai le avanoa taua e faʻatautaia ai OpenCV i luga ole STM32, i le faasologa, na ausia lenei sini, hooray!

tl;dr: laasaga ma lea laasaga faatonuga

0: La'u mai ai punaoa Embox, pei o lenei:

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

1: Tatou amata i le faʻapipiʻiina o se bootloader o le a "momi" se QSPI flash drive.

    make confload-arm/stm32f7cube

Ole taimi nei e tatau ona e faʻatulagaina le fesoʻotaʻiga, aua. O le a matou lafoina le ata e ala i le TFTP. Ina ia seti le laupapa ma faʻafeiloaʻi tuatusi IP, e tatau ona e faʻasaʻo le conf/rootfs/network.

Fa'ata'ita'iga fa'atusa:

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 - tuatusi talimalo mai le mea o le a utaina ai le ata, address - tuatusi o le laupapa.

A maeʻa lena, matou te aoina le bootloader:

    make

2: O le faʻapipiʻiina masani o le bootloader (faʻanoanoa mo le pun) i luga o le laupapa - e leai se mea faʻapitoa iinei, e tatau ona e faia e pei o soʻo se isi talosaga mo STM32F7Discovery. Afai e te le iloa pe faapefea ona fai, e mafai ona e faitau i ai iinei.
3: Faʻapipiʻiina o se ata ma se faʻaoga mo OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Aveese mai vaega ELF e tusi i le QSPI i le 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

O loʻo i ai se faʻamatalaga i le conf directory e faia lenei mea, ina ia mafai ona e taʻavale

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

5: Fa'aaogā le tftp, la'u mai le qspi.bin.bin ile QSPI flash drive. I luga o le talimalo, e fai lenei mea, kopi le qspi.bin i le pusa aʻa o le tftp server (e masani lava / srv / tftp / poʻo / var / lib / tftpboot /; afifi mo le server fetaui e maua i le tele o tufatufa lauiloa, e masani ona taʻua tftpd poʻo tftp-hpa, o nisi taimi e tatau ona e faia systemctl start tftpd.service e amata).

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

I luga o le Embox (e pei o le bootloader), e te manaʻomia le faʻatinoina o le poloaiga lenei (matou te manatu o le server o loʻo i ai le tuatusi 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Faatasi ai ma le poloaiga goto e tatau ona e "oso" i le QSPI manatua. O le nofoaga patino o le a eseese e faʻatatau i le auala e fesoʻotaʻi ai le ata, e mafai ona e vaʻai i lenei tuatusi ma le poloaiga mem 0x90000000 (o le tuatusi amata e fetaui ma le upu lona lua 32-bit o le ata); e mana'omia fo'i le fu'a o le fa'aputuga -s, o le tuatusi faʻapipiʻi o loʻo i le 0x90000000, faʻataʻitaʻiga:

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

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

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

7: Tatala

    embox> edges 20

ma fiafia i le sailiga tuaoi 40-lua 🙂

Afai ei ai se mea ua faaletonu - tusi se mataupu i totonu la matou fale teu oloa, po o le lisi o meli [imeli puipuia], pe i se faʻamatalaga iinei.

puna: www.habr.com

Faaopoopo i ai se faamatalaga