Ego sum unus ex developers ratio operativae
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
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.
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.
original picture
exitum
Running on STM32F7Discovery
In 32F746GDISCOVERY plures sunt sectiones memoriae hardware quae uno modo uti possumus
- 320KiB RAM
- 1MiB mico ad imaginem
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- 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).
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
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
Source: www.habr.com