OpenCV sa STM32F7-Discovery

OpenCV sa STM32F7-Discovery Usa ako sa mga nag-develop sa operating system Embox, ug niining artikuloha akong hisgutan kung giunsa nako pagdumala ang OpenCV sa STM32746G board.

Kung nag-type ka sama sa "OpenCV sa STM32 board" sa usa ka search engine, makit-an nimo ang pipila ka mga tawo nga interesado sa paggamit niini nga librarya sa mga board sa STM32 o uban pang mga microcontroller.
Adunay daghang mga video nga, sa paghukom sa ngalan, kinahanglan magpakita kung unsa ang kinahanglan, apan kasagaran (sa tanan nga mga video nga akong nakita) sa STM32 board, ang imahe ra ang nadawat gikan sa camera ug ang resulta gipakita sa screen, ug ang pagproseso sa imahe mismo gihimo bisan sa usa ka regular nga kompyuter, o sa labi ka kusgan nga mga tabla (pananglitan, Raspberry Pi).

Ngano nga lisud kini?

Ang pagkapopular sa mga pangutana sa pagpangita gipatin-aw sa kamatuoran nga ang OpenCV mao ang labing popular nga librarya sa panan-awon sa kompyuter, nga nagpasabot nga mas daghang mga developers ang pamilyar niini, ug ang abilidad sa pagpadagan sa desktop-ready nga code sa usa ka microcontroller labi nga nagpayano sa proseso sa pagpalambo. Apan nganong wala pa'y popular nga andam nga mga resipe alang sa pagsulbad niini nga problema?

Ang problema sa paggamit sa OpenCV sa gagmay nga mga shawl adunay kalabotan sa duha ka bahin:

  • Kung gi-compile nimo ang librarya bisan sa gamay nga set sa mga module, dili kini mohaum sa flash memory sa parehas nga STM32F7Discovery (bisan kung wala gikonsiderar ang OS) tungod sa usa ka dako kaayo nga code (daghang mga megabytes sa mga panudlo)
  • Ang librarya mismo gisulat sa C ++, nga nagpasabut
    • Nagkinahanglan og suporta alang sa positibo nga runtime (mga eksepsiyon, ug uban pa)
    • Gamay nga suporta para sa LibC/Posix, nga kasagarang makita sa OS para sa mga embedded system - kinahanglan nimo ang standard plus library ug standard nga STL template library (vector, etc.)

Pagdala sa Embox

Sama sa naandan, sa wala pa i-port ang bisan unsang mga programa sa operating system, maayo nga ideya nga sulayan kini sa porma nga gituyo sa mga developer. Sa among kaso, walay mga problema niini - ang source code makita sa github, ang librarya gitukod ubos sa GNU/Linux uban sa naandan nga cmake.

Ang maayong balita mao nga ang OpenCV mahimong matukod ingon usa ka static nga librarya sa gawas sa kahon, nga nagpadali sa pag-port. Gikolekta namo ang usa ka librarya nga adunay standard config ug tan-awon kung unsa kadaghan ang ilang magamit. Ang matag module gikolekta sa usa ka lahi nga librarya.

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

Sama sa imong makita gikan sa katapusang linya, ang .bss ug .data wala magkinahanglan og daghang luna, apan ang code labaw pa sa 70 MiB. Klaro nga kung kini i-static nga nalambigit sa usa ka piho nga aplikasyon, ang code mahimong gamay.

Atong sulayan ang paglabay sa daghang mga module kutob sa mahimo aron ang usa ka gamay nga pananglitan matipon (nga, pananglitan, yano nga magpagawas sa bersyon sa OpenCV), mao nga atong tan-awon cmake .. -LA ug i-off sa mga opsyon ang tanan nga dili ma-off.

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

Sa usa ka bahin, kini usa lamang ka module sa librarya, sa laing bahin, kini walay compiler optimization alang sa code size (-Os). ~ 3 MiB sa code daghan pa kaayo, apan naghatag na og paglaum alang sa kalampusan.

Pagdagan sa emulator

Mas sayon ​​​​ang pag-debug sa emulator, busa siguruha una nga ang librarya nagtrabaho sa qemu. Ingon usa ka gisunod nga plataporma, gipili nako ang Integrator / CP, tungod kay una, kini usab ARM, ug ikaduha, ang Embox nagsuporta sa mga graphic output alang niini nga plataporma.

Ang Embox adunay mekanismo sa pagtukod sa gawas nga mga librarya, gamit kini atong idugang ang OpenCV isip usa ka module (pagpasa sa tanan nga parehas nga mga kapilian alang sa "minimal" nga pagtukod sa porma sa static nga mga librarya), pagkahuman nagdugang ako usa ka yano nga aplikasyon nga ingon niini:

version.cpp:

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

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

    return 0;
}

Among gitigom ang sistema, gipadagan kini - nakuha namo ang gipaabot nga output.

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

Ang sunod nga lakang mao ang pagpadagan sa usa ka pananglitan, labi nga usa sa mga sumbanan nga gitanyag sa mga developer mismo. sa imong site. Gipili nako border detector canny.

Ang panig-ingnan kinahanglan nga gamay nga isulat pag-usab aron ipakita ang imahe nga ang resulta direkta sa frame buffer. Kinahanglan nakong buhaton kini, tungod kay. gimbuhaton imshow() makadrowing og mga hulagway pinaagi sa mga interface sa QT, GTK ug Windows, nga, siyempre, siguradong wala sa config para sa STM32. Sa tinuud, ang QT mahimo usab nga ipadagan sa STM32F7Discovery, apan kini hisgutan sa laing artikulo πŸ™‚

Human sa usa ka mubo nga pagpatin-aw diin ang format gitipigan ang resulta sa edge detector, nakakuha kami usa ka imahe.

OpenCV sa STM32F7-Discovery

orihinal nga hulagway

OpenCV sa STM32F7-Discovery

resulta

Nagdagan sa STM32F7Discovery

Sa 32F746GDISCOVERY adunay daghang mga seksyon sa memorya sa hardware nga magamit namon sa usa ka paagi o lain.

  1. 320KiB nga RAM
  2. 1MiB flash para sa hulagway
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot sa microSD card

Ang usa ka SD card mahimong magamit sa pagtipig sa mga imahe, apan sa konteksto sa pagpadagan sa usa ka gamay nga pananglitan, kini dili kaayo mapuslanon.
Ang display adunay resolusyon nga 480 Γ— 272, nga nagpasabot nga ang framebuffer memory mahimong 522 bytes sa giladmon nga 240 bits, i.e. kini labaw pa sa gidak-on sa RAM, mao nga ang framebuffer ug ang heap (nga gikinahanglan, lakip ang OpenCV, sa pagtipig sa datos alang sa mga hulagway ug auxiliary nga mga istruktura) mahimutang sa SDRAM, ang tanan nga uban pa (memorya alang sa mga stack ug uban pang mga kinahanglanon sa sistema. ) moadto sa RAM .

Kung gikuha namon ang minimum nga config para sa STM32F7Discovery (ilabay ang tibuuk nga network, tanan nga mga mando, paghimo og mga stack nga gamay kutob sa mahimo, ug uban pa) ug idugang ang OpenCV nga adunay mga pananglitan didto, ang gikinahanglan nga memorya mao ang mosunod:

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

Para sa mga dili kaayo pamilyar kung asa nga mga seksyon moadto, akong ipasabut: sa .text ΠΈ .rodata mga instruksyon ug mga makanunayon (sa halos pagsulti, readonly data) anaa .data mausab ang datos, .bss adunay mga "nulled" nga mga variable, nga, bisan pa, kinahanglan usa ka lugar (kini nga seksyon "moadto" sa RAM).

Ang maayong balita mao kana .data/.bss angayan, apan uban sa .text ang kasamok mao nga adunay lamang 1MiB sa memorya alang sa imahe. Mahimong ilabay .text ang hulagway gikan sa panig-ingnan ug basaha kini, pananglitan, gikan sa SD card ngadto sa memorya sa pagsugod, apan ang fruits.png may gibug-aton nga 330KiB, mao nga dili kini makasulbad sa problema: kadaghanan .text naglangkob sa OpenCV code.

Sa kinatibuk-an, adunay usa ra ka butang nga nahabilin - ang pagkarga sa usa ka bahin sa code sa usa ka QSPI flash (kini adunay usa ka espesyal nga paagi sa operasyon alang sa pag-mapa sa memorya sa sistema sa bus, aron ang processor maka-access sa kini nga data direkta). Sa kini nga kaso, usa ka problema ang mitungha: una, ang panumduman sa usa ka QSPI flash drive dili magamit dayon pagkahuman sa pag-reboot sa aparato (kinahanglan nimo nga ibulag ang pagsugod sa mode nga mapa sa memorya), ug ikaduha, dili nimo "ma-flash" kini nga panumduman gamit ang pamilyar nga bootloader.

Ingon usa ka sangputanan, nakahukom nga i-link ang tanan nga code sa QSPI, ug i-flash kini sa usa ka self-written loader nga makadawat sa gikinahanglan nga binary pinaagi sa TFTP.

resulta

Ang ideya nga i-port kini nga librarya sa Embox nagpakita mga usa ka tuig na ang milabay, apan balik-balik nga gi-postpone kini tungod sa lainlaing mga hinungdan. Usa niini mao ang suporta alang sa libstdc ++ ug ang standard template library. Ang problema sa suporta sa C ++ sa Embox labaw pa sa kasangkaran sa kini nga artikulo, mao nga dinhi isulti ra nako nga nakab-ot namon kini nga suporta sa husto nga kantidad aron magamit kini nga librarya πŸ™‚

Sa katapusan, kini nga mga problema nabuntog (labing menos igo alang sa OpenCV nga pananglitan sa pagtrabaho), ug ang panig-ingnan midagan. Nagkinahanglan kini og 40 ka taas nga segundo alang sa board sa pagpangita sa mga utlanan gamit ang Canny filter. Kini, siyempre, taas kaayo (adunay mga konsiderasyon kung giunsa ang pag-optimize niini nga butang, mahimo’g magsulat usa ka lahi nga artikulo bahin niini kung adunay kalampusan).

OpenCV sa STM32F7-Discovery

Bisan pa, ang intermediate nga katuyoan mao ang paghimo usa ka prototype nga magpakita sa sukaranan nga posibilidad sa pagpadagan sa OpenCV sa STM32, sa tinuud, kini nga katuyoan nakab-ot, hooray!

tl;dr: lakang sa lakang nga mga panudlo

0: Pag-download sa mga tinubdan sa Embox, sama niini:

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

1: Magsugod kita pinaagi sa pag-assemble sa usa ka bootloader nga "mag-flash" sa usa ka QSPI flash drive.

    make confload-arm/stm32f7cube

Karon kinahanglan nimo nga i-configure ang network, tungod kay. Among i-upload ang hulagway pinaagi sa TFTP. Aron mabutang ang board ug host IP address, kinahanglan nimo nga i-edit ang conf/rootfs/network.

Pananglitan sa pag-configure:

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 - adres sa host kung diin i-load ang imahe, address - adres sa board.

Pagkahuman niana, gikolekta namon ang bootloader:

    make

2: Ang naandan nga pagkarga sa bootloader (pasensya sa pun) sa pisara - wala’y espesipiko dinhi, kinahanglan nimo kini buhaton sama sa bisan unsang ubang aplikasyon para sa STM32F7Discovery. Kung wala ka mahibal-an kung giunsa kini buhaton, mahimo nimong basahon ang bahin niini dinhi.
3: Pag-compile sa usa ka imahe nga adunay config para sa OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Extract gikan sa mga seksyon sa ELF nga isulat sa QSPI ngadto sa 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

Adunay usa ka script sa direktoryo sa conf nga naghimo niini, aron mahimo nimo kini mapadagan

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

5: Gamit ang tftp, i-download ang qspi.bin.bin sa usa ka QSPI flash drive. Sa host, aron mahimo kini, kopyaha ang qspi.bin sa root folder sa tftp server (kasagaran / srv / tftp / o / var / lib / tftpboot /; ang mga pakete alang sa katugbang nga server anaa sa labing popular nga mga distribusyon, kasagaran gitawag tftpd o tftp-hpa, usahay kinahanglan nimong buhaton systemctl start tftpd.service sa pagsugod).

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

Sa Embox (i.e. sa bootloader), kinahanglan nimo nga ipatuman ang mosunud nga mando (among gihunahuna nga ang server adunay adres nga 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Uban sa sugo goto kinahanglan nimo nga "molukso" sa panumduman sa QSPI. Ang piho nga lokasyon magkalainlain depende kung giunsa ang pag-link sa imahe, makita nimo kini nga adres nga adunay mando mem 0x90000000 (ang pagsugod nga adres mohaum sa ikaduhang 32-bit nga pulong sa hulagway); kinahanglan usab nimo nga i-flag ang stack -s, ang stack address anaa sa 0x90000000, pananglitan:

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

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

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

7: Ilusad

    embox> edges 20

ug pahimusli ang 40 segundos nga pagpangita sa utlanan πŸ™‚

Kung adunay sayup - pagsulat usa ka isyu sa among tipiganan, o sa mailing list [protektado sa email], o sa usa ka komento dinhi.

Source: www.habr.com

Idugang sa usa ka comment