I-OpenCV ku-STM32F7-Discovery

I-OpenCV ku-STM32F7-Discovery Ngingomunye wonjiniyela besistimu yokusebenza I-embox, futhi kulesi sihloko ngizokhuluma ngokuthi ngakwazi kanjani ukusebenzisa i-OpenCV ebhodini le-STM32746G.

Uma uthayipha okuthi “OpenCV on STM32 board” enjinini yokusesha, ungathola abantu abambalwa abathanda ukusebenzisa le labhulali kumabhodi we-STM32 noma ezinye izilawuli ezincane.
Kunamavidiyo amaningana okufanele, ngokubheka igama, abonise okudingekayo, kodwa ngokuvamile (kuwo wonke amavidiyo engiwabonile) ebhodini le-STM32, isithombe kuphela esatholwa kukhamera futhi umphumela waboniswa esikrinini, futhi ukucutshungulwa kwesithombe ngokwako kwenziwa kukhompyutha evamile, noma kumabhodi anamandla (ngokwesibonelo, i-Raspberry Pi).

Kungani kunzima?

Ukuduma kwemibuzo yosesho kuchazwa ukuthi i-OpenCV ingumtapo wolwazi wekhompyutha odume kakhulu, okusho ukuthi onjiniyela abaningi bajwayelene nayo, kanye nekhono lokusebenzisa ikhodi elungele ideskithophu ku-microcontroller yenza inqubo yokuthuthukiswa ibe lula kakhulu. Kodwa kungani kungakabi bikho izindlela zokupheka ezithandwayo zokuxazulula le nkinga?

Inkinga yokusebenzisa i-OpenCV kumatshali amancane ihlobene nezici ezimbili:

  • Uma uhlanganisa umtapo wolwazi ngisho nesethi encane yamamojula, ngeke nje ingene kumemori ekhanyayo ye-STM32F7Discovery efanayo (ngisho ngaphandle kokucabangela i-OS) ngenxa yekhodi enkulu kakhulu (amamegabhayithi ambalwa wemiyalelo)
  • Umtapo wezincwadi ngokwawo ubhalwe ngo-C++, okusho ukuthi
    • Udinga ukusekelwa ngesikhathi sokusebenza esihle (okuhlukile, njll.)
    • Ukusekelwa okuncane kwe-LibC/Posix, evame ukutholakala ku-OS kumasistimu ashumekiwe - udinga umtapo wolwazi ojwayelekile kanye nomtapo wezincwadi ojwayelekile wesifanekiso se-STL (i-vector, njll.)

Ithuthelwa ku-Embox

Njengenjwayelo, ngaphambi kokuthutha noma yiziphi izinhlelo ohlelweni olusebenzayo, kuwumqondo omuhle ukuzama ukuyakha ngendlela abathuthukisi ababehlosile ngayo. Esimweni sethu, azikho izinkinga ngalokhu - ikhodi yomthombo ingatholakala kuyo github, umtapo wezincwadi wakhiwe ngaphansi kwe-GNU/Linux nge-cmake evamile.

Izindaba ezinhle ukuthi i-OpenCV ingakhiwa njengomtapo wezincwadi ongashintshi ebhokisini, okwenza ukuthuthwa kube lula. Siqoqa ilabhulali enokulungiselelwa okujwayelekile futhi sibone ukuthi zithatha isikhala esingakanani. Imojula ngayinye iqoqwa kumtapo wolwazi ohlukile.

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

Njengoba ubona kulayini wokugcina, .bss kanye .data akuthathi isikhala esiningi, kodwa ikhodi ingaphezu kuka-70 MiB. Kuyacaca ukuthi uma lokhu kuxhunywe ngokwezibalo kuhlelo lokusebenza oluthile, ikhodi izoba ncane.

Ake sizame ukulahla amamojula amaningi ngangokunokwenzeka ukuze kuhlanganiswe isibonelo esincane (okuwukuthi, ngokwesibonelo, sizovele sikhiphe inguqulo ye-OpenCV), ngakho sibheka cmake .. -LA bese uvala kukho konke okucishayo.

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

Ngakolunye uhlangothi, lena yimojula eyodwa kuphela yomtapo wolwazi, ngakolunye uhlangothi, lokhu ngaphandle kokwenza kahle komdidiyeli wosayizi wekhodi (-Os). ~3 MiB yekhodi iseyiningi impela, kodwa isivele isinikeza ithemba lempumelelo.

Gijimani kusilingisi

Kulula kakhulu ukulungisa iphutha kusifanisi, ngakho qala uqiniseke ukuthi umtapo wolwazi usebenza ku-qemu. Njengengxenyekazi efanisiwe, ngikhethe i-Integrator / CP, ngoba okokuqala, iphinde ibe yi-ARM, futhi okwesibili, i-Embox isekela ukuphuma kwezithombe kule nkundla.

I-Embox inomshini wokwakha imitapo yolwazi yangaphandle, siyisebenzisa sengeza i-OpenCV njengemojula (edlula zonke izinketho ezifanayo zokwakhiwa "okuncane" ngesimo semitapo yolwazi emile), ngemuva kwalokho ngingeza uhlelo lokusebenza olulula olubukeka kanjena:

version.cpp:

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

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

    return 0;
}

Sihlanganisa uhlelo, silugijime - sithola umphumela olindelekile.

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

Isinyathelo esilandelayo siwukusebenzisa isibonelo esithile, okungcono esingesinye salezo ezijwayelekile ezinikezwa onjiniyela ngokwabo. esizeni sakho. Ngikhethile i-border detector canny.

Isibonelo kwakudingeka sibhalwe kabusha kancane ukuze kuboniswe isithombe esinomphumela ngokuqondile kubhafa yozimele. Bekufanele ngenze lokhu, ngoba. umsebenzi imshow() ingadweba izithombe ngokusebenzisa i-QT, GTK kanye ne-Windows interface, okuyinto, vele, engeke ibe ku-config ye-STM32. Eqinisweni, i-QT ingaphinda iqhutshwe ku-STM32F7Discovery, kodwa lokhu kuzoxoxwa ngakho kwesinye isihloko 🙂

Ngemuva kokucaciswa okufushane ukuthi umphumela womtshina onqenqemeni ugcinwa ngayiphi ifomethi, sithola isithombe.

I-OpenCV ku-STM32F7-Discovery

isithombe sokuqala

I-OpenCV ku-STM32F7-Discovery

Umphumela

Isebenza ku-STM32F7Discovery

Ku-32F746GDISCOVERY kunezigaba ezimbalwa zememori yehadiwe esingazisebenzisa ngendlela eyodwa noma enye.

  1. 320KiB RAM
  2. I-1MiB flash yesithombe
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. I-slot yekhadi le-microSD

Ikhadi le-SD lingasetshenziswa ukugcina izithombe, kodwa esimweni sokusebenzisa isibonelo esincane, lokhu akusizi kakhulu.
Isibonisi sinesixazululo se-480 × 272, okusho ukuthi inkumbulo ye-framebuffer izoba ngamabhayithi angu-522 ekujuleni kwamabhithi angu-240, i.e. lokhu kungaphezu kosayizi we-RAM, ngakho-ke i-framebuffer nenqwaba (ezodingeka, kuhlanganise ne-OpenCV, ukugcina idatha yezithombe nezakhiwo ezisizayo) izotholakala ku-SDRAM, yonke enye into (inkumbulo yezitaki nezinye izidingo zesistimu. ) izoya ku-RAM .

Uma sithatha ukulungiselelwa okuncane kwe-STM32F7Discovery (sikhiphe yonke inethiwekhi, yonke imiyalo, senze izitaki zibe zincane ngangokunokwenzeka, njll.) bese sengeza i-OpenCV ngezibonelo lapho, inkumbulo edingekayo izoba kanje:

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

Kulabo abangazi kahle ukuthi yiziphi izigaba eziya kuphi, ngizochaza: ku .text и .rodata imiyalo nama-constants (uma sikhuluma nje, idatha efundwayo kuphela) ilele .data idatha iyashintsheka, .bss kukhona okuguquguqukayo "okungenalutho", okuthi, nokho, kudinga indawo (lesi sigaba "sizoya" ku-RAM).

Izindaba ezinhle ukuthi .data/.bss kufanele ilingane, kodwa nge .text Inkinga ukuthi kukhona inkumbulo engu-1MiB kuphela yesithombe. Ingaphonswa ngaphandle .text isithombe esisuka esibonelweni futhi usifunde, isibonelo, ukusuka ekhadini le-SD ukuya enkumbulweni ekuqaleni, kodwa izithelo.png zinesisindo esingama-330KiB, ngakho lokhu ngeke kuyixazulule inkinga: iningi .text iqukethe ikhodi ye-OpenCV.

Ngokuvamile, kunento eyodwa kuphela esele - ukulayisha ingxenye yekhodi ku-flash ye-QSPI (inemodi ekhethekile yokusebenza yememori yemephu ebhasini lohlelo, ukuze iphrosesa ikwazi ukufinyelela le datha ngokuqondile). Kulokhu, kuphakama inkinga: okokuqala, inkumbulo ye-flash drive ye-QSPI ayitholakali ngokushesha ngemuva kokuthi idivayisi iqaliswe kabusha (udinga ukuqalisa ngokwehlukana imodi yemephu yememori), futhi okwesibili, awukwazi "ukukhanyisa" le nkumbulo nge. i-bootloader ejwayelekile.

Ngenxa yalokho, kunqunywe ukuxhumanisa yonke ikhodi ku-QSPI, futhi ikhanyise ngesilayishi esizibhalela sona esizothola kanambambili edingekayo nge-TFTP.

Umphumela

Umbono wokuthumela lo mtapo wezincwadi ku-Embox wavela esikhathini esingangonyaka odlule, kodwa kaningi wahlehliswa ngenxa yezizathu ezihlukahlukene. Enye yazo ukusekelwa kwe-libstdc++ kanye nelabhulali yesifanekiso evamile. Inkinga yokusekelwa kwe-C ++ ku-Embox ingaphezu kobubanzi balesi sihloko, ngakho-ke lapha ngizosho kuphela ukuthi sikwazile ukufeza lokhu kusekelwa ngenani elifanele ukuze lomtapo wolwazi usebenze 🙂

Ekugcineni, lezi zinkinga zanqotshwa (okungenani kwanele ukuthi isibonelo se-OpenCV sisebenze), futhi isibonelo sasebenza. Kuthatha imizuzwana engu-40 ubude ukuze ibhodi liseshe imingcele lisebenzisa isihlungi se-Canny. Lokhu, yebo, yinde kakhulu (kukhona ukucatshangelwa mayelana nendlela yokwandisa lolu daba, uzokwazi ukubhala isihloko esihlukile mayelana nalokhu uma kwenzeka uphumelela).

I-OpenCV ku-STM32F7-Discovery

Kodwa-ke, umgomo omaphakathi bekuwukwakha i-prototype ezokhombisa ukuthi kungenzeka yini ukusebenzisa i-OpenCV ku-STM32, ngokulandelana, le nhloso yafinyelelwa, hooray!

tl; dr: imiyalelo yesinyathelo ngesinyathelo

0: Landa imithombo ye-Embox, kanje:

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

1: Ake siqale ngokuhlanganisa i-bootloader "ezokhanyisa" i-QSPI flash drive.

    make confload-arm/stm32f7cube

Manje udinga ukumisa inethiwekhi, ngoba. Sizolayisha isithombe nge-TFTP. Ukusetha ibhodi namakheli e-IP, udinga ukuhlela i-conf/rootfs/network.

Isibonelo sokumisa:

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 - ikheli lokusingatha lapho isithombe sizolayishwa khona, address - ikheli lebhodi.

Ngemuva kwalokho, siqoqa i-bootloader:

    make

2: Ukulayishwa okujwayelekile kwe-bootloader (ngiyaxolisa nge-pun) ebhodini - akukho lutho oluqondile lapha, udinga ukukwenza njenganoma yiluphi olunye uhlelo lokusebenza lwe-STM32F7Discovery. Uma ungazi ukuthi ukwenze kanjani, ungafunda ngakho lapha.
3: Ukuhlanganisa isithombe nesilungiselelo se-OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Khipha ezigabeni ze-ELF kuzobhalelwa i-QSPI ku-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

Kuneskripthi kumkhombandlela we-conf esenza lokhu, ukuze ukwazi ukusisebenzisa

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

5: Usebenzisa i-tftp, landa i-qspi.bin.bin ku-flash drive ye-QSPI. Kumsingathi, ukwenza lokhu, kopisha qspi.bin kufolda yempande yeseva ye-tftp (imvamisa /srv/tftp/ noma /var/lib/tftpboot/; amaphakheji weseva ehambisanayo ayatholakala ekusabalazweni okuthandwa kakhulu, okuvame ukubizwa ngokuthi. tftpd noma tftp-hpa, ngezinye izikhathi kufanele ukwenze systemctl start tftpd.service ukuqala).

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

Ku-Emboks (okungukuthi ku-bootloader), udinga ukwenza umyalo olandelayo (sicabanga ukuthi iseva inekheli 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Ngomyalo goto udinga "ugxume" kumemori ye-QSPI. Indawo ethile izohluka kuye ngokuthi isithombe sixhunywe kanjani, ungabona leli kheli ngomyalo mem 0x90000000 (ikheli lokuqala lingena egameni lesibili le-32-bit lesithombe); uzodinga futhi ukumaka isitaki -s, ikheli lesitaki liku-0x90000000, isibonelo:

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

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

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

7: Kwethula

    embox> edges 20

futhi ujabulele ukusesha komngcele wamasekhondi angu-40 🙂

Uma kukhona okungahambi kahle - bhala udaba phakathi inqolobane yethu, noma ohlwini lwamakheli [i-imeyili ivikelwe], noma emazwaneni lapha.

Source: www.habr.com

Engeza amazwana