Jien wieħed mill-iżviluppaturi tas-sistema operattiva
Jekk ttajpja xi ħaġa bħal "OpenCV fuq bord STM32" f'magna ta 'riċerka, tista' ssib pjuttost ftit nies li huma interessati li jużaw din il-librerija fuq bordijiet STM32 jew mikrokontrolluri oħra.
Hemm diversi vidjows li, meta wieħed jiġġudika mill-isem, għandhom juru x'inhu meħtieġ, iżda ġeneralment (fil-videos kollha li rajt) fuq il-bord STM32, l-immaġni biss waslet mill-kamera u r-riżultat intwera fuq l-iskrin, u l-ipproċessar tal-immaġni innifsu sar jew fuq kompjuter regolari, jew fuq bordijiet aktar b'saħħithom (per eżempju, Raspberry Pi).
Għaliex huwa diffiċli?
Il-popolarità tal-mistoqsijiet tat-tiftix hija spjegata mill-fatt li OpenCV hija l-aktar librerija tal-viżjoni tal-kompjuter popolari, li jfisser li aktar żviluppaturi huma familjari magħha, u l-abbiltà li tħaddem kodiċi lest għad-desktop fuq mikrokontrollur tissimplifika ħafna l-proċess ta 'żvilupp. Imma għaliex għad m'hemmx riċetti popolari lesti biex issolvi din il-problema?
Il-problema ta 'l-użu ta' OpenCV fuq xalel żgħar hija relatata ma 'żewġ karatteristiċi:
- Jekk tikkompila l-librerija anke b'sett minimu ta 'moduli, sempliċement mhux se tidħol fil-memorja flash ta' l-istess STM32F7Discovery (anke mingħajr ma tqis l-OS) minħabba kodiċi kbir ħafna (diversi megabytes ta 'struzzjonijiet)
- Il-librerija nnifisha hija miktuba f'C++, li jfisser
- Jeħtieġ appoġġ għal runtime pożittiv (eċċezzjonijiet, eċċ.)
- Ftit appoġġ għal LibC/Posix, li normalment jinstab f'OS għal sistemi inkorporati - għandek bżonn librerija standard plus u librerija standard tal-mudelli STL (vettur, eċċ.)
Porting għal Embox
Bħas-soltu, qabel ma tittrasferixxi xi programmi fis-sistema operattiva, hija idea tajba li tipprova tibnih fil-forma li biha l-iżviluppaturi ħasbuha. Fil-każ tagħna, m'hemm l-ebda problemi ma 'dan - il-kodiċi tas-sors jista' jinstab fuq
L-aħbar tajba hija li OpenCV jista 'jinbena bħala librerija statika barra mill-kaxxa, li tagħmel il-porting aktar faċli. Niġbru librerija b'konfigurazzjoni standard u naraw kemm jieħdu spazju. Kull modulu jinġabar f'librerija separata.
> 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)
Kif tistgħu taraw mill-aħħar linja, .bss u .data ma jieħdux ħafna spazju, iżda l-kodiċi huwa aktar minn 70 MiB. Huwa ċar li jekk dan ikun marbut b'mod statiku ma' applikazzjoni speċifika, il-kodiċi se jsir inqas.
Ejja nippruvaw tarmi kemm jista' jkun moduli sabiex jiġi mmuntat eżempju minimu (li, pereżempju, sempliċement joħroġ il-verżjoni OpenCV), għalhekk inħarsu cmake .. -LA
u itfi fl-għażliet dak kollu li jintefa.
-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)
Min-naħa waħda, dan huwa modulu wieħed biss tal-librerija, min-naħa l-oħra, dan huwa mingħajr ottimizzazzjoni tal-kompilatur għad-daqs tal-kodiċi (-Os
). ~ 3 MiB ta 'kodiċi għadu pjuttost ħafna, iżda diġà jagħti tama għas-suċċess.
Mexxi fl-emulator
Huwa ħafna aktar faċli biex tiddibaggja fuq l-emulator, għalhekk l-ewwel kun żgur li l-librerija taħdem fuq qemu. Bħala pjattaforma emulata, għażilt Integrator / CP, għaliex l-ewwelnett, huwa wkoll ARM, u t-tieni, Embox jappoġġja l-output tal-grafika għal din il-pjattaforma.
Embox għandu mekkaniżmu għall-bini ta 'libreriji esterni, billi tużah inżidu OpenCV bħala modulu (li jgħaddi l-istess għażliet kollha għall-bini "minimu" fil-forma ta' libreriji statiċi), wara nżid applikazzjoni sempliċi li tidher bħal din:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Aħna niġbru s-sistema, imexxuha - niksbu l-output mistenni.
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 включены в сборку и т.п.>
Il-pass li jmiss huwa li tmexxi xi eżempju, preferibbilment wieħed minn dawk standard offruti mill-iżviluppaturi nfushom.
L-eżempju kellu jiġi kemmxejn miktub mill-ġdid biex juri l-immaġni bir-riżultat direttament fil-frejm buffer. Kelli nagħmel dan, għax. funzjoni imshow()
jista 'jiġbed immaġini permezz tal-interfaces QT, GTK u Windows, li, ovvjament, żgur mhux se jkunu fil-konfigurazzjoni għal STM32. Fil-fatt, QT jista' jitħaddem ukoll fuq STM32F7Discovery, iżda dan se jiġi diskuss f'artiklu ieħor 🙂
Wara kjarifika qasira f'liema format huwa maħżun ir-riżultat tad-ditekter tat-tarf, aħna nġibu immaġni.
stampa oriġinali
Riżultat
Tħaddim fuq STM32F7Discovery
Fuq 32F746GDISCOVERY hemm diversi sezzjonijiet tal-memorja tal-ħardwer li nistgħu nużaw b'xi mod jew ieħor
- 320KiB RAM
- 1MiB flash għall-immaġni
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- slot tal-karta microSD
Kard SD tista 'tintuża biex taħżen immaġini, iżda fil-kuntest tat-tmexxija ta' eżempju minimu, dan mhux utli ħafna.
Il-wiri għandu riżoluzzjoni ta '480 × 272, li jfisser li l-memorja framebuffer se tkun 522 bytes f'fond ta' 240 bit, i.e. dan huwa aktar mid-daqs ta 'RAM, għalhekk il-framebuffer u l-borġ (li se jkunu meħtieġa, inkluż għal OpenCV, biex jaħżnu dejta għal immaġini u strutturi awżiljarji) se jkunu jinsabu f'SDRAM, kull ħaġa oħra (memorja għal munzelli u ħtiġijiet oħra tas-sistema ) se jmorru għal RAM .
Jekk nieħdu l-konfigurazzjoni minima għal STM32F7Discovery (armi n-netwerk kollu, il-kmandi kollha, nagħmlu munzelli żgħar kemm jista 'jkun, eċċ.) u żid OpenCV b'eżempji hemmhekk, il-memorja meħtieġa tkun kif ġej:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Għal dawk li ma tantx huma familjari ma’ liema sezzjonijiet imorru fejn, se nispjega: in .text
и .rodata
istruzzjonijiet u kostanti (bejn wieħed u ieħor, data readonly) jinsabu fihom .data
id-data hija mutevoli, .bss
hemm varjabbli "nullati", li, madankollu, jeħtieġu post (din it-taqsima "jmur" għar-RAM).
L-aħbar tajba hija li .data
/.bss
għandu joqgħod, iżda ma .text
l-inkwiet huwa li hemm biss 1MiB ta 'memorja għall-immaġni. Jista 'jintrema' l barra .text
l-istampa mill-eżempju u aqraha, pereżempju, mill-karta SD fil-memorja fl-istartjar, iżda fruits.png jiżen madwar 330KiB, għalhekk dan mhux se jsolvi l-problema: l-aktar .text
tikkonsisti mill-kodiċi OpenCV.
B'mod ġenerali, fadal biss ħaġa waħda - it-tagħbija ta 'parti mill-kodiċi fuq flash QSPI (għandha mod speċjali ta' operazzjoni għall-immappjar tal-memorja max-xarabank tas-sistema, sabiex il-proċessur ikun jista 'jaċċessa din id-dejta direttament). F'dan il-każ, tqum problema: l-ewwelnett, il-memorja ta 'flash drive QSPI mhix disponibbli immedjatament wara li l-apparat jerġa' jinbeda (jeħtieġ li tinizjalizza separatament il-modalità mappjata bil-memorja), u t-tieni, ma tistax "flash" din il-memorja b' bootloader familjari.
Bħala riżultat, ġie deċiż li torbot il-kodiċi kollu f'QSPI, u jteptgħa b'loader miktub minnu nnifsu li jirċievi l-binarju meħtieġ permezz ta 'TFTP.
Riżultat
L-idea li din il-librerija tiġi portjata għall-Embox dehret madwar sena ilu, iżda għal darb'oħra ġiet posposta minħabba diversi raġunijiet. Waħda minnhom hija l-appoġġ għal libstdc++ u l-librerija tal-mudelli standard. Il-problema tal-appoġġ C++ f'Embox hija lil hinn mill-ambitu ta 'dan l-artikolu, għalhekk hawn ngħid biss li rnexxielna niksbu dan l-appoġġ fl-ammont it-tajjeb biex din il-librerija taħdem 🙂
Fl-aħħar, dawn il-problemi ġew megħluba (mill-inqas biżżejjed biex l-eżempju OpenCV jaħdem), u l-eżempju dam. Huwa jieħu 40 sekonda twila biex il-bord ifittex il-konfini bl-użu tal-filtru Canny. Dan, ovvjament, huwa twil wisq (hemm kunsiderazzjonijiet dwar kif tiġi ottimizzata din il-kwistjoni, ikun possibbli li tikteb artiklu separat dwar dan f'każ ta 'suċċess).
Madankollu, l-għan intermedju kien li jinħoloq prototip li se juri l-possibbiltà fundamentali li titħaddem OpenCV fuq STM32, rispettivament, dan l-għan intlaħaq, hooray!
tl;dr: struzzjonijiet pass pass
0: Niżżel is-sorsi tal-Embox, bħal dan:
git clone https://github.com/embox/embox && cd ./embox
1: Nibdew billi nimmuntaw bootloader li se "flash" flash drive QSPI.
make confload-arm/stm32f7cube
Issa għandek bżonn tikkonfigura n-netwerk, għaliex. Aħna se ntellgħu l-immaġni permezz ta 'TFTP. Biex tissettja l-indirizzi IP tal-bord u tal-host, trid teditja l-conf/rootfs/network.
Eżempju ta' konfigurazzjoni:
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
- indirizz tal-host minn fejn l-immaġni se titgħabba, address
- indirizz tal-bord.
Wara dan, niġbru l-bootloader:
make
2: It-tagħbija tas-soltu tal-bootloader (jiddispjaċina għall-pun) fuq il-bord - m'hemm xejn speċifiku hawn, għandek bżonn tagħmel dan bħal għal kwalunkwe applikazzjoni oħra għal STM32F7Discovery. Jekk ma tafx kif tagħmel dan, tista 'taqra dwarha
3: Kumpilazzjoni ta 'immaġni b'konfigurazzjoni għal OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Estratt mit-taqsimiet ELF li għandu jinkiteb lil QSPI għal 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
Hemm skript fid-direttorju tal-konf li jagħmel dan, sabiex tkun tista' tmexxiha
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Billi tuża tftp, niżżel qspi.bin.bin fuq flash drive QSPI. Fuq il-host, biex tagħmel dan, ikkupja qspi.bin fil-folder tal-għeruq tas-server tftp (ġeneralment /srv/tftp/ jew /var/lib/tftpboot/; pakketti għas-server korrispondenti huma disponibbli fil-biċċa l-kbira tad-distribuzzjonijiet popolari, normalment imsejħa tftpd jew tftp-hpa, xi kultant ikollok tagħmel systemctl start tftpd.service
tibda).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Fuq Embox (jiġifieri fil-bootloader), trid tesegwixxi l-kmand li ġej (nassumu li s-server għandu l-indirizz 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Bil-kmand goto
għandek bżonn "taqbeż" fil-memorja QSPI. Il-post speċifiku jvarja skond kif l-immaġni hija marbuta, tista 'tara dan l-indirizz mal-kmand mem 0x90000000
(l-indirizz tal-bidu jidħol fit-tieni kelma ta' 32 bit tal-immaġni); ser ikollok bżonn ukoll li jimmarka l-munzell -s
, l-indirizz tal-munzell huwa f'0x90000000, eżempju:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Tnedija
embox> edges 20
u gawdi t-tfittxija tal-fruntiera ta' 40 sekonda 🙂
Jekk xi ħaġa tmur ħażin - ikteb kwistjoni fi
Sors: www.habr.com