OpenCV ing STM32F7-Discovery

OpenCV ing STM32F7-Discovery Aku salah siji saka pangembang saka sistem operasi Embox, lan ing artikel iki aku bakal ngomong babagan carane aku bisa mbukak OpenCV ing papan STM32746G.

Yen sampeyan ngetik kaya "OpenCV ing papan STM32" menyang mesin telusur, sampeyan bisa nemokake sawetara wong sing kasengsem nggunakake perpustakaan iki ing papan STM32 utawa mikrokontroler liyane.
Ana sawetara video sing, miturut jeneng, kudu nduduhake apa sing dibutuhake, nanging biasane (ing kabeh video sing dakdeleng) ing papan STM32, mung gambar sing ditampa saka kamera lan asil ditampilake ing layar. lan pangolahan gambar dhewe ditindakake ing komputer biasa, utawa ing papan sing luwih kuat (contone, Raspberry Pi).

Napa angel?

Popularitas pitakon telusuran diterangake kanthi kasunyatan manawa OpenCV minangka perpustakaan visi komputer sing paling populer, tegese luwih akeh pangembang sing ngerti, lan kemampuan kanggo mbukak kode sing siap desktop ing mikrokontroler nyederhanakake proses pangembangan. Nanging kok isih ora ana resep-resep siap-digawe populer kanggo ngatasi masalah iki?

Masalah nggunakake OpenCV ing selendang cilik ana gandhengane karo rong fitur:

  • Yen sampeyan ngumpulake perpustakaan malah karo pesawat paling tithik saka modul, iku mung ora pas menyang memori lampu kilat STM32F7Discovery padha (sanajan tanpa njupuk menyang akun OS) amarga kode gedhe banget (sawetara megabyte instruksi).
  • Perpustakaan dhewe ditulis ing C ++, kang tegese
    • Perlu dhukungan kanggo runtime positif (pengecualian, lsp.)
    • Dhukungan cilik kanggo LibC / Posix, sing biasane ditemokake ing OS kanggo sistem sing dipasang - sampeyan butuh perpustakaan plus standar lan perpustakaan template STL standar (vektor, lsp.)

Porting menyang Embox

Kaya biasane, sadurunge ngirim program menyang sistem operasi, luwih becik nyoba mbangun ing wangun sing dikarepake para pangembang. Ing kasus kita, ora ana masalah karo iki - kode sumber bisa ditemokake ing github, perpustakaan dibangun ing GNU/Linux karo cmake biasanipun.

Kabar apik yaiku OpenCV bisa dibangun minangka perpustakaan statis metu saka kothak, sing nggawe porting luwih gampang. We ngumpulake perpustakaan karo config standar lan ndeleng carane akeh papan padha njupuk munggah. Saben modul diklumpukake ing perpustakaan sing kapisah.

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

Nalika sampeyan bisa ndeleng saka baris pungkasan, .bss lan .data ora njupuk akeh papan, nanging kode luwih saka 70 MiB. Cetha yen iki disambungake kanthi statis menyang aplikasi tartamtu, kode bakal dadi kurang.

Ayo nyoba mbuwang modul sabisa-bisa supaya conto minimal dirakit (sing, contone, mung bakal ngasilake versi OpenCV), supaya kita katon. cmake .. -LA lan mateni ing pilihan kabeh sing dipateni.

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

Ing tangan siji, iki mung siji modul perpustakaan, ing tangan liyane, iki tanpa optimasi compiler kanggo ukuran kode (-Os). ~3 kode MiB isih akeh, nanging wis menehi pangarep-arep kanggo sukses.

Mbukak ing emulator

Luwih gampang debug ing emulator, mula priksa manawa perpustakaan bisa digunakake ing qemu. Minangka platform emulated, aku milih Integrator / CP, amarga sepisanan, iku uga ARM, lan sareh, Embox ndhukung output grafis kanggo platform iki.

Embox duwe mekanisme kanggo mbangun perpustakaan eksternal, nggunakake OpenCV minangka modul (ngliwati kabeh opsi sing padha kanggo mbangun "minimal" ing wangun perpustakaan statis), sawise iku aku nambah aplikasi prasaja sing katon kaya iki:

version.cpp:

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

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

    return 0;
}

Kita ngumpulake sistem, mbukak - entuk output sing dikarepake.

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

Langkah sabanjure yaiku mbukak sawetara conto, luwih becik salah sawijining standar sing ditawakake para pangembang dhewe. ing situs sampeyan. Aku milih detektor tapel wates.

Conto kudu rada ditulis maneh kanggo nampilake gambar kanthi asil langsung ing buffer pigura. Aku kudu nindakake iki, amarga. fungsi imshow() bisa tarik gambar liwat antarmuka QT, GTK lan Windows, kang, mesthi, ora bakal ing config kanggo STM32. Nyatane, QT uga bisa mbukak ing STM32F7Discovery, nanging iki bakal dibahas ing artikel liyane πŸ™‚

Sawise klarifikasi singkat babagan format asil detektor pinggiran disimpen, kita entuk gambar.

OpenCV ing STM32F7-Discovery

gambar asli

OpenCV ing STM32F7-Discovery

asil

Mlaku ing STM32F7Discovery

Ing 32F746GDISCOVERY ana sawetara bagean memori hardware sing bisa digunakake kanthi cara siji utawa liyane

  1. 320 KiB RAM
  2. Lampu kilat 1MiB kanggo gambar
  3. 8 MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot kertu microSD

Kertu SD bisa digunakake kanggo nyimpen gambar, nanging ing konteks mbukak conto minimal, iki ora banget migunani.
Tampilan wis resolusi 480 Γ— 272, kang tegese memori framebuffer bakal 522 byte ing ambane 240 bit, i.e. iki luwih saka ukuran RAM, supaya framebuffer lan numpuk (sing bakal dibutuhake, kalebu kanggo OpenCV, kanggo nyimpen data kanggo gambar lan struktur tambahan) bakal dumunung ing SDRAM, kabeh liya (memori kanggo tumpukan lan kabutuhan sistem liyane). ) bakal pindhah menyang RAM.

Yen kita njupuk konfigurasi minimal kanggo STM32F7Discovery (mbucal kabeh jaringan, kabeh printah, nggawe tumpukan minangka cilik sabisa, etc.) Lan nambah OpenCV karo conto ana, memori sing dibutuhake bakal kaya ing ngisor iki:

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

Kanggo sing ora banget menowo karo kang bagean pindhah ngendi, Aku bakal nerangake: ing .text ΠΈ .rodata instruksi lan konstanta (kira-kira, data mung diwaca) dumunung .data data kasebut bisa diowahi, .bss ana "nulled" variabel, kang, Nanging, perlu Panggonan (bagean iki bakal "go" kanggo RAM).

Kabar apik iku .data/.bss kudu pas, nanging karo .text alangan iku ana mung 1MiB memori kanggo gambar. Bisa dibuwang metu .text gambar saka conto lan maca, contone, saka kertu SD menyang memori ing wiwitan, nanging fruits.png abot bab 330KiB, supaya iki ora bakal ngatasi masalah: paling .text kasusun saka kode OpenCV.

UmumΓ©, mung ana siji sing isih ana - ngemot bagean kode menyang lampu kilat QSPI (wis mode operasi khusus kanggo memori pemetaan menyang bis sistem, supaya prosesor bisa ngakses data iki langsung). Ing kasus iki, ana masalah: sepisanan, memori QSPI flash drive ora kasedhiya langsung sawise piranti rebooted (sampeyan kudu kapisah initialize mode memori-mapped), lan sareh, sampeyan ora bisa "kerlip" memori iki. bootloader sing akrab.

AkibatΓ©, diputusake kanggo nyambungake kabeh kode ing QSPI, lan kerlip nganggo loader sing ditulis dhewe sing bakal nampa binar sing dibutuhake liwat TFTP.

asil

Gagasan kanggo port perpustakaan iki menyang Embox muncul kira-kira setahun kepungkur, nanging bola-bali ditundha amarga macem-macem alasan. Salah sijine yaiku dhukungan kanggo libstdc ++ lan perpustakaan cithakan standar. Masalah dhukungan C ++ ing Embox ngluwihi ruang lingkup artikel iki, mula aku mung bakal ujar manawa kita bisa entuk dhukungan iki kanthi jumlah sing cocog kanggo perpustakaan iki πŸ™‚

Pungkasane, masalah kasebut diatasi (paling ora cukup kanggo conto OpenCV bisa digunakake), lan conto kasebut mlaku. Butuh 40 detik dawa kanggo Papan nelusuri wates nggunakake Filter Canny. Iki, mesthi, dawa banget (ana pertimbangan babagan carane ngoptimalake prakara iki, bakal bisa nulis artikel kapisah babagan iki ing kasus sukses).

OpenCV ing STM32F7-Discovery

Nanging, tujuan penengah yaiku nggawe prototipe sing bakal nuduhake kemungkinan dhasar mbukak OpenCV ing STM32, masing-masing, tujuan iki wis diraih, hooray!

tl;dr: instruksi langkah demi langkah

0: Ngundhuh sumber Embox, kaya iki:

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

1: Ayo miwiti kanthi ngrakit bootloader sing bakal "kerlip" flash drive QSPI.

    make confload-arm/stm32f7cube

Saiki sampeyan kudu ngatur jaringan, amarga. Kita bakal ngunggah gambar liwat TFTP. Kanggo nyetel papan lan alamat IP host, sampeyan kudu ngowahi conf/rootfs/network.

Conto konfigurasi:

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 - alamat host saka ngendi gambar bakal dimuat, address - alamat papan.

Sawise iku, kita ngumpulake bootloader:

    make

2: Loading biasanipun saka bootloader (nuwun sewu) ing Papan - ana apa-apa tartamtu kene, sampeyan kudu nindakake kaya kanggo aplikasi liyane kanggo STM32F7Discovery. Yen sampeyan ora ngerti carane nindakake, sampeyan bisa maca babagan kene.
3: Nglumpukake gambar nganggo konfigurasi kanggo OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Extract saka bagean ELF kanggo ditulis kanggo QSPI kanggo 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

Ana skrip ing direktori conf sing nindakake iki, supaya sampeyan bisa mbukak

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

5: Nggunakake tftp, download qspi.bin.bin menyang QSPI flash drive. Ing host, kanggo nindakake iki, nyalin qspi.bin menyang folder root saka server tftp (biasane / srv / tftp / utawa / var / lib / tftpboot /; paket kanggo server sing cocog kasedhiya ing distribusi paling populer, biasane disebut tftpd utawa tftp-hpa, kadhangkala sampeyan kudu nindakake systemctl start tftpd.service kanggo miwiti).

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

Ing Embox (yaiku ing bootloader), sampeyan kudu nglakokake printah ing ngisor iki (kita nganggep yen server duwe alamat 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Kanthi printah goto sampeyan kudu "mlumpat" menyang memori QSPI. Lokasi tartamtu bakal beda-beda gumantung carane gambar disambung, sampeyan bisa ndeleng alamat iki karo printah mem 0x90000000 (alamat wiwitan cocog karo tembung 32-bit gambar sing kapindho); sampeyan uga kudu flag tumpukan -s, alamat tumpukan ana ing 0x90000000, contone:

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

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

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

7: ucul

    embox> edges 20

lan seneng search wates 40 detik πŸ™‚

Yen ana masalah - nulis masalah ing gudang kita, utawa menyang mailing list [email dilindhungi], utawa ing komentar kene.

Source: www.habr.com

Add a comment