Ndingomnye wabaphuhlisi benkqubo yokusebenza
Ukuba uchwetheza into efana ne "OpenCV kwibhodi ye-STM32" kwi-injini yokukhangela, unokufumana abantu abambalwa abanomdla wokusebenzisa eli thala leencwadi kwiibhodi ze-STM32 okanye ezinye ii-microcontroller.
Kukho iividiyo ezininzi ezinokuthi, ngokugweba igama, zibonise oko kufunekayo, kodwa ngokwesiqhelo (kuzo zonke iividiyo endizibonileyo) kwibhodi ye-STM32, ngumfanekiso kuphela owafunyanwa kwikhamera kwaye umphumo waboniswa esikrinini, kunye nokulungiswa komfanekiso ngokwawo kwenziwa nokuba kwikhompyuter eqhelekileyo, okanye kwiibhodi ezinamandla ngakumbi (umzekelo, iRaspberry Pi).
Kutheni kunzima nje?
Ukuthandwa kwemibuzo yokukhangela kuchazwa yinto yokuba i-OpenCV yeyona ndawo idumileyo yethala leencwadi lombono wekhompyuter, okuthetha ukuba abaphuhlisi abaninzi baqhelene nayo, kunye nokukwazi ukuqhuba ikhowudi elungele idesktop kwi-microcontroller ilula kakhulu inkqubo yophuhliso. Kodwa kutheni kungekabikho iindlela zokupheka ezidumileyo ezisele zenziwe ukusombulula le ngxaki?
Ingxaki yokusebenzisa i-OpenCV kwiitshali ezincinci inxulumene nezinto ezimbini:
- Ukuba uqokelela ithala leencwadi nokuba lineseti encinci yeemodyuli, ayizukungena kwinkumbulo yeflash efanayo STM32F7Discovery (nangaphandle kokuthathela ingqalelo i-OS) ngenxa yekhowudi enkulu kakhulu (iimegabytes ezininzi zemiyalelo)
- Ithala leencwadi ngokwalo libhalwe kwiC ++, oku kuthetha ukuba
- Udinga inkxaso ngexesha elifanelekileyo lokubaleka (ngaphandle, njl.)
- Inkxaso encinci ye-LibC/Posix, edla ngokufumaneka kwi-OS yeenkqubo ezizinzisiweyo - ufuna ithala leencwadi eliqhelekileyo kunye nelayibrari yetemplate ye-STL esemgangathweni (i-vector, njl.)
Ukusiwa kwi-Emboks
Njengesiqhelo, phambi kokuba ukhuphele naziphi na iinkqubo kwinkqubo yokusebenza, luluvo oluhle ukuzama ukuyakha ngohlobo abacebe ngayo abaphuhlisi. Kwimeko yethu, akukho ngxaki ngale nto - ikhowudi yomthombo inokufumaneka
Iindaba ezimnandi zezokuba i-OpenCV inokwakhiwa njengethala leencwadi elingatshintshiyo ngaphandle kwebhokisi, nto leyo eyenza kube lula ukuthwala. Siqokelela ithala leencwadi kunye ne-config esemgangathweni kwaye sibone ukuba bathatha indawo engakanani. Imodyuli nganye iqokelelwa kwithala leencwadi elahlukileyo.
> 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)
Njengoko unokubona kumgca wokugqibela, .bss kunye .data ayithathi indawo enkulu, kodwa ikhowudi ingaphezulu kwe-70 MiB. Kucacile ukuba ukuba oku kudityaniswa ngokwezibalo kwisicelo esithile, ikhowudi iya kuba ncinane.
Masizame ukuphosa ngaphandle iimodyuli ezininzi kangangoko sinako ukuze umzekelo omncinci udityaniswe (okuthi, umzekelo, ukhuphe inguqulelo ye-OpenCV), ngoko sijonge. cmake .. -LA
kwaye ucime kwiinketho zonke ezicimayo.
-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)
Kwelinye icala, le yimodyuli enye kuphela yethala leencwadi, kwelinye icala, oku ngaphandle kolungelelaniso lomqokeleli wobungakanani bekhowudi (-Os
). ~3 MiB yekhowudi iseninzi kakhulu, kodwa sele inika ithemba lempumelelo.
Baleka kwi-emulator
Kulula kakhulu ukulungisa ingxaki kumlinganisi, ngoko ke kuqala qiniseka ukuba ithala leencwadi lisebenza kwiqemu. Njengeqonga elilinganisiweyo, ndakhetha uMhlanganisi / CP, kuba okokuqala, ikwayi-ARM, kwaye okwesibini, i-Embox ixhasa imveliso yemizobo yeli qonga.
I-Embox inomatshini wokwakha amathala eencwadi angaphandle, xa siyisebenzisa songeza i-OpenCV njengemodyuli (idlula zonke iinketho ezifanayo "zobuncinci" bokwakha ngohlobo lwamathala eencwadi amileyo), emva koko ndongeza isicelo esilula esijongeka ngolu hlobo:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Sihlanganisa inkqubo, siyiqhube - sifumana umphumo olindelekileyo.
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 Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠ±ΠΎΡΠΊΡ ΠΈ Ρ.ΠΏ.>
Inyathelo elilandelayo kukuqhuba omnye umzekelo, ngokukhethekayo omnye wemigangatho enikezelwa ngabaphuhlisi ngokwabo.
Umzekelo kwakufuneka ubhalwe ngokutsha kancinane ukubonisa umfanekiso onesiphumo ngokuthe ngqo kwisithinteli sesakhelo. Kwafuneka ndenze oku, ngokuba. umsebenzi imshow()
inokuzoba imifanekiso nge-QT, i-GTK kunye ne-Windows ujongano, leyo, ngokuqinisekileyo, ayiyi kuba kuqwalaselo lwe-STM32. Ngapha koko, i-QT inokuqhutywa kwi-STM32F7Discovery, kodwa oku kuya kuxoxwa kwelinye inqaku π
Emva kokucaciswa okufutshane apho ifomathi isiphumo somtshini we-edge sigcinwa, sifumana umfanekiso.
umfanekiso wokuqala
Isiphumo
Isebenza kwi-STM32F7Discovery
Kwi-32F746GDISCOVERY kukho amacandelo amaninzi ememori yehardware esinokuwasebenzisa ngendlela enye okanye enye.
- 320KiB RAM
- I-1MiB flash yomfanekiso
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- microSD ikhadi slot
Ikhadi le-SD lingasetyenziselwa ukugcina imifanekiso, kodwa kwimeko yokuqhuba umzekelo omncinci, oku akuloncedo kakhulu.
Umboniso unesisombululo se-480 Γ 272, oku kuthetha ukuba imemori ye-framebuffer iya kuba yi-522 bytes kubunzulu be-240 bits, okt. oku kungaphezulu kobukhulu be-RAM, ngoko i-framebuffer kunye nemfumba (eya kufuneka, kubandakanywa ne-OpenCV, ukugcina idatha yemifanekiso kunye nezakhiwo ezincedisayo) ziya kufumaneka kwi-SDRAM, yonke enye into (inkumbulo yeemfumba kunye nezinye iimfuno zenkqubo ) izakuya kwi RAM .
Ukuba sithatha ubuncinci be-config ye-STM32F7Discovery (phonsa yonke inethiwekhi, yonke imiyalelo, yenza izitaki zibe zincinci kangangoko, njl.) kwaye ungeze i-OpenCV ngemizekelo apho, imemori efunekayo iya kuba ngolu hlobo lulandelayo:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Kwabo bangaqhelanga kakhulu ukuba ngawaphi amacandelo aya phi, ndiya kuchaza: ngo .text
ΠΈ .rodata
imiyalelo kunye ne-constants (ukuthetha nje, ukufunda kuphela idatha) ilele kuyo .data
idatha iyatshintsheka, .bss
kukho izinto eziguquguqukayo "ezingenanto", ezithi, nangona kunjalo, zidinga indawo (eli candelo liya "kuya" kwi-RAM).
Iindaba ezimnandi zezokuba .data
/.bss
kufuneka ilingane, kodwa kunye .text
Ingxaki kukuba kukho i-1MiB kuphela yememori yomfanekiso. Ingakhutshelwa ngaphandle .text
umfanekiso osuka kumzekelo kwaye uwufunde, umzekelo, ukusuka kwikhadi le-SD ukuya kwinkumbulo ekuqaleni, kodwa fruit.png inobunzima obumalunga ne-330KiB, ngoko oku akuzukusombulula ingxaki. .text
iqulethe ikhowudi ye-OpenCV.
Ngokubanzi, kukho into enye kuphela eseleyo - ukulayisha inxalenye yekhowudi kwi-flash ye-QSPI (inendlela ekhethekileyo yokusebenza kwimemori yemephu kwibhasi yenkqubo, ukwenzela ukuba iprosesa ikwazi ukufikelela kule datha ngokuthe ngqo). Kule meko, kuvela ingxaki: okokuqala, imemori ye-flash drive ye-QSPI ayifumaneki ngoko nangoko emva kokuba isixhobo siqaliswe ngokutsha (kufuneka uqalise ngokwahlukeneyo imowudi yemephu yememori), kwaye okwesibini, awukwazi "ukukhanyisa" le memori nge. i-bootloader eqhelekileyo.
Ngenxa yoko, kwagqitywa ekubeni idibanise yonke ikhowudi kwi-QSPI, kwaye iyidanyazise ngomlayishi ozibhalayo oza kufumana ibhinari efunekayo nge-TFTP.
Isiphumo
Umbono wokufaka eli thala leencwadi kwi-Embox uvele malunga nonyaka odlulileyo, kodwa ngokuphindaphindiweyo wahlehliswa ngenxa yezizathu ezahlukeneyo. Enye yazo yinkxaso ye-libstdc++ kunye nelayibrari yetemplate eqhelekileyo. Ingxaki yenkxaso ye-C ++ kwi-Embox ingaphaya komgangatho weli nqaku, ngoko apha ndiza kuthetha kuphela ukuba sikwazi ukufezekisa le nkxaso kwixabiso elifanelekileyo ukuze le layibrari isebenze π
Ekugqibeleni, ezi ngxaki zoyiswa (ubuncinane ngokwaneleyo ukuba umzekelo we-OpenCV usebenze), kwaye umzekelo wabaleka. Kuthatha imizuzwana engama-40 ukuba ibhodi ikhangele imida isebenzisa isihluzo seCanny. Oku, ngokuqinisekileyo, kukude kakhulu (kukho ingqwalasela malunga nendlela yokwandisa lo mbandela, kuya kwenzeka ukuba ubhale inqaku elahlukileyo malunga nale nto kwimeko yokuphumelela).
Nangona kunjalo, injongo ephakathi yayikukudala iprototype eya kubonisa ukubanakho okusisiseko kokuqhuba i-OpenCV kwi-STM32, ngokulandelelanayo, le njongo iphunyeziwe, hooray!
tl;dr: imiyalelo yenyathelo nenyathelo
0: Khuphela imithombo ye-Embox, ngolu hlobo:
git clone https://github.com/embox/embox && cd ./embox
1: Masiqale ngokuhlanganisa i-bootloader eya "kudanya" i-QSPI flash drive.
make confload-arm/stm32f7cube
Ngoku kufuneka uqwalasele inethiwekhi, kuba. Siza kulayisha umfanekiso nge-TFTP. Ukuseta ibhodi kunye nokusingatha iidilesi ze-IP, kufuneka uhlele i-conf/rootfs/network.
Umzekelo woqwalaselo:
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
-idilesi yehostele ukusuka apho umfanekiso uya kulayishwa khona, address
- idilesi yebhodi.
Emva koko, siqokelela i-bootloader:
make
2: Ukulayishwa okuqhelekileyo kwe-bootloader (uxolo nge-pun) ebhodini - akukho nto ithile apha, kufuneka uyenze njengaso nasiphi na esinye isicelo se-STM32F7Discovery. Ukuba awuyazi indlela yokwenza, unokufunda ngayo
3: Ukuqulunqa umfanekiso ngoqwalaselo lwe-OpenCV.
make confload-platform/opencv/stm32f7discovery
make
I-4: Khipha kumacandelo e-ELF ukuba abhalwe kwi-QSPI ukuya kwi-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
Kukho umbhalo kulawulo lwe conf owenza oku, ukuze ukwazi ukuwuqhuba
./conf/qspi_objcopy.sh # ΠΡΠΆΠ½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ -- build/base/bin/qspi.bin
5: Ukusebenzisa i-tftp, khuphela i-qspi.bin.bin kwi-flash drive ye-QSPI. Kumamkeli, ukwenza oku, khuphela qspi.bin kwingcambu eneenkcukacha yomncedisi we tftp (eqhelekile /srv/tftp/ okanye /var/lib/tftpboot/; iipakethe zomncedisi ohambelanayo ziyafumaneka kunikezelo oludumileyo, oludla ngokubizwa ngokuba tftpd okanye tftp-hpa, ngamanye amaxesha kufuneka wenze 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
Kwi-Emboks (okt kwi-bootloader), kufuneka wenze lo myalelo ulandelayo (sicinga ukuba umncedisi unedilesi 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Ngomyalelo goto
kufuneka "utsibe" kwimemori ye-QSPI. Indawo ethile iya kwahluka ngokuxhomekeke kwindlela umfanekiso uqhagamshelwe ngayo, ungabona le dilesi ngomyalelo mem 0x90000000
(idilesi yokuqala ingena kwigama lesibini le-32-bit lomfanekiso); Kananjalo kuya kufuneka uphawule istaki -s
, idilesi yesitaki iku-0x90000000, umzekelo:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
β β
ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ
ΡΡΡΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠΉ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ
embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡΠΆΠ΅Π½ ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
< ΠΠ°ΡΠΈΠ½Π°Ρ ΠΎΡΡΡΠ΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π½Π΅ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, Π° ΠΎΠ±ΡΠ°Π·Π° Ρ OpenCV >
7: Qalisa
embox> edges 20
kwaye ujabulele ukukhangela umda we-40-yesibini π
Ukuba kukho into engahambi kakuhle - bhala umba
umthombo: www.habr.com