OpenCV sou STM32F7-Discovery

OpenCV sou STM32F7-Discovery Mwen se youn nan devlopè sistèm operasyon an Embox, ak nan atik sa a mwen pral pale sou ki jan mwen jere yo kouri OpenCV sou tablo a STM32746G.

Si ou tape yon bagay tankou "OpenCV sou tablo STM32" nan yon motè rechèch, ou ka jwenn anpil moun ki enterese nan sèvi ak bibliyotèk sa a sou tablo STM32 oswa lòt mikrokontwolè.
Gen plizyè videyo ki, jije pa non an, ta dwe demontre sa ki nesesè, men anjeneral (nan tout videyo yo ke mwen te wè) sou tablo a STM32, se sèlman imaj la te resevwa nan men kamera a ak rezilta a te parèt sou ekran an, ak pwosesis imaj la tèt li te fè swa sou yon òdinatè regilye, oswa sou tablo ki pi pwisan (pa egzanp, Franbwaz Pi).

Poukisa li difisil?

Popilarite rechèch rechèch yo eksplike pa lefèt ke OpenCV se bibliyotèk vizyon òdinatè ki pi popilè, ki vle di ke plis devlopè yo abitye ak li, ak kapasite nan kouri kòd Desktop-pare sou yon mikrokontroleur anpil senplifye pwosesis devlopman an. Men, poukisa toujou pa gen resèt popilè pare pou rezoud pwoblèm sa a?

Pwoblèm nan lè l sèvi avèk OpenCV sou ti chal gen rapò ak de karakteristik:

  • Si ou konpile bibliyotèk la menm ak yon seri minim modil, li tou senpleman pa pral anfòm nan memwa flash nan menm STM32F7Discovery (menm san yo pa pran an kont eksplwatasyon an) akòz yon kòd trè gwo (plizyè megabyte nan enstriksyon)
  • Bibliyotèk la li menm ekri nan C++, ki vle di
    • Bezwen sipò pou yon tan pozitif (eksepsyon, elatriye)
    • Ti sipò pou LibC/Posix, ki anjeneral yo jwenn nan OS pou sistèm entegre - ou bezwen yon bibliyotèk estanda plis ak yon bibliyotèk modèl STL estanda (vektè, elatriye)

Pòt nan Embbox

Kòm dabitid, anvan ou pote nenpòt pwogram nan sistèm operasyon an, li se yon bon lide pou eseye bati li nan fòm nan ki devlopè yo te gen entansyon li. Nan ka nou an, pa gen okenn pwoblèm ak sa a - ou ka jwenn kòd sous la sou github, bibliyotèk la bati anba GNU/Linux ak cmake abityèl la.

Bon nouvèl la se ke OpenCV ka bati kòm yon bibliyotèk estatik soti nan bwat la, ki fè pòtaj pi fasil. Nou kolekte yon bibliyotèk ak yon konfigirasyon estanda epi wè konbyen espas yo pran. Chak modil kolekte nan yon bibliyotèk separe.

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

Kòm ou ka wè nan dènye liy lan, .bss ak .data pa pran anpil espas, men kòd la se plis pase 70 MiB. Li klè ke si sa a se statikman lye nan yon aplikasyon espesifik, kòd la ap vin pi piti.

Ann eseye jete anpil modil ke posib pou yon egzanp minim reyini (ki, pou egzanp, pral tou senpleman soti vèsyon an OpenCV), kidonk nou gade. cmake .. -LA epi fèmen nan opsyon yo tout bagay ki etenn.

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

Sou yon bò, sa a se sèlman yon modil nan bibliyotèk la, nan lòt men an, sa a se san yo pa optimize du pou gwosè kòd (-Os). ~3 MiB nan kòd se toujou byen anpil, men deja bay espwa pou siksè.

Kouri nan Emulation la

Li pi fasil pou debogaj sou Emulation a, kidonk premye asire w ke bibliyotèk la ap travay sou qemu. Kòm yon platfòm imite, mwen te chwazi Integrator / CP, paske premyèman, li se tou ARM, ak dezyèmman, Embbox sipòte pwodiksyon grafik pou platfòm sa a.

Embox gen yon mekanis pou bati bibliyotèk ekstèn, lè l sèvi avèk li nou ajoute OpenCV kòm yon modil (pase tout opsyon yo menm pou bati "minimòm" nan fòm nan bibliyotèk estatik), apre sa mwen ajoute yon aplikasyon senp ki sanble sa a:

version.cpp:

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

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

    return 0;
}

Nou rasanble sistèm nan, kouri li - nou jwenn pwodiksyon an espere.

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

Pwochen etap la se kouri kèk egzanp, de preferans youn nan estanda yo ofri pa devlopè yo tèt yo. sou sit ou a. Mwen chwazi detektè fwontyè canny.

Egzanp la te dwe yon ti kras reekri pou montre imaj la ak rezilta a dirèkteman nan tanpon ankadreman an. Mwen te oblije fè sa, paske. fonksyon imshow() ka trase imaj atravè entèfas QT, GTK ak Windows, ki, nan kou, definitivman pa pral nan konfigirasyon an pou STM32. An reyalite, QT ka kouri tou sou STM32F7Discovery, men sa a pral diskite nan yon lòt atik 🙂

Apre yon klarifikasyon kout nan ki fòma rezilta detektè kwen an estoke, nou jwenn yon imaj.

OpenCV sou STM32F7-Discovery

foto orijinal la

OpenCV sou STM32F7-Discovery

Rezilta

Kouri sou STM32F7Discovery

Sou 32F746GDISCOVERY gen plizyè seksyon memwa pyès ki nan konpitè ke nou ka itilize yon fason oswa yon lòt

  1. 320 KiB RAM
  2. 1MiB flash pou imaj
  3. 8 MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. emplacement kat microSD

Yon kat SD ka itilize nan magazen imaj, men nan yon kontèks kouri yon egzanp minim, sa a pa trè itil.
Ekspozisyon an gen yon rezolisyon 480 × 272, ki vle di ke memwa framebuffer la pral 522 bytes nan yon pwofondè 240 bits, i.e. sa a se pi plis pase gwosè a nan RAM, kidonk framebuffer la ak pil wòch la (ki pral oblije, ki gen ladan pou OpenCV, nan magazen done pou imaj ak estrikti oksilyè) yo pral lokalize nan SDRAM, tout lòt bagay (memwa pou pil ak lòt bezwen sistèm). ) pral ale nan RAM .

Si nou pran konfigirasyon minimòm lan pou STM32F7Discovery (jete tout rezo a, tout kòmandman yo, fè pil pi piti ke posib, elatriye) epi ajoute OpenCV ak egzanp la, memwa ki nesesè yo pral jan sa a:

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

Pou moun ki pa trè abitye ak ki seksyon ale kote, mwen pral eksplike: nan .text и .rodata enstriksyon ak konstan (apeprè pale, done lekti sèlman) kouche nan .data done yo chanje, .bss gen "anile" varyab, ki, poutan, bezwen yon plas (seksyon sa a pral "ale" nan RAM).

Bon nouvèl la se sa .data/.bss ta dwe anfòm, men ak .text pwoblèm nan se ke gen sèlman 1MiB nan memwa pou imaj la. Èske yo ka jete deyò .text foto a nan egzanp lan epi li li, pou egzanp, soti nan kat SD la nan memwa nan demaraj, men fruits.png peze sou 330KiB, kidonk sa a pa pral rezoud pwoblèm nan: pi fò. .text konsiste de kòd OpenCV.

An jeneral, gen yon sèl bagay ki rete - chaje yon pati nan kòd la sou yon flash QSPI (li gen yon mòd operasyon espesyal pou kat memwa nan bis sistèm lan, pou ke processeur a ka jwenn aksè nan done sa yo dirèkteman). Nan ka sa a, yon pwoblèm rive: premyèman, memwa a nan yon kondwi flash QSPI pa disponib imedyatman apre aparèy la rdemare (ou bezwen separeman inisyalize mòd nan memwa-map), epi dezyèmman, ou pa ka "flash" memwa sa a ak yon bootloader abitye.

Kòm yon rezilta, li te deside konekte tout kòd la nan QSPI, ak flash li ak yon loader pwòp tèt ou-ekri ki pral resevwa binè ki nesesè yo atravè TFTP.

Rezilta

Lide pou pòtab bibliyotèk sa a nan Embox te parèt anviwon yon ane de sa, men li te ranvwaye ankò pou plizyè rezon. Youn nan yo se sipò pou libstdc++ ak bibliyotèk modèl estanda a. Pwoblèm sipò C++ nan Embbox depase limit atik sa a, kidonk isit la mwen pral sèlman di ke nou te rive jwenn sipò sa a nan bon kantite lajan pou bibliyotèk sa a travay 🙂

Nan fen a, pwoblèm sa yo te simonte (omwen ase pou egzanp OpenCV la travay), ak egzanp lan kouri. Li pran 40 segonn long pou tablo a chèche limit lè l sèvi avèk filtè Canny la. Sa a, nan kou, se twò lontan (gen konsiderasyon sou kòman yo optimize pwoblèm sa a, li pral posib yo ekri yon atik separe sou sa a nan ka ta gen siksè).

OpenCV sou STM32F7-Discovery

Sepandan, objektif entèmedyè a se te kreye yon pwototip ki pral montre posiblite fondamantal nan kouri OpenCV sou STM32, respektivman, objektif sa a te reyalize, hoora!

tl; dr: etap pa etap enstriksyon yo

0: Telechaje sous Embbox, tankou sa a:

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

1: Ann kòmanse pa rasanble yon bootloader ki pral "flash" yon kondwi flash QSPI.

    make confload-arm/stm32f7cube

Koulye a, ou bezwen configured rezo a, paske. Nou pral telechaje imaj la atravè TFTP. Pou mete tablo a ak adrès IP lame, ou bezwen edite konf/rootfs/rezo a.

Egzanp konfigirasyon:

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 - adrès lame kote imaj la pral chaje, address - adrès tablo a.

Apre sa, nou kolekte bootloader la:

    make

2: abityèl chaje bootloader a (rekize pou Pun la) sou tablo a - pa gen anyen espesifik isit la, ou bezwen fè li tankou pou nenpòt lòt aplikasyon pou STM32F7Discovery. Si ou pa konnen ki jan fè li, ou ka li sou li isit la.
3: Konpile yon imaj ak yon konfigirasyon pou OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Ekstrè nan seksyon ELF yo dwe ekri nan QSPI nan 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

Gen yon script nan anyè a konf ki fè sa, kidonk, ou ka kouri li

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

5: Sèvi ak tftp, telechaje qspi.bin.bin nan yon kondwi flash QSPI. Sou lame a, pou w fè sa, kopye qspi.bin nan katab rasin sèvè tftp la (anjeneral /srv/tftp/ oswa /var/lib/tftpboot/; pakè pou sèvè korespondan an disponib nan distribisyon ki pi popilè yo, anjeneral yo rele. tftpd oswa tftp-hpa, pafwa ou dwe fè systemctl start tftpd.service Komanse).

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

Sou Embbox (sa vle di nan bootloader la), ou bezwen egzekite lòd sa a (nou sipoze ke sèvè a gen adrès 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Avèk lòd goto ou bezwen "sote" nan memwa QSPI. Kote espesifik la pral varye selon ki jan imaj la lye, ou ka wè adrès sa a ak lòd la mem 0x90000000 (adrès kòmansman an adapte nan dezyèm mo 32-bit nan imaj la); w ap bezwen tou drapo pil la -s, adrès pil la se nan 0x90000000, egzanp:

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

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

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

7: Lanse

    embox> edges 20

epi jwi rechèch fwontyè 40 segonn 🙂

Si yon bagay ale mal - ekri yon pwoblèm nan depo nou an, oswa nan lis adrès la [imèl pwoteje], oswa nan yon kòmantè isit la.

Sous: www.habr.com

Add nouvo kòmantè