OpenCV pa STM32F7-Discovery

OpenCV pa STM32F7-Discovery Ndine m'modzi mwa opanga makina ogwiritsira ntchito Emboks, ndipo m'nkhaniyi ndilankhula za momwe ndinatha kuyendetsa OpenCV pa bolodi la STM32746G.

Mukalemba china chake ngati "OpenCV pa STM32 board" mukusaka, mutha kupeza anthu angapo omwe akufuna kugwiritsa ntchito laibulale iyi pama board a STM32 kapena ma microcontroller ena.
Pali makanema angapo omwe, potengera dzina, ayenera kuwonetsa zomwe zikufunika, koma nthawi zambiri (m'mavidiyo onse omwe ndidawona) pa bolodi la STM32, chithunzi chokhacho chidalandiridwa kuchokera ku kamera ndipo zotsatira zake zidawonetsedwa pazenera, ndikukonza chithunzicho kunkachitika pakompyuta yokhazikika, kapena pama board amphamvu kwambiri (mwachitsanzo, Raspberry Pi).

Chifukwa chiyani kuli kovuta?

Kutchuka kwamafunso osaka kumafotokozedwa ndikuti OpenCV ndiye laibulale yodziwika bwino yamakompyuta, zomwe zikutanthauza kuti opanga ambiri amazidziwa bwino, komanso kuthekera koyendetsa ma code okonzeka pakompyuta pa microcontroller kumathandizira kwambiri chitukuko. Koma n'chifukwa chiyani palibe maphikidwe otchuka okonzeka kuthetsa vutoli?

Vuto logwiritsa ntchito OpenCV pamashalo ang'onoang'ono limagwirizana ndi zinthu ziwiri:

  • Ngati mupanga laibulale ngakhale ndi ma module ochepa, sizingafanane ndi kukumbukira kwamtundu womwewo wa STM32F7Discovery (ngakhale osaganizira za OS) chifukwa cha code yayikulu kwambiri (ma megabytes angapo a malangizo)
  • Laibulale yokhayo yalembedwa mu C ++, kutanthauza
    • Mufunika thandizo la nthawi yabwino yothamanga (kupatulapo, ndi zina zotero)
    • Thandizo laling'ono la LibC/Posix, lomwe nthawi zambiri limapezeka mu OS pamakina ophatikizika - mumafunika laibulale yokhazikika komanso laibulale yokhazikika ya template ya STL (vekitala, ndi zina).

Kutumiza ku Embox

Monga mwachizolowezi, musanatumize mapulogalamu aliwonse ku opareshoni, ndi bwino kuyesa kuyipanga mwanjira yomwe opanga adafunira. Kwa ife, palibe vuto ndi izi - gwero la code likhoza kupezeka github, laibulale imamangidwa pansi pa GNU/Linux ndi cmake wamba.

Nkhani yabwino ndiyakuti OpenCV ikhoza kumangidwa ngati laibulale yosasunthika m'bokosi, zomwe zimapangitsa kunyamula mosavuta. Timasonkhanitsa laibulale yokhala ndi makonzedwe okhazikika ndikuwona kuchuluka kwa malo omwe amatenga. Mutu uliwonse umasonkhanitsidwa mulaibulale yosiyana.

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

Monga momwe mukuonera kuchokera pamzere wotsiriza, .bss ndi .data sizitenga malo ambiri, koma code ndi yoposa 70 MiB. Zikuwonekeratu kuti ngati izi zikugwirizana ndi pulogalamu inayake, code idzakhala yochepa.

Tiyeni tiyese kutaya ma modules ambiri momwe tingathere kuti chitsanzo chochepa chisonkhanitsidwe (chomwe, mwachitsanzo, chingotulutsa mtundu wa OpenCV), kotero timayang'ana. cmake .. -LA ndikuzimitsa muzosankha zonse zomwe zimazimitsa.

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

Kumbali imodzi, iyi ndi gawo limodzi la laibulale, kumbali ina, iyi ilibe kukhathamiritsa kwa makulidwe a code (-Os). ~ 3 MiB code ikadali yochuluka, koma imapereka chiyembekezo chakuchita bwino.

Thamangani mu emulator

Ndikosavuta kukonza zolakwika pa emulator, kotero choyamba onetsetsani kuti laibulale imagwira ntchito pa qemu. Monga nsanja yotsanzira, ndinasankha Integrator / CP, chifukwa Choyamba, ndi ARM, ndipo kachiwiri, Embox imathandizira zojambula papulatifomu.

Embox ili ndi makina omangira malaibulale akunja, ndikuigwiritsa ntchito timawonjezera OpenCV ngati gawo (kudutsa zosankha zonse zofananira "zochepa" zomanga ngati malaibulale osasunthika), pambuyo pake ndikuwonjezera ntchito yosavuta yomwe imawoneka ngati iyi:

version.cpp:

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

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

    return 0;
}

Timasonkhanitsa dongosolo, kuyendetsa - timapeza zomwe tikuyembekezera.

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 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² сборку ΠΈ Ρ‚.ΠΏ.>

Chotsatira ndikuyendetsa chitsanzo, makamaka chimodzi mwazomwe zimaperekedwa ndi opanga okha. patsamba lanu. Ndasankha Border detector canny.

Chitsanzocho chinayenera kulembedwanso pang'ono kuti chiwonetse chithunzicho ndi zotsatira zake mwachindunji mu buffer ya chimango. Ndinayenera kuchita izi, chifukwa. ntchito imshow() ikhoza kujambula zithunzi kudzera pa QT, GTK ndi Windows interfaces, zomwe, ndithudi, sizidzakhala mu kasinthidwe ka STM32. M'malo mwake, QT itha kuyendetsedwanso pa STM32F7Discovery, koma izi zidzakambidwa m'nkhani ina πŸ™‚

Pambuyo pofotokozera mwachidule momwe zotsatira za chojambulira m'mphepete zimasungidwa, timapeza chithunzi.

OpenCV pa STM32F7-Discovery

chithunzi choyambirira

OpenCV pa STM32F7-Discovery

chifukwa

Zithunzi za STM32F7Discovery

Pa 32F746GDISCOVERY pali magawo angapo a memory memory omwe titha kugwiritsa ntchito mwanjira ina.

  1. 320KiB RAM
  2. 1MiB flash ya chithunzi
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. kagawo ka microSD khadi

Khadi la SD lingagwiritsidwe ntchito kusunga zithunzi, koma potengera chitsanzo chochepa, izi sizothandiza kwambiri.
Chiwonetserocho chili ndi malingaliro a 480 Γ— 272, zomwe zikutanthauza kuti kukumbukira kwa framebuffer kudzakhala 522 bytes pakuya kwa 240 bits, i.e. izi ndizoposa kukula kwa RAM, kotero framebuffer ndi mulu (omwe adzafunika, kuphatikizapo OpenCV, kusunga deta ya zithunzi ndi nyumba zothandizira) zidzapezeka mu SDRAM, china chirichonse (kukumbukira kwa stacks ndi zosowa zina zamakina) ) idzapita ku RAM .

Ngati titenga zocheperako za STM32F7Discovery (kutaya netiweki yonse, malamulo onse, pangani milu yaying'ono momwe tingathere, ndi zina zotero) ndikuwonjezera OpenCV ndi zitsanzo pamenepo, kukumbukira kofunikira kudzakhala motere:

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

Kwa iwo omwe sadziwa bwino magawo omwe amapita, ndikufotokozerani: mu .text ΠΈ .rodata malangizo ndi zokhazikika (kutanthauza, kuwerenga kokha) zilimo .data data ndi yosinthika, .bss pali zosintha "zopanda pake", zomwe, komabe, zimafunikira malo (gawoli "lipita" ku RAM).

Nkhani yabwino ndiyakuti .data/.bss ziyenera kukwanira, koma ndi .text vuto ndiloti pali 1MiB yokha ya kukumbukira chithunzicho. Akhoza kutayidwa kunja .text chithunzi kuchokera ku chitsanzo ndikuchiwerenga, mwachitsanzo, kuchokera ku SD khadi kupita kukumbukira poyambira, koma fruit.png imalemera pafupifupi 330KiB, kotero izi sizingathetse vutoli: ambiri .text ili ndi code ya OpenCV.

Mwambiri, pali chinthu chimodzi chokha chomwe chatsala - kutsitsa gawo la code pa QSPI flash (ili ndi njira yapadera yopangira mapu kukumbukira ku bus system, kuti purosesa ipeze deta iyi mwachindunji). Pachifukwa ichi, pamakhala vuto: choyamba, kukumbukira kwa QSPI flash drive sikupezeka nthawi yomweyo chipangizocho chikangoyambiranso (muyenera kuyambitsa padera mawonekedwe okumbukira kukumbukira), ndipo kachiwiri, simungathe "kuwalitsa" kukumbukira uku. chojambulira chodziwika bwino.

Zotsatira zake, zidasankhidwa kulumikiza ma code onse mu QSPI, ndikuwunikira ndi chojambulira chodzilemba chomwe chidzalandira binary yofunikira kudzera pa TFTP.

chifukwa

Lingaliro lonyamula laibulale iyi ku Embox lidawonekera pafupifupi chaka chapitacho, koma mobwerezabwereza idaimitsidwa chifukwa chazifukwa zosiyanasiyana. Chimodzi mwa izo ndikuthandizira libstdc ++ ndi laibulale yokhazikika ya template. Vuto la chithandizo cha C ++ mu Embox ndi lopitirira malire a nkhaniyi, kotero apa ndingonena kuti tinakwanitsa kukwaniritsa chithandizo ichi pamlingo woyenera kuti laibulale iyi igwire ntchito πŸ™‚

Pamapeto pake, mavutowa adagonjetsedwa (osakwanira kuti chitsanzo cha OpenCV chigwire ntchito), ndipo chitsanzocho chinathamanga. Zimatenga masekondi a 40 kuti gululo lifufuze malire pogwiritsa ntchito fyuluta ya Canny. Izi, ndithudi, ndizotalika kwambiri (pali malingaliro a momwe mungakwaniritsire nkhaniyi, mudzatha kulemba nkhani ina ya izi ngati mutapambana).

OpenCV pa STM32F7-Discovery

Komabe, cholinga chapakati chinali kupanga chithunzi chomwe chidzawonetsa kuthekera koyambira kwa OpenCV pa STM32, motsatana, cholinga ichi chidakwaniritsidwa, hooray!

tl; dr: malangizo a sitepe ndi sitepe

0: Tsitsani magwero a Embox, monga chonchi:

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

1: Tiyeni tiyambe ndi kusonkhanitsa bootloader kuti "flash" QSPI kung'anima pagalimoto.

    make confload-arm/stm32f7cube

Tsopano muyenera kukonza maukonde, chifukwa. Timayika chithunzicho kudzera pa TFTP. Kuti muyike board ndi ma adilesi a IP, muyenera kusintha conf/rootfs/network.

Chitsanzo chokonzekera:

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 - adilesi yolandila pomwe chithunzicho chidzakwezedwa, address - adilesi ya board.

Pambuyo pake, timasonkhanitsa bootloader:

    make

2: Kutsitsa mwachizolowezi kwa bootloader (pepani chifukwa cha pun) pa bolodi - palibe chilichonse apa, muyenera kuchita ngati pulogalamu ina iliyonse ya STM32F7Discovery. Ngati simukudziwa momwe mungachitire, mutha kuwerenga za izo apa.
3: Kupanga chithunzi ndi kasinthidwe ka OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Chotsani kuchokera ku zigawo za ELF kuti zilembedwe ku QSPI kupita 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

Pali script mu conf directory yomwe imachita izi, kuti mutha kuyendetsa

    ./conf/qspi_objcopy.sh # НуТный Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ -- build/base/bin/qspi.bin

5: Pogwiritsa ntchito tftp, koperani qspi.bin.bin ku QSPI flash drive. Pa wolandirayo, kuti muchite izi, lembani qspi.bin ku chikwatu cha tftp seva (nthawi zambiri /srv/tftp/ kapena /var/lib/tftpboot/; phukusi la seva yofananira likupezeka m'magawidwe otchuka kwambiri, omwe nthawi zambiri amatchedwa. tftpd kapena tftp-hpa, nthawi zina muyenera kuchita systemctl start tftpd.service kuyambira).

    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftpd
    sudo cp build/base/bin/qspi.bin /srv/tftp
    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftp-hpa
    sudo cp build/base/bin/qspi.bin /var/lib/tftpboot

Pa Embox (ie mu bootloader), muyenera kuchita lamulo ili (tikuganiza kuti seva ili ndi adilesi 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Ndi lamulo goto muyenera "kulumpha" mu QSPI kukumbukira. Malo enieni adzasiyana malinga ndi momwe chithunzicho chikugwirizanirana, mukhoza kuwona adilesiyi ndi lamulo mem 0x90000000 (adiresi yoyambira ikugwirizana ndi mawu achiwiri a 32-bit a fano); muyeneranso kuwonetsa stack -s, adilesi ya stack ili pa 0x90000000, mwachitsanzo:

    embox>mem 0x90000000
    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275
                      ↑           ↑
              это адрСс    это  адрСс 
                стэка        ΠΏΠ΅Ρ€Π²ΠΎΠΉ
                           инструкции

    embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡƒΠΆΠ΅Π½ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ прСрывания Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы

    < Начиная ΠΎΡ‚ΡΡŽΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, Π° ΠΎΠ±Ρ€Π°Π·Π° с OpenCV >

7: Kukhazikitsa

    embox> edges 20

ndipo sangalalani ndikusaka kwa malire kwa mphindi 40 πŸ™‚

Ngati china chake sichikuyenda bwino - lembani vuto malo athu, kapena pamndandanda wamakalata [imelo ndiotetezedwa], kapena mu ndemanga apa.

Source: www.habr.com

Kuwonjezera ndemanga