Ngingomunye wonjiniyela besistimu yokusebenza
Uma uthayipha okuthi “OpenCV on STM32 board” enjinini yokusesha, ungathola abantu abambalwa abathanda ukusebenzisa le labhulali kumabhodi we-STM32 noma ezinye izilawuli ezincane.
Kunamavidiyo amaningana okufanele, ngokubheka igama, abonise okudingekayo, kodwa ngokuvamile (kuwo wonke amavidiyo engiwabonile) ebhodini le-STM32, isithombe kuphela esatholwa kukhamera futhi umphumela waboniswa esikrinini, futhi ukucutshungulwa kwesithombe ngokwako kwenziwa kukhompyutha evamile, noma kumabhodi anamandla (ngokwesibonelo, i-Raspberry Pi).
Kungani kunzima?
Ukuduma kwemibuzo yosesho kuchazwa ukuthi i-OpenCV ingumtapo wolwazi wekhompyutha odume kakhulu, okusho ukuthi onjiniyela abaningi bajwayelene nayo, kanye nekhono lokusebenzisa ikhodi elungele ideskithophu ku-microcontroller yenza inqubo yokuthuthukiswa ibe lula kakhulu. Kodwa kungani kungakabi bikho izindlela zokupheka ezithandwayo zokuxazulula le nkinga?
Inkinga yokusebenzisa i-OpenCV kumatshali amancane ihlobene nezici ezimbili:
- Uma uhlanganisa umtapo wolwazi ngisho nesethi encane yamamojula, ngeke nje ingene kumemori ekhanyayo ye-STM32F7Discovery efanayo (ngisho ngaphandle kokucabangela i-OS) ngenxa yekhodi enkulu kakhulu (amamegabhayithi ambalwa wemiyalelo)
- Umtapo wezincwadi ngokwawo ubhalwe ngo-C++, okusho ukuthi
- Udinga ukusekelwa ngesikhathi sokusebenza esihle (okuhlukile, njll.)
- Ukusekelwa okuncane kwe-LibC/Posix, evame ukutholakala ku-OS kumasistimu ashumekiwe - udinga umtapo wolwazi ojwayelekile kanye nomtapo wezincwadi ojwayelekile wesifanekiso se-STL (i-vector, njll.)
Ithuthelwa ku-Embox
Njengenjwayelo, ngaphambi kokuthutha noma yiziphi izinhlelo ohlelweni olusebenzayo, kuwumqondo omuhle ukuzama ukuyakha ngendlela abathuthukisi ababehlosile ngayo. Esimweni sethu, azikho izinkinga ngalokhu - ikhodi yomthombo ingatholakala kuyo
Izindaba ezinhle ukuthi i-OpenCV ingakhiwa njengomtapo wezincwadi ongashintshi ebhokisini, okwenza ukuthuthwa kube lula. Siqoqa ilabhulali enokulungiselelwa okujwayelekile futhi sibone ukuthi zithatha isikhala esingakanani. Imojula ngayinye iqoqwa kumtapo wolwazi ohlukile.
> 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)
Njengoba ubona kulayini wokugcina, .bss kanye .data akuthathi isikhala esiningi, kodwa ikhodi ingaphezu kuka-70 MiB. Kuyacaca ukuthi uma lokhu kuxhunywe ngokwezibalo kuhlelo lokusebenza oluthile, ikhodi izoba ncane.
Ake sizame ukulahla amamojula amaningi ngangokunokwenzeka ukuze kuhlanganiswe isibonelo esincane (okuwukuthi, ngokwesibonelo, sizovele sikhiphe inguqulo ye-OpenCV), ngakho sibheka cmake .. -LA
bese uvala kukho konke okucishayo.
-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)
Ngakolunye uhlangothi, lena yimojula eyodwa kuphela yomtapo wolwazi, ngakolunye uhlangothi, lokhu ngaphandle kokwenza kahle komdidiyeli wosayizi wekhodi (-Os
). ~3 MiB yekhodi iseyiningi impela, kodwa isivele isinikeza ithemba lempumelelo.
Gijimani kusilingisi
Kulula kakhulu ukulungisa iphutha kusifanisi, ngakho qala uqiniseke ukuthi umtapo wolwazi usebenza ku-qemu. Njengengxenyekazi efanisiwe, ngikhethe i-Integrator / CP, ngoba okokuqala, iphinde ibe yi-ARM, futhi okwesibili, i-Embox isekela ukuphuma kwezithombe kule nkundla.
I-Embox inomshini wokwakha imitapo yolwazi yangaphandle, siyisebenzisa sengeza i-OpenCV njengemojula (edlula zonke izinketho ezifanayo zokwakhiwa "okuncane" ngesimo semitapo yolwazi emile), ngemuva kwalokho ngingeza uhlelo lokusebenza olulula olubukeka kanjena:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Sihlanganisa uhlelo, silugijime - sithola umphumela olindelekile.
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 включены в сборку и т.п.>
Isinyathelo esilandelayo siwukusebenzisa isibonelo esithile, okungcono esingesinye salezo ezijwayelekile ezinikezwa onjiniyela ngokwabo.
Isibonelo kwakudingeka sibhalwe kabusha kancane ukuze kuboniswe isithombe esinomphumela ngokuqondile kubhafa yozimele. Bekufanele ngenze lokhu, ngoba. umsebenzi imshow()
ingadweba izithombe ngokusebenzisa i-QT, GTK kanye ne-Windows interface, okuyinto, vele, engeke ibe ku-config ye-STM32. Eqinisweni, i-QT ingaphinda iqhutshwe ku-STM32F7Discovery, kodwa lokhu kuzoxoxwa ngakho kwesinye isihloko 🙂
Ngemuva kokucaciswa okufushane ukuthi umphumela womtshina onqenqemeni ugcinwa ngayiphi ifomethi, sithola isithombe.
isithombe sokuqala
Umphumela
Isebenza ku-STM32F7Discovery
Ku-32F746GDISCOVERY kunezigaba ezimbalwa zememori yehadiwe esingazisebenzisa ngendlela eyodwa noma enye.
- 320KiB RAM
- I-1MiB flash yesithombe
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- I-slot yekhadi le-microSD
Ikhadi le-SD lingasetshenziswa ukugcina izithombe, kodwa esimweni sokusebenzisa isibonelo esincane, lokhu akusizi kakhulu.
Isibonisi sinesixazululo se-480 × 272, okusho ukuthi inkumbulo ye-framebuffer izoba ngamabhayithi angu-522 ekujuleni kwamabhithi angu-240, i.e. lokhu kungaphezu kosayizi we-RAM, ngakho-ke i-framebuffer nenqwaba (ezodingeka, kuhlanganise ne-OpenCV, ukugcina idatha yezithombe nezakhiwo ezisizayo) izotholakala ku-SDRAM, yonke enye into (inkumbulo yezitaki nezinye izidingo zesistimu. ) izoya ku-RAM .
Uma sithatha ukulungiselelwa okuncane kwe-STM32F7Discovery (sikhiphe yonke inethiwekhi, yonke imiyalo, senze izitaki zibe zincane ngangokunokwenzeka, njll.) bese sengeza i-OpenCV ngezibonelo lapho, inkumbulo edingekayo izoba kanje:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Kulabo abangazi kahle ukuthi yiziphi izigaba eziya kuphi, ngizochaza: ku .text
и .rodata
imiyalo nama-constants (uma sikhuluma nje, idatha efundwayo kuphela) ilele .data
idatha iyashintsheka, .bss
kukhona okuguquguqukayo "okungenalutho", okuthi, nokho, kudinga indawo (lesi sigaba "sizoya" ku-RAM).
Izindaba ezinhle ukuthi .data
/.bss
kufanele ilingane, kodwa nge .text
Inkinga ukuthi kukhona inkumbulo engu-1MiB kuphela yesithombe. Ingaphonswa ngaphandle .text
isithombe esisuka esibonelweni futhi usifunde, isibonelo, ukusuka ekhadini le-SD ukuya enkumbulweni ekuqaleni, kodwa izithelo.png zinesisindo esingama-330KiB, ngakho lokhu ngeke kuyixazulule inkinga: iningi .text
iqukethe ikhodi ye-OpenCV.
Ngokuvamile, kunento eyodwa kuphela esele - ukulayisha ingxenye yekhodi ku-flash ye-QSPI (inemodi ekhethekile yokusebenza yememori yemephu ebhasini lohlelo, ukuze iphrosesa ikwazi ukufinyelela le datha ngokuqondile). Kulokhu, kuphakama inkinga: okokuqala, inkumbulo ye-flash drive ye-QSPI ayitholakali ngokushesha ngemuva kokuthi idivayisi iqaliswe kabusha (udinga ukuqalisa ngokwehlukana imodi yemephu yememori), futhi okwesibili, awukwazi "ukukhanyisa" le nkumbulo nge. i-bootloader ejwayelekile.
Ngenxa yalokho, kunqunywe ukuxhumanisa yonke ikhodi ku-QSPI, futhi ikhanyise ngesilayishi esizibhalela sona esizothola kanambambili edingekayo nge-TFTP.
Umphumela
Umbono wokuthumela lo mtapo wezincwadi ku-Embox wavela esikhathini esingangonyaka odlule, kodwa kaningi wahlehliswa ngenxa yezizathu ezihlukahlukene. Enye yazo ukusekelwa kwe-libstdc++ kanye nelabhulali yesifanekiso evamile. Inkinga yokusekelwa kwe-C ++ ku-Embox ingaphezu kobubanzi balesi sihloko, ngakho-ke lapha ngizosho kuphela ukuthi sikwazile ukufeza lokhu kusekelwa ngenani elifanele ukuze lomtapo wolwazi usebenze 🙂
Ekugcineni, lezi zinkinga zanqotshwa (okungenani kwanele ukuthi isibonelo se-OpenCV sisebenze), futhi isibonelo sasebenza. Kuthatha imizuzwana engu-40 ubude ukuze ibhodi liseshe imingcele lisebenzisa isihlungi se-Canny. Lokhu, yebo, yinde kakhulu (kukhona ukucatshangelwa mayelana nendlela yokwandisa lolu daba, uzokwazi ukubhala isihloko esihlukile mayelana nalokhu uma kwenzeka uphumelela).
Kodwa-ke, umgomo omaphakathi bekuwukwakha i-prototype ezokhombisa ukuthi kungenzeka yini ukusebenzisa i-OpenCV ku-STM32, ngokulandelana, le nhloso yafinyelelwa, hooray!
tl; dr: imiyalelo yesinyathelo ngesinyathelo
0: Landa imithombo ye-Embox, kanje:
git clone https://github.com/embox/embox && cd ./embox
1: Ake siqale ngokuhlanganisa i-bootloader "ezokhanyisa" i-QSPI flash drive.
make confload-arm/stm32f7cube
Manje udinga ukumisa inethiwekhi, ngoba. Sizolayisha isithombe nge-TFTP. Ukusetha ibhodi namakheli e-IP, udinga ukuhlela i-conf/rootfs/network.
Isibonelo sokumisa:
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
- ikheli lokusingatha lapho isithombe sizolayishwa khona, address
- ikheli lebhodi.
Ngemuva kwalokho, siqoqa i-bootloader:
make
2: Ukulayishwa okujwayelekile kwe-bootloader (ngiyaxolisa nge-pun) ebhodini - akukho lutho oluqondile lapha, udinga ukukwenza njenganoma yiluphi olunye uhlelo lokusebenza lwe-STM32F7Discovery. Uma ungazi ukuthi ukwenze kanjani, ungafunda ngakho
3: Ukuhlanganisa isithombe nesilungiselelo se-OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Khipha ezigabeni ze-ELF kuzobhalelwa i-QSPI ku-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
Kuneskripthi kumkhombandlela we-conf esenza lokhu, ukuze ukwazi ukusisebenzisa
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Usebenzisa i-tftp, landa i-qspi.bin.bin ku-flash drive ye-QSPI. Kumsingathi, ukwenza lokhu, kopisha qspi.bin kufolda yempande yeseva ye-tftp (imvamisa /srv/tftp/ noma /var/lib/tftpboot/; amaphakheji weseva ehambisanayo ayatholakala ekusabalazweni okuthandwa kakhulu, okuvame ukubizwa ngokuthi. tftpd noma tftp-hpa, ngezinye izikhathi kufanele ukwenze systemctl start tftpd.service
ukuqala).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Ku-Emboks (okungukuthi ku-bootloader), udinga ukwenza umyalo olandelayo (sicabanga ukuthi iseva inekheli 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Ngomyalo goto
udinga "ugxume" kumemori ye-QSPI. Indawo ethile izohluka kuye ngokuthi isithombe sixhunywe kanjani, ungabona leli kheli ngomyalo mem 0x90000000
(ikheli lokuqala lingena egameni lesibili le-32-bit lesithombe); uzodinga futhi ukumaka isitaki -s
, ikheli lesitaki liku-0x90000000, isibonelo:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Kwethula
embox> edges 20
futhi ujabulele ukusesha komngcele wamasekhondi angu-40 🙂
Uma kukhona okungahambi kahle - bhala udaba phakathi
Source: www.habr.com