Vula iCV kwi-STM32F7-Discovery

Vula iCV kwi-STM32F7-Discovery Ndingomnye wabaphuhlisi benkqubo yokusebenza Emboks, kwaye kweli nqaku ndiza kuthetha malunga nendlela endikwazi ngayo ukuqhuba i-OpenCV kwibhodi ye-STM32746G.

Ukuba uchwetheza into efana ne "OpenCV kwibhodi ye-STM32" kwi-injini yokukhangela, unokufumana abantu abambalwa abanomdla wokusebenzisa eli thala leencwadi kwiibhodi ze-STM32 okanye ezinye ii-microcontroller.
Kukho iividiyo ezininzi ezinokuthi, ngokugweba igama, zibonise oko kufunekayo, kodwa ngokwesiqhelo (kuzo zonke iividiyo endizibonileyo) kwibhodi ye-STM32, ngumfanekiso kuphela owafunyanwa kwikhamera kwaye umphumo waboniswa esikrinini, kunye nokulungiswa komfanekiso ngokwawo kwenziwa nokuba kwikhompyuter eqhelekileyo, okanye kwiibhodi ezinamandla ngakumbi (umzekelo, iRaspberry Pi).

Kutheni kunzima nje?

Ukuthandwa kwemibuzo yokukhangela kuchazwa yinto yokuba i-OpenCV yeyona ndawo idumileyo yethala leencwadi lombono wekhompyuter, okuthetha ukuba abaphuhlisi abaninzi baqhelene nayo, kunye nokukwazi ukuqhuba ikhowudi elungele idesktop kwi-microcontroller ilula kakhulu inkqubo yophuhliso. Kodwa kutheni kungekabikho iindlela zokupheka ezidumileyo ezisele zenziwe ukusombulula le ngxaki?

Ingxaki yokusebenzisa i-OpenCV kwiitshali ezincinci inxulumene nezinto ezimbini:

  • Ukuba uqokelela ithala leencwadi nokuba lineseti encinci yeemodyuli, ayizukungena kwinkumbulo yeflash efanayo STM32F7Discovery (nangaphandle kokuthathela ingqalelo i-OS) ngenxa yekhowudi enkulu kakhulu (iimegabytes ezininzi zemiyalelo)
  • Ithala leencwadi ngokwalo libhalwe kwiC ++, oku kuthetha ukuba
    • Udinga inkxaso ngexesha elifanelekileyo lokubaleka (ngaphandle, njl.)
    • Inkxaso encinci ye-LibC/Posix, edla ngokufumaneka kwi-OS yeenkqubo ezizinzisiweyo - ufuna ithala leencwadi eliqhelekileyo kunye nelayibrari yetemplate ye-STL esemgangathweni (i-vector, njl.)

Ukusiwa kwi-Emboks

Njengesiqhelo, phambi kokuba ukhuphele naziphi na iinkqubo kwinkqubo yokusebenza, luluvo oluhle ukuzama ukuyakha ngohlobo abacebe ngayo abaphuhlisi. Kwimeko yethu, akukho ngxaki ngale nto - ikhowudi yomthombo inokufumaneka github, ithala leencwadi lakhiwe phantsi kwe-GNU/Linux nge-cmake eqhelekileyo.

Iindaba ezimnandi zezokuba i-OpenCV inokwakhiwa njengethala leencwadi elingatshintshiyo ngaphandle kwebhokisi, nto leyo eyenza kube lula ukuthwala. Siqokelela ithala leencwadi kunye ne-config esemgangathweni kwaye sibone ukuba bathatha indawo engakanani. Imodyuli nganye iqokelelwa kwithala leencwadi elahlukileyo.

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

Njengoko unokubona kumgca wokugqibela, .bss kunye .data ayithathi indawo enkulu, kodwa ikhowudi ingaphezulu kwe-70 MiB. Kucacile ukuba ukuba oku kudityaniswa ngokwezibalo kwisicelo esithile, ikhowudi iya kuba ncinane.

Masizame ukuphosa ngaphandle iimodyuli ezininzi kangangoko sinako ukuze umzekelo omncinci udityaniswe (okuthi, umzekelo, ukhuphe inguqulelo ye-OpenCV), ngoko sijonge. cmake .. -LA kwaye ucime kwiinketho zonke ezicimayo.

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

Kwelinye icala, le yimodyuli enye kuphela yethala leencwadi, kwelinye icala, oku ngaphandle kolungelelaniso lomqokeleli wobungakanani bekhowudi (-Os). ~3 MiB yekhowudi iseninzi kakhulu, kodwa sele inika ithemba lempumelelo.

Baleka kwi-emulator

Kulula kakhulu ukulungisa ingxaki kumlinganisi, ngoko ke kuqala qiniseka ukuba ithala leencwadi lisebenza kwiqemu. Njengeqonga elilinganisiweyo, ndakhetha uMhlanganisi / CP, kuba okokuqala, ikwayi-ARM, kwaye okwesibini, i-Embox ixhasa imveliso yemizobo yeli qonga.

I-Embox inomatshini wokwakha amathala eencwadi angaphandle, xa siyisebenzisa songeza i-OpenCV njengemodyuli (idlula zonke iinketho ezifanayo "zobuncinci" bokwakha ngohlobo lwamathala eencwadi amileyo), emva koko ndongeza isicelo esilula esijongeka ngolu hlobo:

version.cpp:

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

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

    return 0;
}

Sihlanganisa inkqubo, siyiqhube - sifumana umphumo olindelekileyo.

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

Inyathelo elilandelayo kukuqhuba omnye umzekelo, ngokukhethekayo omnye wemigangatho enikezelwa ngabaphuhlisi ngokwabo. kwindawo yakho. Ndiyakhetha Umda umtshini canny.

Umzekelo kwakufuneka ubhalwe ngokutsha kancinane ukubonisa umfanekiso onesiphumo ngokuthe ngqo kwisithinteli sesakhelo. Kwafuneka ndenze oku, ngokuba. umsebenzi imshow() inokuzoba imifanekiso nge-QT, i-GTK kunye ne-Windows ujongano, leyo, ngokuqinisekileyo, ayiyi kuba kuqwalaselo lwe-STM32. Ngapha koko, i-QT inokuqhutywa kwi-STM32F7Discovery, kodwa oku kuya kuxoxwa kwelinye inqaku πŸ™‚

Emva kokucaciswa okufutshane apho ifomathi isiphumo somtshini we-edge sigcinwa, sifumana umfanekiso.

Vula iCV kwi-STM32F7-Discovery

umfanekiso wokuqala

Vula iCV kwi-STM32F7-Discovery

Isiphumo

Isebenza kwi-STM32F7Discovery

Kwi-32F746GDISCOVERY kukho amacandelo amaninzi ememori yehardware esinokuwasebenzisa ngendlela enye okanye enye.

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

Ikhadi le-SD lingasetyenziselwa ukugcina imifanekiso, kodwa kwimeko yokuqhuba umzekelo omncinci, oku akuloncedo kakhulu.
Umboniso unesisombululo se-480 Γ— 272, oku kuthetha ukuba imemori ye-framebuffer iya kuba yi-522 bytes kubunzulu be-240 bits, okt. oku kungaphezulu kobukhulu be-RAM, ngoko i-framebuffer kunye nemfumba (eya kufuneka, kubandakanywa ne-OpenCV, ukugcina idatha yemifanekiso kunye nezakhiwo ezincedisayo) ziya kufumaneka kwi-SDRAM, yonke enye into (inkumbulo yeemfumba kunye nezinye iimfuno zenkqubo ) izakuya kwi RAM .

Ukuba sithatha ubuncinci be-config ye-STM32F7Discovery (phonsa yonke inethiwekhi, yonke imiyalelo, yenza izitaki zibe zincinci kangangoko, njl.) kwaye ungeze i-OpenCV ngemizekelo apho, imemori efunekayo iya kuba ngolu hlobo lulandelayo:

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

Kwabo bangaqhelanga kakhulu ukuba ngawaphi amacandelo aya phi, ndiya kuchaza: ngo .text ΠΈ .rodata imiyalelo kunye ne-constants (ukuthetha nje, ukufunda kuphela idatha) ilele kuyo .data idatha iyatshintsheka, .bss kukho izinto eziguquguqukayo "ezingenanto", ezithi, nangona kunjalo, zidinga indawo (eli candelo liya "kuya" kwi-RAM).

Iindaba ezimnandi zezokuba .data/.bss kufuneka ilingane, kodwa kunye .text Ingxaki kukuba kukho i-1MiB kuphela yememori yomfanekiso. Ingakhutshelwa ngaphandle .text umfanekiso osuka kumzekelo kwaye uwufunde, umzekelo, ukusuka kwikhadi le-SD ukuya kwinkumbulo ekuqaleni, kodwa fruit.png inobunzima obumalunga ne-330KiB, ngoko oku akuzukusombulula ingxaki. .text iqulethe ikhowudi ye-OpenCV.

Ngokubanzi, kukho into enye kuphela eseleyo - ukulayisha inxalenye yekhowudi kwi-flash ye-QSPI (inendlela ekhethekileyo yokusebenza kwimemori yemephu kwibhasi yenkqubo, ukwenzela ukuba iprosesa ikwazi ukufikelela kule datha ngokuthe ngqo). Kule meko, kuvela ingxaki: okokuqala, imemori ye-flash drive ye-QSPI ayifumaneki ngoko nangoko emva kokuba isixhobo siqaliswe ngokutsha (kufuneka uqalise ngokwahlukeneyo imowudi yemephu yememori), kwaye okwesibini, awukwazi "ukukhanyisa" le memori nge. i-bootloader eqhelekileyo.

Ngenxa yoko, kwagqitywa ekubeni idibanise yonke ikhowudi kwi-QSPI, kwaye iyidanyazise ngomlayishi ozibhalayo oza kufumana ibhinari efunekayo nge-TFTP.

Isiphumo

Umbono wokufaka eli thala leencwadi kwi-Embox uvele malunga nonyaka odlulileyo, kodwa ngokuphindaphindiweyo wahlehliswa ngenxa yezizathu ezahlukeneyo. Enye yazo yinkxaso ye-libstdc++ kunye nelayibrari yetemplate eqhelekileyo. Ingxaki yenkxaso ye-C ++ kwi-Embox ingaphaya komgangatho weli nqaku, ngoko apha ndiza kuthetha kuphela ukuba sikwazi ukufezekisa le nkxaso kwixabiso elifanelekileyo ukuze le layibrari isebenze πŸ™‚

Ekugqibeleni, ezi ngxaki zoyiswa (ubuncinane ngokwaneleyo ukuba umzekelo we-OpenCV usebenze), kwaye umzekelo wabaleka. Kuthatha imizuzwana engama-40 ukuba ibhodi ikhangele imida isebenzisa isihluzo seCanny. Oku, ngokuqinisekileyo, kukude kakhulu (kukho ingqwalasela malunga nendlela yokwandisa lo mbandela, kuya kwenzeka ukuba ubhale inqaku elahlukileyo malunga nale nto kwimeko yokuphumelela).

Vula iCV kwi-STM32F7-Discovery

Nangona kunjalo, injongo ephakathi yayikukudala iprototype eya kubonisa ukubanakho okusisiseko kokuqhuba i-OpenCV kwi-STM32, ngokulandelelanayo, le njongo iphunyeziwe, hooray!

tl;dr: imiyalelo yenyathelo nenyathelo

0: Khuphela imithombo ye-Embox, ngolu hlobo:

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

1: Masiqale ngokuhlanganisa i-bootloader eya "kudanya" i-QSPI flash drive.

    make confload-arm/stm32f7cube

Ngoku kufuneka uqwalasele inethiwekhi, kuba. Siza kulayisha umfanekiso nge-TFTP. Ukuseta ibhodi kunye nokusingatha iidilesi ze-IP, kufuneka uhlele i-conf/rootfs/network.

Umzekelo woqwalaselo:

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 -idilesi yehostele ukusuka apho umfanekiso uya kulayishwa khona, address - idilesi yebhodi.

Emva koko, siqokelela i-bootloader:

    make

2: Ukulayishwa okuqhelekileyo kwe-bootloader (uxolo nge-pun) ebhodini - akukho nto ithile apha, kufuneka uyenze njengaso nasiphi na esinye isicelo se-STM32F7Discovery. Ukuba awuyazi indlela yokwenza, unokufunda ngayo apha.
3: Ukuqulunqa umfanekiso ngoqwalaselo lwe-OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

I-4: Khipha kumacandelo e-ELF ukuba abhalwe kwi-QSPI ukuya kwi-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

Kukho umbhalo kulawulo lwe conf owenza oku, ukuze ukwazi ukuwuqhuba

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

5: Ukusebenzisa i-tftp, khuphela i-qspi.bin.bin kwi-flash drive ye-QSPI. Kumamkeli, ukwenza oku, khuphela qspi.bin kwingcambu eneenkcukacha yomncedisi we tftp (eqhelekile /srv/tftp/ okanye /var/lib/tftpboot/; iipakethe zomncedisi ohambelanayo ziyafumaneka kunikezelo oludumileyo, oludla ngokubizwa ngokuba tftpd okanye tftp-hpa, ngamanye amaxesha kufuneka wenze 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

Kwi-Emboks (okt kwi-bootloader), kufuneka wenze lo myalelo ulandelayo (sicinga ukuba umncedisi unedilesi 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Ngomyalelo goto kufuneka "utsibe" kwimemori ye-QSPI. Indawo ethile iya kwahluka ngokuxhomekeke kwindlela umfanekiso uqhagamshelwe ngayo, ungabona le dilesi ngomyalelo mem 0x90000000 (idilesi yokuqala ingena kwigama lesibini le-32-bit lomfanekiso); Kananjalo kuya kufuneka uphawule istaki -s, idilesi yesitaki iku-0x90000000, umzekelo:

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

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

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

7: Qalisa

    embox> edges 20

kwaye ujabulele ukukhangela umda we-40-yesibini πŸ™‚

Ukuba kukho into engahambi kakuhle - bhala umba indawo yethu yokugcina, okanye kuluhlu lokuposa [imeyile ikhuselwe], okanye kuluvo apha.

umthombo: www.habr.com

Yongeza izimvo