OpenCV ho STM32F7-Discovery

OpenCV ho STM32F7-Discovery Ke e mong oa bahlahisi ba sistimi e sebetsang Embox, 'me sehloohong sena ke tla bua ka hore na ke khonne ho tsamaisa OpenCV joang boto ea STM32746G.

Haeba u ngola ntho e kang "OpenCV on STM32 board" enjeneng ea ho batla, u ka fumana batho ba 'maloa ba ratang ho sebelisa laebrari ena libotong tsa STM32 kapa li-microcontroller tse ling.
Ho na le livideo tse 'maloa tseo, ho ahlola ka mabitso, li lokelang ho bonts'a se hlokahalang, empa hangata (livideong tsohle tseo ke li boneng) botong ea STM32, ke setšoantšo feela se ileng sa amoheloa ho tsoa khamera mme sephetho se hlahisoa skrineng, mme ts'ebetso ea setšoantšo ka boeona e entsoe ka komporo e tloaelehileng, kapa ka liboto tse matla haholo (mohlala, Raspberry Pi).

Hobaneng ho le thata?

Ho tsebahala ha lipotso tsa lipatlisiso ho hlalosoa ke taba ea hore OpenCV ke laebrari ea pono ea khomphutha e tsebahalang haholo, ho bolelang hore bahlahisi ba bangata ba e tseba, le bokhoni ba ho tsamaisa khoutu e lokiselitsoeng komporo ho microcontroller e nolofatsa ts'ebetso ea nts'etsopele haholo. Empa ke hobane'ng ha ho ntse ho se na litlolo tse ratoang tse lokiselitsoeng ho rarolla bothata bona?

Bothata ba ho sebelisa OpenCV ho li-shawls tse nyane bo amana le likarolo tse peli:

  • Haeba u bokella laebrari leha e na le li-module tse nyane, e ke ke ea kena mohopolong oa flash ea STM32F7Discovery e tšoanang (esita le ntle le ho ela hloko OS) ka lebaka la khoutu e kholo haholo (li-megabyte tse 'maloa tsa litaelo)
  • Laebrari ka boeona e ngotsoe ka C ++, e bolelang
    • U hloka tšehetso bakeng sa nako e nepahetseng ea ho matha (mekhelo, joalo-joalo)
    • Ts'ehetso e nyane bakeng sa LibC/Posix, eo hangata e fumanehang ho OS bakeng sa lits'ebetso tse kentsoeng - o hloka laeborari e tloaelehileng le laeborari e tloaelehileng ea template ea STL (vector, jj.)

E tsamaisoa ho Embox

Joalo ka tloaelo, pele o kenya mananeo afe kapa afe ho sistimi ea ts'ebetso, ke mohopolo o motle ho leka ho e aha ka mokhoa oo baetsi ba e rerileng ka ona. Tabeng ea rona, ha ho na mathata ka sena - khoutu ea mohloli e ka fumanoa ho github, laeborari e hahiloe tlasa GNU/Linux ka cmake e tloaelehileng.

Litaba tse monate ke hore OpenCV e ka hahuoa e le laeborari e tsitsitseng ka ntle ho lebokose, e etsang hore ho be bonolo ho tsamaisa thepa. Re bokella laeborari e nang le tlhophiso e tloaelehileng mme re bone hore na ba nka sebaka se kae. Mojule o mong le o mong o bokelloa laebraring e arohaneng.

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

Joalokaha u ka bona ho tloha moleng oa ho qetela, .bss le .data ha li nke sebaka se seholo, empa khoutu e feta 70 MiB. Ho hlakile hore haeba sena se hokahane le ts'ebeliso e itseng, khoutu e tla fokotseha.

Ha re leke ho lahla li-module tse ngata kamoo ho ka khonehang e le hore mohlala o fokolang o bokelloe (oo, mohlala, o tla hlahisa mofuta oa OpenCV), kahoo re sheba. cmake .. -LA ebe o tima likhethong tsohle tse timang.

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

Ka lehlakoreng le leng, ena ke mojule o le mong feela oa laeborari, ka lehlakoreng le leng, sena ha se na ts'ebetso ea komporo bakeng sa boholo ba khoutu (-Os). ~ 3 MiB ea khoutu e ntse e le ngata haholo, empa e se e fana ka tšepo ea katleho.

Matha ka emulator

Ho bonolo haholo ho lokisa emulator, kahoo etsa bonnete ba hore laebrari e sebetsa ho qemu. Joaloka sethala se etsisoang, ke khethile Integrator / CP, hobane ea pele, hape ke ARM, 'me ea bobeli, Embox e tšehetsa tlhahiso ea litšoantšo bakeng sa sethala sena.

Embox e na le mochini oa ho aha lilaebrari tsa kantle, re e sebelisa re eketsa OpenCV joalo ka mojule (ho fetisa likhetho tsohle tse tšoanang bakeng sa moaho o "bonyane" ka mokhoa oa lilaebrari tse sa fetoheng), kamora moo ke eketsa ts'ebeliso e bonolo e shebahalang tjena:

version.cpp:

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

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

    return 0;
}

Re bokella tsamaiso, re e tsamaise - re fumana tlhahiso e lebelletsoeng.

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

Mohato o latelang ke ho tsamaisa mohlala o mong, haholo-holo o mong oa maemo a fanoang ke bahlahisi ka bobona. sebakeng sa hau sa marang-rang. ke khethile mohono oa moeli.

Mohlala o ne o tlameha ho ngoloa hanyane ho hlahisa setšoantšo se nang le sephetho ka kotloloho ho buffer ea foreimi. Ke ne ke lokela ho etsa sena, hobane. tshebetso imshow() e ka hula litšoantšo ka likhokahano tsa QT, GTK le Windows, tseo, ehlile, li ke keng tsa ba teng ho config bakeng sa STM32. Ha e le hantle, QT e ka boela ea tsamaisoa ho STM32F7Discovery, empa sena se tla tšohloa sehloohong se seng 🙂

Ka mor'a tlhaloso e khutšoanyane ea hore na sephetho sa mochine oa bohale se bolokiloe ka mokhoa ofe, re fumana setšoantšo.

OpenCV ho STM32F7-Discovery

setšoantšo sa pele

OpenCV ho STM32F7-Discovery

sephetho

E sebetsa ho STM32F7Discovery

Ho 32F746GDISCOVERY ho na le likarolo tse 'maloa tsa memori ea hardware tseo re ka li sebelisang ka tsela e itseng.

  1. 320KiB ea RAM
  2. 1MiB flash bakeng sa setšoantšo
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. sekotjana sa karete ea microSD

Karete ea SD e ka sebelisoa ho boloka litšoantšo, empa maemong a ho tsamaisa mohlala o fokolang, sena ha se na thuso haholo.
Pontšo e na le qeto ea 480 × 272, e bolelang hore memori ea framebuffer e tla ba li-byte tse 522 ka botebo ba li-bits tse 240, ke hore. sena se feta boholo ba RAM, kahoo framebuffer le qubu (e tla hlokoa, ho kenyelletsa le OpenCV, ho boloka data bakeng sa litšoantšo le mehaho e thusang) e tla be e le SDRAM, ntho e 'ngoe le e' ngoe (memori ea mekotla le litlhoko tse ling tsa tsamaiso). ) e tla ea ho RAM .

Haeba re nka bonyane config bakeng sa STM32F7Discovery (lahlela marang-rang kaofela, litaelo tsohle, etsa mekotla e nyenyane ka hohle kamoo ho ka khonehang, joalo-joalo) le ho eketsa OpenCV ka mehlala moo, mohopolo o hlokahalang o tla ba ka tsela e latelang:

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

Bakeng sa ba sa tsebeng hantle hore na ke likarolo life tse eang kae, ke tla hlalosa: in .text и .rodata litaelo le li-constants (ha e le hantle, data e baloang feela) li teng .data data e ka fetoha, .bss ho na le mefuta e "nyaliloeng", eo, leha ho le joalo, e hlokang sebaka (karolo ena e tla "ea" ho RAM).

Litaba tse monate ke hore .data/.bss e lokela ho lekana, empa le .text bothata ke hore ho na le 1MiB feela ea mohopolo bakeng sa setšoantšo. E ka lahleloa ka ntle .text setšoantšo se tsoang ho mohlala 'me u se bale, ho etsa mohlala, ho tloha karete ea SD ho ea mohopolong ha u qala, empa fruit.png e boima ba 330KiB, kahoo sena se ke ke sa rarolla bothata. .text e na le khoutu ea OpenCV.

Ka kakaretso, ho na le ntho e le 'ngoe feela e setseng - ho kenya karolo ea khoutu ho flash ea QSPI (e na le mokhoa o khethehileng oa ts'ebetso ea ho etsa 'mapa oa memori ho bese ea tsamaiso, e le hore processor e khone ho fumana data ena ka ho toba). Tabeng ena, bothata bo hlaha: pele, mohopolo oa QSPI flash drive ha o fumanehe hang ka mor'a hore sesebelisoa se tsosolosoe (o hloka ho qala ka mokhoa o arohaneng oa mokhoa oa memori), 'me ea bobeli, u ke ke ua "flash" memori ena ka. bootloader e tloaelehileng.

Ka lebaka leo, ho ile ha etsoa qeto ea ho hokahanya khoutu eohle ho QSPI, le ho e khantša ka mochine o ikemetseng o tla amohela binary e hlokahalang ka TFTP.

sephetho

Mohopolo oa ho isa laeborari ena ho Embox o hlahile hoo e ka bang selemo se fetileng, empa khafetsa o ile oa chechisoa ka lebaka la mabaka a fapaneng. E 'ngoe ea tsona ke tšehetso bakeng sa libstdc++ le laebrari e tloaelehileng ea template. Bothata ba tšehetso ea C ++ ho Embox bo feta boholo ba sengoloa sena, ka hona mona ke tla re feela re khonne ho fihlela ts'ehetso ena ka tekanyo e nepahetseng hore laeborari ena e sebetse 🙂

Qetellong, mathata ana a ile a hlōloa (bonyane ho lekaneng hore mohlala oa OpenCV o sebetse), 'me mohlala oa matha. Ho nka metsotsoana e 40 e telele hore boto e batle meeli e sebelisa mochini oa Canny. Sena, ehlile, se telele haholo (ho na le maikutlo a ho ntlafatsa taba ena, ho tla khonahala ho ngola sengoloa se arohaneng mabapi le sena haeba ho ka atleha).

OpenCV ho STM32F7-Discovery

Leha ho le joalo, sepheo sa mahareng e ne e le ho theha prototype e tla bonts'a monyetla oa mantlha oa ho tsamaisa OpenCV ho STM32, ka ho latellana, sepheo sena se fihletsoe, hooray!

tl; dr: litaelo tsa mohato ka mohato

0: Khoasolla mehloli ea Embox, joalo ka:

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

1: Ha re qaleng ka ho bokella bootloader e tla "flash" QSPI flash drive.

    make confload-arm/stm32f7cube

Hona joale o hloka ho lokisa marang-rang, hobane. Re tla kenya setšoantšo ka TFTP. Ho seta boto le liaterese tsa IP tse amohelang, o hloka ho hlophisa conf/rootfs/network.

Mohlala oa tlhophiso:

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 - aterese ea moamoheli ho tloha moo setšoantšo se tla kenngoa teng, address - aterese ea boto.

Ka mor'a moo, re bokella bootloader:

    make

2: Ts'ebetso e tloaelehileng ea bootloader (ke masoabi bakeng sa pun) botong - ha ho letho le tobileng mona, o hloka ho le etsa joalo ka ts'ebeliso efe kapa efe ea STM32F7Discovery. Haeba u sa tsebe ho e etsa, u ka bala ka eona mona.
3: Ho bokella setšoantšo ka config bakeng sa OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Ntša ho tsoa likarolong tsa ELF ho ngolloa QSPI ho 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

Ho na le script bukeng ea conf e etsang sena, kahoo o ka e tsamaisa

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

5: U sebelisa tftp, khoasolla qspi.bin.bin ho QSPI flash drive. Ho motho ea amohelang, ho etsa sena, kopitsa qspi.bin ho foldareng ea motso oa seva sa tftp (hangata /srv/tftp/ kapa /var/lib/tftpboot/; liphutheloana tsa seva e tsamaellanang li fumaneha kabong e tsebahalang haholo, eo hangata e bitsoang. tftpd kapa tftp-hpa, ka linako tse ling u tlameha ho e etsa systemctl start tftpd.service ho qala).

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

Ho Embox (ke hore ho bootloader), o hloka ho etsa taelo e latelang (re nka hore seva e na le aterese 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Ka taelo goto o hloka ho "tlola" mohopolong oa QSPI. Sebaka se ikhethileng se tla fapana ho latela hore na setšoantšo se amana joang, u ka bona aterese ena ka taelo mem 0x90000000 (aterese ea ho qala e lumellana le lentsoe la bobeli la 32-bit la setšoantšo); hape o tla hloka ho tšoaea stack -s, aterese ea stack e ho 0x90000000, mohlala:

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

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

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

7: Qala

    embox> edges 20

'me u natefeloe ke patlo ea moeli ea metsotsoana e 40 🙂

Haeba ho na le ho hong ho sa tsamaeeng hantle - ngola bothata polokelo ea rona, kapa lethathamong la mangolo [imeile e sirelelitsoe], kapa maikutlong mona.

Source: www.habr.com

Eketsa ka tlhaloso