OpenCV pane STM32F7-Discovery

OpenCV pane STM32F7-Discovery Ini ndiri mumwe wevagadziri veiyo inoshanda sisitimu Embox, uye munyaya ino ndichataura pamusoro pekuti ndakakwanisa sei kumhanya OpenCV pane STM32746G board.

Kana iwe ukanyora chimwe chinhu senge "OpenCV paSTM32 board" muinjini yekutsvaga, unogona kuwana vanhu vakati wandei vanofarira kushandisa raibhurari iyi pamabhodhi eSTM32 kana mamwe mamicrocontrollers.
Kune akati wandei mavhidhiyo ayo, tichitonga nezita, anofanira kuratidza zvinodiwa, asi kazhinji (mumavhidhiyo ese andaona) paSTM32 board, mufananidzo chete wakagamuchirwa kubva kukhamera uye mhedzisiro yakaratidzwa pachiratidziri, uye mufananidzo wacho pachawo wakaitwa pakombiyuta yenguva dzose, kana pamapuranga ane simba (somuenzaniso, Raspberry Pi).

Sei zvakaoma?

Kuzivikanwa kwemibvunzo yekutsvaga kunotsanangurwa nenyaya yekuti OpenCV ndiyo inonyanya kufarirwa kombiyuta raibhurari, izvo zvinoreva kuti vazhinji vanogadzira vanoiziva, uye kugona kumhanyisa desktop-yakagadzirira kodhi pane microcontroller inorerutsa zvakanyanya maitiro ekusimudzira. Asi nei kusati kwave kusati kwave kwakakurumbira akagadzirira-akagadzirwa mabikirwo ekugadzirisa dambudziko iri?

Dambudziko rekushandisa OpenCV pane diki shawls rine chekuita nemhando mbiri:

  • Kana iwe ukaunganidza raibhurari kunyangwe iine shoma seti yemamodule, haingokwane mundangariro yemwenje yeiyo STM32F7Discovery imwechete (kunyangwe pasina kufunga nezve OS) nekuda kwekodhi yakakura kwazvo (mamegabytes akati wandei emirairo)
  • Raibhurari pachayo yakanyorwa muC ++, zvinoreva
    • Unoda rutsigiro rwenguva yakanaka yekumhanya (kunze, nezvimwewo)
    • Rutsigiro rudiki rweLibC/Posix, iyo inowanzo kuwanikwa muOS yeakamisikidzwa masisitimu - iwe unoda yakajairwa plus raibhurari uye yakajairwa STL template raibhurari (vector, nezvimwewo)

Kuendesa kuEmbox

Semazuva ese, usati waendesa chero zvirongwa kune inoshanda sisitimu, ipfungwa yakanaka kuyedza kuivaka muchimiro icho vagadziri vaironga. Muchiitiko chedu, hapana matambudziko neizvi - iyo kodhi kodhi inogona kuwanikwa pairi github, raibhurari inovakwa pasi peGNU/Linux neyakajairwa cmake.

Nhau dzakanaka ndedzekuti OpenCV inogona kuvakwa seraibhurari yakamira kunze kwebhokisi, izvo zvinoita kuti kutakura kuve nyore. Isu tinounganidza raibhurari ine yakajairwa config uye toona kuti yakawanda sei nzvimbo yavanotora. Imwe neimwe module inounganidzwa muraibhurari yakaparadzana.

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

Sezvaunogona kuona kubva kumutsara wekupedzisira, .bss uye .data hazvitore nzvimbo yakawanda, asi iyo code inopfuura 70 MiB. Zviri pachena kuti kana izvi zvakabatanidzwa kune imwe application, iyo kodhi ichava shoma.

Ngatiedze kukanda mamodule akawanda sezvinobvira kuitira kuti muenzaniso mudiki uunganidzwe (iyo, semuenzaniso, inongoburitsa iyo OpenCV vhezheni), saka isu tinotarisa. cmake .. -LA uye dzima mune sarudzo zvese zvinodzima.

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

Kune rimwe divi, iyi ingori moduli yeraibhurari, kune rumwe rutivi, iyi haina compiler optimization yehukuru hwekodhi (-Os) ~ 3 MiB yekodhi ichiri yakawanda, asi yatopa tariro yekubudirira.

Mhanya mune emulator

Zviri nyore kugadzirisa pane emulator, saka tanga waona kuti raibhurari inoshanda paqemu. Sepuratifomu yakateedzerwa, ndakasarudza Integrator / CP, nekuti chekutanga, iri zvakare ARM, uye chechipiri, Embox inotsigira magiraidhi anobuda papuratifomu iyi.

Embox ine michina yekuvaka ekunze maraibhurari, tichiishandisa isu tinowedzera OpenCV semodule (kupfuura zvese zvakafanana sarudzo dze "zvishoma" kuvaka nenzira yemaraibhurari akamira), mushure mezvo ini ndinowedzera application iri nyore inoita seizvi:

version.cpp:

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

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

    return 0;
}

Isu tinounganidza sisitimu, toimhanyisa - tinowana zvinotarisirwa kubuda.

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

Nhanho inotevera ndeyekumhanyisa mumwe muenzaniso, zviri nani imwe yeyakajairwa inopihwa nevanogadzira ivo pachavo. panzvimbo yako. Ndakasarudza border detector canny.

Muenzaniso wacho waifanira kunyorwazve zvishoma kuti uratidze mufananidzo nemhedzisiro yacho zvakananga mufuremu buffer. Ndaifanira kuita izvi, nokuti. basa imshow() inogona kudhirowa mifananidzo kuburikidza neQT, GTK uye Windows interfaces, izvo, zvechokwadi, hazvizove mugadziriro yeSTM32. Muchokwadi, QT inogona zvakare kumhanya paSTM32F7Discovery, asi izvi zvichakurukurwa mune chimwe chinyorwa πŸ™‚

Mushure mekutsanangurwa kupfupi mune iyo fomati mhedzisiro yemupendero detector inochengetwa, tinowana mufananidzo.

OpenCV pane STM32F7-Discovery

mufananidzo wepakutanga

OpenCV pane STM32F7-Discovery

mugumisiro

Inomhanya paSTM32F7Discovery

Pa 32F746GDISCOVERY pane akati wandei hardware memory zvikamu zvatinga shandisa neimwe nzira kana imwe.

  1. 320KiB RAM
  2. 1MiB flash yemufananidzo
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. microSD kadhi slot

Kadhi reS SD rinogona kushandiswa kuchengeta mifananidzo, asi mumamiriro ekumhanyisa muenzaniso mudiki, izvi hazvibatsiri zvakanyanya.
Chiratidziro chine sarudzo ye480 Γ— 272, zvinoreva kuti iyo framebuffer memory ichave 522 bytes pakadzika 240 bits, i.e. iyi inopfuura saizi ye RAM, saka iyo framebuffer uye murwi (iyo ichadikanwa, kusanganisira yeOpenCV, kuchengetedza data yemifananidzo uye zvivakwa zvekubatsira) ichave iri muSDRAM, zvimwe zvese (yeuko yemastacks uye zvimwe zvinodiwa system. ) ichaenda ku RAM .

Kana tikatora iyo yakaderera config yeSTM32F7Discovery (kanda kunze network yese, mirairo yese, ita masheki madiki sezvinobvira, nezvimwewo) uye kuwedzera OpenCV nemienzaniso ipapo, chiyeuchidzo chinodiwa chichava seizvi:

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

Kune avo vasina kunyatsoziva kuti ndezvipi zvikamu zvinoenda, ini ndichatsanangura: mukati .text ΠΈ .rodata mirairo uye zvisingaperi (zvichireva kutaura, kuverenga chete data) zvirimo .data iyo data inogona kuchinja, .bss kune "nulled" akasiyana, ayo, zvisinei, anoda nzvimbo (ichi chikamu "chichaenda" ku RAM).

Mashoko akanaka ndeokuti .data/.bss inofanira kukwana, asi ne .text dambudziko nderekuti pane chete 1MiB yekuyeuka yemufananidzo. Inogona kukandwa kunze .text mufananidzo kubva kumuenzaniso uye uverenge, semuenzaniso, kubva kuS SD kadhi kuenda kundangariro pakutanga, asi fruit.png inorema anenge 330KiB, saka izvi hazvigadzirise dambudziko: zvakanyanya. .text ine OpenCV kodhi.

Kakawanda, pane chinhu chimwe chete chasara - kurodha chikamu chekodhi paQSPI flash (ine yakasarudzika maitiro ekuita mepu yekurangarira kune system bhazi, kuitira kuti processor iwane iyi data zvakananga). Muchiitiko ichi, dambudziko rinomuka: chekutanga, chiyeuchidzo cheQSPI flash drive hachiwanikwe pakarepo mushure mekunge chigadziro chatangazve (unofanirwa kuparadzanisa nzira yekuyeuka-mepu), uye chechipiri, haugone "kupenya" iyi ndangariro ne. yakajairika bootloader.

Nekuda kweizvozvo, zvakasarudzwa kubatanidza kodhi yese muQSPI, uye kuivheneka neayo-yakanyorwa loader iyo inogashira inodiwa bhinari kuburikidza neTFTP.

mugumisiro

Pfungwa yekuendesa raibhurari iyi kuEmbox yakaonekwa rinenge gore rapfuura, asi kakawanda yakamiswa nekuda kwezvikonzero zvakasiyana. Imwe yacho itsigiro ye libstdc ++ uye yakajairwa template raibhurari. Dambudziko rerutsigiro rweC ++ muEmbox riri pamusoro pechikamu chechinyorwa ichi, saka pano ini ndichataura chete kuti takakwanisa kuwana rutsigiro urwu muhuwandu hwakakodzera kuti raibhurari iyi ishande πŸ™‚

Pakupedzisira, matambudziko aya akakundwa (zvakakwana zvakakwana kuti muenzaniso weOpenCV ushande), uye muenzaniso wakamhanya. Zvinotora 40 masekonzi akareba kuti bhodhi ritsvage miganhu uchishandisa Canny sefa. Izvi, hongu, zvakanyanyisa kureba (kune kufunga pamusoro pekugadzirisa nyaya iyi, zvinokwanisika kunyora imwe nyaya pamusoro peizvi kana kubudirira).

OpenCV pane STM32F7-Discovery

Nekudaro, chinangwa chepakati chaive chekugadzira prototype icharatidza mukana wakakosha wekumhanyisa OpenCV paSTM32, zvichiteerana, chinangwa ichi chakazadzikiswa, hooray!

tl; dr: nhanho nhanho mirairo

0: Dhawunirodha Embox masosi, seizvi:

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

1: Ngatitange nekuunganidza bootloader iyo "inopenya" QSPI flash drive.

    make confload-arm/stm32f7cube

Zvino iwe unofanirwa kugadzirisa network, nekuti. Tichaisa mufananidzo kuburikidza neTFTP. Kuseta bhodhi uye kugamuchira IP kero, unofanirwa kugadzirisa iyo conf/rootfs/network.

Configuration muenzaniso:

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 - kero yekutambira kubva paizoiswa mufananidzo, address - kero yebhodhi.

Mushure meizvozvo, tinounganidza iyo bootloader:

    make

2: Iyo yakajairika kurodha yebootloader (ndine hurombo nepun) pabhodhi - hapana chakanangana nepano, iwe unofanirwa kuzviita senge kune chero imwe application yeSTM32F7Discovery. Kana iwe usingazivi kuti ungazviita sei, unogona kuverenga nezvazvo pano.
3: Kunyora mufananidzo une config yeOpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Bvisa kubva muzvikamu zveELF kuti zvinyorwe kuQSPI kuqspi.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

Pane script mune conf dhairekitori inoita izvi, saka iwe unogona kuimhanyisa

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

5: Uchishandisa tftp, dhawunirodha qspi.bin.bin kune QSPI flash drive. Pamugamuchiri, kuti uite izvi, kopira qspi.bin kune mudzi folda ye tftp server (kazhinji /srv/tftp/ kana /var/lib/tftpboot/; mapakeji evhavha inoenderana anowanikwa mukugovera kwakakurumbira, kunowanzonzi. tftpd kana tftp-hpa, dzimwe nguva unofanirwa kuita systemctl start tftpd.service kutanga).

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

PaEmbox (kureva mubootloader), unofanirwa kuita murairo unotevera (tinofunga kuti sevha ine kero 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Nomurayiro goto unofanirwa "kusvetuka" muQSPI ndangariro. Nzvimbo chaiyo ichasiyana zvichienderana nekuti mufananidzo wacho wakabatanidzwa sei, unogona kuona kero iyi nemurairo mem 0x90000000 (kero yekutanga inokwana mune yechipiri 32-bit izwi remufananidzo); iwe zvakare uchafanirwa mureza iyo stack -s, iyo stack kero iri pa0x90000000, semuenzaniso:

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

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

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

7: Kutanga

    embox> edges 20

uye unakirwe ne40-sekondi yekutsvaga muganho πŸ™‚

Kana chimwe chinhu chisina kumira zvakanaka - nyora nyaya mukati yedu repository, kana kuti kutsamba yetsamba [email inodzivirirwa], kana mune mhinduro pano.

Source: www.habr.com

Voeg