Ego sum unus ex developers ratio operativae et 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 , bibliotheca sub GNU/ compilata estLinux cum cmake regulari.
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. . elegi .
Exemplum leviter rescriptum erat ut imaginem ostenderet cum effectu directo in indice quiddam. Me id facere, nam. officium imshow() Imagines per QT, GTK et alias interfacies reddere potest Windows, quod, scilicet, in configuratione STM32 non includetur. Re vera, QT etiam in STM32F7Discovery currere potest, sed hoc in alio articulo tractabitur. 🙂
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/emboxIis 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 ./embox1: Initium colligendo bootloader quod "mico" a QSPI mico coegi.
make confload-arm/stm32f7cubeNunc 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:02gateway — hospes inscriptio unde imago onerata erit; address — Inscriptio tabulae.
Deinde colligemus bootloader;
make2: 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
make4: 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=.dataScriptum est in directorio conf quod hoc facit, sic currere potes
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.binV: 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/tftpbootIn 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.1VI: 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 20et frui XL-secundo terminus quaerere
Si aliquid it iniuriam - scribe in exitus ..., vel ad indicem epistularum embox-devel@googlegroups.com, vel in commentariis hic.
Source: www.habr.com
