OpenCV in STM32F7-Inventionis

OpenCV in STM32F7-Inventionis Ego sum unus ex developers ratio operativae Emboxet in hoc articulo loquar quomodo discurram OpenCV in tabula STM32746G.

Si aliquid simile "OpenCV in STM32 tabula" in machinam quaerere, satis paucos invenire potes qui in hac bibliotheca uti in tabulas STM32 vel aliis microcontrolers.
Plures notae sunt quae, nomine iudicantes, demonstrare debent quid opus sit, sed plerumque (in omnibus formis quas vidi) in tabula STM32, solum imago e camera recepta est et eventus in scrinio monstrabatur; et ipsa imago processus vel in computatro regulari vel in tabulis potioribus fiebat (exempli gratia Raspberry Pi).

Cur difficile est?

Favor investigationis quaerendi ex eo explicatur quod OpenCV est maxime popularis bibliothecae visionis computatricis, quae significat plures tincidunt familiares esse, et facultas decurrendi in codicem desktop-paratum in microcontroller progressionis processum valde simpliciorem reddit. Sed cur adhuc nullae mixturis popularibus paratis ad hanc solvendam quaestionem?

Problema usus OpenCV in linteolis parvis ad duas lineas refertur:

  • Si bibliothecam vel minimam modulorum seriem componas, simpliciter non convenit in memoria mico eiusdem STM32F7Discovery (etiam neglecto OS) ex amplissimo codice (plurium praeceptorum megabytarum)
  • Bibliotheca ipsa in C ++ scripta est, id est
    • Auxilio ad opus positivum runtime (exceptiones, etc.)
    • Parva subsidia pro LibC/Posix, quae plerumque in OS pro systematis embedded invenitur - vexillum plus bibliotheca debes et vexillum STL template bibliothecae (vector, etc.)

Tueretur ad Embox

Ut solet, antequam aliqua programmata ad systema operativam ferat, utilem est eam aedificare in forma qua id tincidunt intendit. In nostro casu nullae difficultates cum hoc - fonte codice reperiri possunt github, bibliotheca sub GNU/Linux cum cmake solito aedificata.

Bonus nuntius est OpenCV ut bibliothecam static e cista aedificari posse, quae facilius portari facit. Bibliothecam cum signo config colligimus et vide quantum spatii capiant. Quisque modulus in singula bibliotheca colligitur.

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

Ut videre potes ex linea ultima, .bss et .data non multum spatium capiunt, sed signum est plus quam 70 MiB. Patet quod si haec cum applicatione specificis immobiliter coniungitur, signum minus fiet.

Tot modulos quam maxime ejicere conemur ut minimum exemplum colligatur (quod, exempli gratia, in versione OpenCV simpliciter outputo), sic inspicimus. cmake .. -LA et averte omnia quae versatur in bene.

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

Altera ex parte, unus tantum est bibliothecae modulus, altera vero manu, hoc ipsum sine compilator optimizationis pro codici magnitudine.-Os). ~3 MiB e codice adhuc multum est, sed jam spem victoriae dat.

Curre ad aemulum

Facilius est emulatorem debugo, primum fac ut bibliotheca qemu operetur. Cum suggestum aemulatum elegi Integrator / CP, quia Primum est etiam ARM, secundo, Embox graphice output pro hoc suggestu sustinet.

Embox mechanismum habet ad bibliothecas externas aedificandas, eam utendo addimus OpenCV moduli (praetereuntes eadem omnia bene pro "minimis" fabricandis in forma bibliothecarum staticarum), postea addo simplici applicatione quae similis est:

version.cpp:

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

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

    return 0;
}

Rationem convenimus, eam currite - expectatum output obtinemus.

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

Proximum est exemplum currere, potius unum e signis ab ipsis tincidunt oblatum. in locum tuum. elegi terminus detector canny.

Exemplum leviter rescriptum erat ut imaginem ostenderet cum effectu directo in indice quiddam. Me id facere, nam. officium imshow() imagines per QT, GTK et Fenestras interfaces haurire possunt, quae utique in config pro STM32 non erunt. Re quidem vera, QT etiam in STM32F7 Inventionis currere potest, sed hoc in alio articulo agetur.

Post brevem declarationem in qua forma effectus in ore detectoris reponitur, imaginem consequimur.

OpenCV in STM32F7-Inventionis

original picture

OpenCV in STM32F7-Inventionis

exitum

Running on STM32F7Discovery

In 32F746GDISCOVERY plures sunt sectiones memoriae hardware quae uno modo uti possumus

  1. 320KiB RAM
  2. 1MiB mico ad imaginem
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. microSD card socors

Cardo SD adhiberi potest ad imagines reponendas, sed in contextu minimi exempli currit, hoc non est valde utile.
Ostentatio resolutionem 480Γ—272 habet, quod significat fabricatorem memoriam fore 522 bytes in profunditate 240 bitarum, i.e. hoc maius est quam magnitudo RAM, sic compago et acervus (quod requiretur, etiam pro OpenCV, ut notitias imaginum et structurarum auxiliarium congregem) in SDRAM collocabuntur, reliqua omnia (memoria in acervos et alia necessitates systematis. ad RAM ibit .

Si minimum config pro STM32F7Discovery (proice retia integra, omnia mandata, acervos quam minimum fac, etc.) et cum exemplis ibi OpenCV adde, memoria inquisita erit hoc modo:

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

Iis qui non sunt familiariter, quibus sectiones vadant, dicam: in .text ΠΈ .rodata instructiones et constantes (dure loquendo, readonly data) iacent .data notitia mutabilis est; .bss exstant variabiles "nullae", quae tamen loco egent (hoc capitulum "ibit" ad RAM.

Bonus nuntius est .data/.bss oportet, sed .text malum est quod solum 1MiB memoriae pro imagine. Potest eici .text tabula ab exemplo et lege eam, exempli gratia, ex SD card in memoriam in satus, sed fruit.png de 330KiB gravat, sic hanc quaestionem non solvet: maxime. .text consistit in codice OpenCV.

Per et magna, una tantum res superest - partemque codicis in QSPI mico oneratam (habet specialem modum operandi ad memoriam destinata ad bus systematis, ut processus huic notitiae directe accedere possit). In hoc casu quaestio oritur: primo, memoria mico coegi QSPI praesto non est statim postquam machinam rebooted (degesto modo initialize seorsim scientificam praeformatam), et deinde, "mico" hanc memoriam non potes. nota bootloader.

Quam ob rem placuit omnia codicem in QSPI coniungi et illud cum oneratus auto-scriptis fulgere qui debitam binariam per TFTP accipiet.

exitum

Idea huius bibliothecae ad Embox portum ante annum circiter apparuit, sed iterum atque iterum ob varias causas dilata est. Una earum est adminiculum pro libstdc ++ et regulae bibliothecae templates. Problema de C++ auxilio in Embox extra ambitum huius articuli est, ideo hic tantum dicam nos egisse ut hoc subsidium in ius moles huic bibliothecae assequi debeamus.

In fine, superatae sunt difficultates (saltem satis pro exemplo operis OpenCV), et exemplum cucurrit. Longa secunda 40 tabula accipit pro limitibus quaerendis colum Canny utendo. Quod quidem nimis longum est (considerationes sunt ad optimize rem hanc, de hac re singulari articulo scribere poterit).

OpenCV in STM32F7-Inventionis

Attamen finis medius erat prototypum creare, quod ostendet fundamentalem facultatem discurrendi OpenCV in STM32, respective, hic finis consecutus est, euge!

t, dr: paulatim instructiones

0: Download Fontes Embox, sic:

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

1: Initium colligendo bootloader quod "mico" a QSPI mico coegi.

    make confload-arm/stm32f7cube

Nunc eget ipsum enim. Imaginem imposuisti per TFTP. Ad tabulam et exercitum IP inscriptiones ponendas, opus conf/rootfs/retis emendare debes.

Exemplum figurationis:

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 β€” hospes inscriptio unde imago onerata erit; address β€” Inscriptio tabulae.

Deinde colligemus bootloader;

    make

2: Sollemne onerationis bootloader (contristati pun) in tabula - nihil hic specificum est, necesse est ut alia applicationis STM32F7Discovery facere velis. Si id facere nescis, de illo legere potes hic.
3: Congero imaginem cum config ad OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Extract ex sectionibus ELF scribendis ad QSPI ad 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

Scriptum est in directorio conf quod hoc facit, sic currere potes

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

V: Usura tftp, download qspi.bin.bin ad QSPI mico coegi. In exercitu hoc facere, effingo qspi.bin ad radicem folder tftp server (plerumque /srv/tftp/ vel /var/lib/tftpboot/; fasciculi pro servo respondenti praesto sunt in plerisque distributionibus popularibus, quae vulgo vocantur. tftpd vel tftp-hpa, interdum tibi facere systemctl start tftpd.service incipere).

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

In Embox (i.e. in bootloader), debes exsequi mandatum sequens (supponitur quod servo inscriptionem habet 192.168.2.1);

    embox> qspi_loader qspi.bin 192.168.2.1

VI: Cum imperio goto debes "salire" in QSPI memoriam. Locus specificus variabit secundum quod imago coniungitur, hanc cum mandato videre potes mem 0x90000000 (inscriptio incipit in secundo 32-bit verbo imaginis); vos quoque postulo ut vexillum ACERVUS -s, ACERVUS inscriptio est ad 0x90000000, exemplum:

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

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

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

7: Duc

    embox> edges 20

et frui XL-secundo terminus quaerere

Si aliquid it iniuriam - scribe in exitus repositioAut ad list [Inscriptio protected]aut in comment.

Source: www.habr.com