Esmu viens no operÄtÄjsistÄmas izstrÄdÄtÄjiem
Ja meklÄtÄjprogrammÄ ierakstÄt kaut ko lÄ«dzÄ«gu āOpenCV uz STM32 platesā, jÅ«s varat atrast diezgan daudz cilvÄku, kuri ir ieinteresÄti izmantot Å”o bibliotÄku uz STM32 plates vai citiem mikrokontrolleriem.
Ir vairÄki video, kuriem, spriežot pÄc nosaukuma, vajadzÄtu demonstrÄt to, kas ir nepiecieÅ”ams, bet parasti (visos videoklipos, kurus es redzÄju) uz STM32 dÄļa tika saÅemts tikai attÄls no kameras un rezultÄts tika parÄdÄ«ts ekrÄnÄ, un pati attÄlu apstrÄde tika veikta vai nu uz parastÄ datora, vai uz jaudÄ«gÄkÄm platÄm (piemÄram, Raspberry Pi).
KÄpÄc tas ir grÅ«ti?
MeklÄÅ”anas vaicÄjumu popularitÄte tiek skaidrota ar to, ka OpenCV ir vispopulÄrÄkÄ datora redzes bibliotÄka, kas nozÄ«mÄ, ka ar to ir iepazinuÅ”ies vairÄk izstrÄdÄtÄju, turklÄt iespÄja palaist darbvirsmai gatavu kodu mikrokontrollerÄ ievÄrojami vienkÄrÅ”o izstrÄdes procesu. Bet kÄpÄc joprojÄm nav populÄru gatavu recepÅ”u Ŕīs problÄmas risinÄÅ”anai?
OpenCV izmantoÅ”anas problÄma uz maziem Å”allÄm ir saistÄ«ta ar divÄm funkcijÄm:
- Ja apkopojat bibliotÄku pat ar minimÄlu moduļu komplektu, tÄ vienkÄrÅ”i neietilps tÄ paÅ”a STM32F7Discovery zibatmiÅÄ (pat neÅemot vÄrÄ operÄtÄjsistÄmu) ļoti liela koda dÄļ (vairÄki instrukciju megabaiti)
- Pati bibliotÄka ir rakstÄ«ta C++ valodÄ, kas nozÄ«mÄ
- NepiecieÅ”ams atbalsts pozitÄ«vam izpildlaikam (izÅÄmumi utt.)
- Neliels atbalsts LibC/Posix, kas parasti ir atrodams iegulto sistÄmu operÄtÄjsistÄmÄs - jums ir nepiecieÅ”ama standarta plus bibliotÄka un standarta STL veidÅu bibliotÄka (vektors utt.)
PÄrneÅ”ana uz Embox
KÄ parasti, pirms jebkuru programmu pÄrneÅ”anas uz operÄtÄjsistÄmu, ieteicams mÄÄ£inÄt to izveidot tÄdÄ formÄ, kÄdÄ izstrÄdÄtÄji to bija iecerÄjuÅ”i. MÅ«su gadÄ«jumÄ ar to nav nekÄdu problÄmu - avota kodu var atrast vietnÄ
LabÄ ziÅa ir tÄ, ka OpenCV var izveidot kÄ statisku bibliotÄku, kas atvieglo pÄrneÅ”anu. MÄs apkopojam bibliotÄku ar standarta konfigurÄciju un redzam, cik daudz vietas tÄs aizÅem. Katrs modulis ir apkopots atseviÅ”Ä·Ä bibliotÄkÄ.
> 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)
KÄ redzat no pÄdÄjÄs rindas, .bss un .data neaizÅem daudz vietas, bet kods ir lielÄks par 70 MiB. Ir skaidrs, ka, ja tas ir statiski saistÄ«ts ar konkrÄtu lietojumprogrammu, kods kļūs mazÄks.
MÄÄ£inÄsim izmest pÄc iespÄjas vairÄk moduļu, lai tiktu samontÄts minimÄls piemÄrs (kas, piemÄram, vienkÄrÅ”i izvadÄ«s OpenCV versiju), tÄpÄc skatÄmies cmake .. -LA
un izslÄdziet opcijÄs visu, kas izslÄdzas.
-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)
No vienas puses, tas ir tikai viens bibliotÄkas modulis, no otras puses, tas ir bez kompilatora optimizÄcijas koda izmÄram (-Os
). ~3 MiB koda vÄl ir diezgan daudz, bet jau dod cerÄ«bu uz panÄkumiem.
Palaist emulatorÄ
EmulatorÄ ir daudz vieglÄk atkļūdot, tÄpÄc vispirms pÄrliecinieties, vai bibliotÄka darbojas qemu. KÄ emulÄtu platformu es izvÄlÄjos Integrator / CP, jo pirmkÄrt, tas ir arÄ« ARM, un, otrkÄrt, Embox atbalsta grafikas izvadi Å”ai platformai.
Embox ir ÄrÄjo bibliotÄku veidoÅ”anas mehÄnisms, izmantojot to, mÄs pievienojam OpenCV kÄ moduli (nododot visas tÄs paÅ”as opcijas "minimÄlajai" veidoÅ”anai statisko bibliotÄku veidÄ), pÄc tam pievienoju vienkÄrÅ”u lietojumprogrammu, kas izskatÄs Å”Ädi:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
MÄs saliekam sistÄmu, palaižam to - mÄs iegÅ«stam gaidÄ«to rezultÄtu.
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 Š²ŠŗŠ»ŃŃŠµŠ½Ń Š² ŃŠ±Š¾ŃŠŗŃ Šø Ń.Šæ.>
NÄkamais solis ir palaist kÄdu piemÄru, vÄlams kÄdu no standarta, ko piedÄvÄ paÅ”i izstrÄdÄtÄji.
PiemÄrs bija nedaudz jÄpÄrraksta, lai parÄdÄ«tu attÄlu ar rezultÄtu tieÅ”i kadru buferÄ«. Man tas bija jÄdara, jo. funkciju imshow()
var zÄ«mÄt attÄlus caur QT, GTK un Windows saskarnÄm, kas, protams, noteikti nebÅ«s STM32 konfigurÄcijÄ. Faktiski QT var palaist arÄ« STM32F7Discovery, taÄu tas tiks apspriests citÄ rakstÄ š
PÄc Ä«sa precizÄjuma, kÄdÄ formÄtÄ tiek saglabÄts malu detektora rezultÄts, iegÅ«stam attÄlu.
oriÄ£inÄlÄ bilde
PiedzÄ«vojiet efektÄ«vu rezultÄtu spÄku
Darbojas ar STM32F7Discovery
VietnÄ 32F746GDISCOVERY ir vairÄkas aparatÅ«ras atmiÅas sadaļas, kuras mÄs varam izmantot vienÄ vai otrÄ veidÄ
- 320 KiB RAM
- 1 MiB zibspuldze attÄlam
- 8 MiB SDRAM
- 16 MiB QSPI NAND zibspuldze
- microSD kartes slots
SD karti var izmantot attÄlu glabÄÅ”anai, taÄu minimÄla piemÄra darbÄ«bas kontekstÄ tas nav Ä«paÅ”i noderÄ«gi.
Displeja izŔķirtspÄja ir 480Ć272, kas nozÄ«mÄ, ka kadru bufera atmiÅa bÅ«s 522 240 baiti 32 bitu dziļumÄ, t.i. tas ir vairÄk nekÄ RAM lielums, tÄpÄc kadru buferis un kaudze (kas bÅ«s nepiecieÅ”ama, arÄ« OpenCV, lai saglabÄtu datus attÄliem un palÄ«gstruktÅ«rÄm) atradÄ«sies SDRAM, viss pÄrÄjais (atmiÅa stekiem un citÄm sistÄmas vajadzÄ«bÄm ) pÄries uz RAM .
Ja Åemam STM32F7Discovery minimÄlo konfigurÄciju (izmetam visu tÄ«klu, visas komandas, izveidosim pÄc iespÄjas mazÄkas stekas utt.) un pievienosim tur OpenCV ar piemÄriem, vajadzÄ«gÄ atmiÅa bÅ«s Å”Äda:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Tiem, kuri nav īpaŔi pazīstami ar to, kuras sadaļas kurp iet, paskaidroŔu: in .text
Šø .rodata
instrukcijas un konstantes (rupji runÄjot, tikai lasÄmie dati) slÄpjas .data
dati ir mainīgi, .bss
ir "nulled" mainÄ«gie, kuriem tomÄr ir nepiecieÅ”ama vieta (Ŕī sadaļa "iet" uz RAM).
LabÄ ziÅa ir tÄ .data
/.bss
vajadzÄtu derÄt, bet ar .text
problÄma ir tÄ, ka attÄlam ir tikai 1 MiB atmiÅas. Var izmest .text
attÄlu no piemÄra un palasiet to, piemÄram, no SD kartes atmiÅÄ startÄÅ”anas laikÄ, bet fruits.png sver aptuveni 330KiB, tÄpÄc tas neatrisinÄs problÄmu: lielÄkÄ daļa .text
sastÄv no OpenCV koda.
Pa lielam atliek tikai viena lieta - koda daļas ielÄde QSPI zibatmiÅÄ (tam ir Ä«paÅ”s darbÄ«bas režīms atmiÅas kartÄÅ”anai sistÄmas kopnÄ, lai procesors varÄtu tieÅ”i piekļūt Å”iem datiem). Å ajÄ gadÄ«jumÄ rodas problÄma: pirmkÄrt, QSPI zibatmiÅas diska atmiÅa nav pieejama uzreiz pÄc ierÄ«ces pÄrstartÄÅ”anas (jums ir atseviŔķi jÄinicializÄ atmiÅas kartÄÅ”anas režīms), un, otrkÄrt, Å”o atmiÅu nevar āzibspuldziā ar pazÄ«stams bootloader.
RezultÄtÄ tika nolemts saistÄ«t visu kodu QSPI, un flash to ar paÅ”rakstÄ«tu ielÄdÄtÄju, kas saÅems nepiecieÅ”amo binÄro, izmantojot TFTP.
PiedzÄ«vojiet efektÄ«vu rezultÄtu spÄku
Ideja Å”o bibliotÄku pÄrnest uz Embox radÄs aptuveni pirms gada, taÄu atkal un atkal dažÄdu iemeslu dÄļ tika atlikta. Viens no tiem ir atbalsts libstdc++ un standarta veidÅu bibliotÄkai. C++ atbalsta problÄma Embox ir Ärpus Ŕī raksta darbÄ«bas jomas, tÄpÄc Å”eit es teikÅ”u tikai to, ka mums izdevÄs panÄkt Å”o atbalstu pareizajÄ apjomÄ, lai Ŕī bibliotÄka darbotos š
Galu galÄ Å”Ä«s problÄmas tika pÄrvarÄtas (vismaz pietiekami, lai OpenCV piemÄrs darbotos), un piemÄrs darbojÄs. Tas aizÅem 40 garas sekundes, lai dÄlis meklÄtu robežas, izmantojot filtru Canny. Tas, protams, ir pÄrÄk garÅ” (ir apsvÄrumi, kÄ Å”o lietu optimizÄt, veiksmes gadÄ«jumÄ par to varÄs uzrakstÄ«t atseviŔķu rakstu).
TaÄu starpmÄrÄ·is bija izveidot prototipu, kas parÄdÄ«s principiÄlu OpenCV darbinÄÅ”anas iespÄju uz STM32, attiecÄ«gi Å”is mÄrÄ·is tika sasniegts, urrÄ!
tl;dr: soli pa solim instrukcijas
0: lejupielÄdÄjiet Embox avotus, piemÄram:
git clone https://github.com/embox/embox && cd ./embox
1: SÄksim ar bootloader montÄžu, kas "uzliesmo" QSPI zibatmiÅu.
make confload-arm/stm32f7cube
Tagad jums ir jÄkonfigurÄ tÄ«kls, jo. MÄs augÅ”upielÄdÄsim attÄlu, izmantojot TFTP. Lai iestatÄ«tu plates un resursdatora IP adreses, jÄrediÄ£Ä conf/rootfs/network.
KonfigurÄcijas piemÄrs:
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
- resursdatora adrese, no kuras tiks ielÄdÄts attÄls, address
- valdes adrese.
PÄc tam mÄs savÄcam sÄknÄÅ”anas ielÄdÄtÄju:
make
2: ParastÄ bootloader ielÄde (atvainojos par vÄrdu spÄli) uz tÄfeles - Å”eit nav nekÄ konkrÄta, jums tas jÄdara tÄpat kÄ jebkurai citai STM32F7Discovery lietojumprogrammai. Ja nezinÄt, kÄ to izdarÄ«t, varat izlasÄ«t par to
3: attÄla kompilÄÅ”ana ar OpenCV konfigurÄciju.
make confload-platform/opencv/stm32f7discovery
make
4: izraksts no ELF sadaļÄm, kas jÄieraksta QSPI uz 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
Conf direktorijÄ ir skripts, kas to dara, lai jÅ«s varÄtu to palaist
./conf/qspi_objcopy.sh # ŠŃŠ¶Š½ŃŠ¹ Š±ŠøŠ½Š°ŃŠ½ŠøŠŗ -- build/base/bin/qspi.bin
5. Izmantojot tftp, lejupielÄdÄjiet qspi.bin.bin QSPI zibatmiÅas diskÄ. Lai to izdarÄ«tu, resursdatorÄ kopÄjiet qspi.bin uz tftp servera saknes mapi (parasti /srv/tftp/ vai /var/lib/tftpboot/; atbilstoÅ”Ä servera pakotnes ir pieejamas populÄrÄkajos izplatÄ«jumos, ko parasti sauc tftpd vai tftp-hpa, dažreiz tas ir jÄdara systemctl start tftpd.service
sÄkt).
# Š²Š°ŃŠøŠ°Š½Ń Š“Š»Ń tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# Š²Š°ŃŠøŠ°Š½Ń Š“Š»Ń tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Embox (t.i., sÄknÄÅ”anas ielÄdÄtÄjÄ) ir jÄizpilda Å”Äda komanda (pieÅemam, ka servera adrese ir 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: ar komandu goto
jums "jÄielec" QSPI atmiÅÄ. KonkrÄtÄ vieta mainÄ«sies atkarÄ«bÄ no tÄ, kÄ attÄls ir saistÄ«ts, Å”o adresi varat redzÄt ar komandu mem 0x90000000
(sÄkuma adrese iekļaujas attÄla otrajÄ 32 bitu vÄrdÄ); jums arÄ« vajadzÄs atzÄ«mÄt karodziÅu -s
, kaudzes adrese ir 0x90000000, piemÄram:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
ā ā
ŃŃŠ¾ Š°Š“ŃŠµŃ ŃŃŠ¾ Š°Š“ŃŠµŃ
ŃŃŃŠŗŠ° ŠæŠµŃŠ²Š¾Š¹
ŠøŠ½ŃŃŃŃŠŗŃŠøŠø
embox>goto -i 0x9000c27f -s 0x20023200 # Š¤Š»Š°Š³ -i Š½ŃŠ¶ŠµŠ½ ŃŃŠ¾Š±Ń Š·Š°ŠæŃŠµŃŠøŃŃ ŠæŃŠµŃŃŠ²Š°Š½ŠøŃ Š²Š¾ Š²ŃŠµŠ¼Ń ŠøŠ½ŠøŃŠøŠ°Š»ŠøŠ·Š°ŃŠøŠø ŃŠøŃŃŠµŠ¼Ń
< ŠŠ°ŃŠøŠ½Š°Ń Š¾ŃŃŃŠ“Š° Š±ŃŠ“ŠµŃ Š²ŃŠ²Š¾Š“ Š½Šµ Š·Š°Š³ŃŃŠ·ŃŠøŠŗŠ°, Š° Š¾Š±ŃŠ°Š·Š° Ń OpenCV >
7: palaiŔana
embox> edges 20
un izbaudiet 40 sekunžu robežu meklÄÅ”anu š
Ja kaut kas noiet greizi - ierakstiet problÄmu
Avots: www.habr.com