Ndine m'modzi mwa opanga makina ogwiritsira ntchito
Mukalemba china chake ngati "OpenCV pa STM32 board" mukusaka, mutha kupeza anthu angapo omwe akufuna kugwiritsa ntchito laibulale iyi pama board a STM32 kapena ma microcontroller ena.
Pali makanema angapo omwe, potengera dzina, ayenera kuwonetsa zomwe zikufunika, koma nthawi zambiri (m'mavidiyo onse omwe ndidawona) pa bolodi la STM32, chithunzi chokhacho chidalandiridwa kuchokera ku kamera ndipo zotsatira zake zidawonetsedwa pazenera, ndikukonza chithunzicho kunkachitika pakompyuta yokhazikika, kapena pama board amphamvu kwambiri (mwachitsanzo, Raspberry Pi).
Chifukwa chiyani kuli kovuta?
Kutchuka kwamafunso osaka kumafotokozedwa ndikuti OpenCV ndiye laibulale yodziwika bwino yamakompyuta, zomwe zikutanthauza kuti opanga ambiri amazidziwa bwino, komanso kuthekera koyendetsa ma code okonzeka pakompyuta pa microcontroller kumathandizira kwambiri chitukuko. Koma n'chifukwa chiyani palibe maphikidwe otchuka okonzeka kuthetsa vutoli?
Vuto logwiritsa ntchito OpenCV pamashalo ang'onoang'ono limagwirizana ndi zinthu ziwiri:
- Ngati mupanga laibulale ngakhale ndi ma module ochepa, sizingafanane ndi kukumbukira kwamtundu womwewo wa STM32F7Discovery (ngakhale osaganizira za OS) chifukwa cha code yayikulu kwambiri (ma megabytes angapo a malangizo)
- Laibulale yokhayo yalembedwa mu C ++, kutanthauza
- Mufunika thandizo la nthawi yabwino yothamanga (kupatulapo, ndi zina zotero)
- Thandizo laling'ono la LibC/Posix, lomwe nthawi zambiri limapezeka mu OS pamakina ophatikizika - mumafunika laibulale yokhazikika komanso laibulale yokhazikika ya template ya STL (vekitala, ndi zina).
Kutumiza ku Embox
Monga mwachizolowezi, musanatumize mapulogalamu aliwonse ku opareshoni, ndi bwino kuyesa kuyipanga mwanjira yomwe opanga adafunira. Kwa ife, palibe vuto ndi izi - gwero la code likhoza kupezeka
Nkhani yabwino ndiyakuti OpenCV ikhoza kumangidwa ngati laibulale yosasunthika m'bokosi, zomwe zimapangitsa kunyamula mosavuta. Timasonkhanitsa laibulale yokhala ndi makonzedwe okhazikika ndikuwona kuchuluka kwa malo omwe amatenga. Mutu uliwonse umasonkhanitsidwa mulaibulale yosiyana.
> 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)
Monga momwe mukuonera kuchokera pamzere wotsiriza, .bss ndi .data sizitenga malo ambiri, koma code ndi yoposa 70 MiB. Zikuwonekeratu kuti ngati izi zikugwirizana ndi pulogalamu inayake, code idzakhala yochepa.
Tiyeni tiyese kutaya ma modules ambiri momwe tingathere kuti chitsanzo chochepa chisonkhanitsidwe (chomwe, mwachitsanzo, chingotulutsa mtundu wa OpenCV), kotero timayang'ana. cmake .. -LA
ndikuzimitsa muzosankha zonse zomwe zimazimitsa.
-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)
Kumbali imodzi, iyi ndi gawo limodzi la laibulale, kumbali ina, iyi ilibe kukhathamiritsa kwa makulidwe a code (-Os
). ~ 3 MiB code ikadali yochuluka, koma imapereka chiyembekezo chakuchita bwino.
Thamangani mu emulator
Ndikosavuta kukonza zolakwika pa emulator, kotero choyamba onetsetsani kuti laibulale imagwira ntchito pa qemu. Monga nsanja yotsanzira, ndinasankha Integrator / CP, chifukwa Choyamba, ndi ARM, ndipo kachiwiri, Embox imathandizira zojambula papulatifomu.
Embox ili ndi makina omangira malaibulale akunja, ndikuigwiritsa ntchito timawonjezera OpenCV ngati gawo (kudutsa zosankha zonse zofananira "zochepa" zomanga ngati malaibulale osasunthika), pambuyo pake ndikuwonjezera ntchito yosavuta yomwe imawoneka ngati iyi:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Timasonkhanitsa dongosolo, kuyendetsa - timapeza zomwe tikuyembekezera.
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 Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠ±ΠΎΡΠΊΡ ΠΈ Ρ.ΠΏ.>
Chotsatira ndikuyendetsa chitsanzo, makamaka chimodzi mwazomwe zimaperekedwa ndi opanga okha.
Chitsanzocho chinayenera kulembedwanso pang'ono kuti chiwonetse chithunzicho ndi zotsatira zake mwachindunji mu buffer ya chimango. Ndinayenera kuchita izi, chifukwa. ntchito imshow()
ikhoza kujambula zithunzi kudzera pa QT, GTK ndi Windows interfaces, zomwe, ndithudi, sizidzakhala mu kasinthidwe ka STM32. M'malo mwake, QT itha kuyendetsedwanso pa STM32F7Discovery, koma izi zidzakambidwa m'nkhani ina π
Pambuyo pofotokozera mwachidule momwe zotsatira za chojambulira m'mphepete zimasungidwa, timapeza chithunzi.
chithunzi choyambirira
chifukwa
Zithunzi za STM32F7Discovery
Pa 32F746GDISCOVERY pali magawo angapo a memory memory omwe titha kugwiritsa ntchito mwanjira ina.
- 320KiB RAM
- 1MiB flash ya chithunzi
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- kagawo ka microSD khadi
Khadi la SD lingagwiritsidwe ntchito kusunga zithunzi, koma potengera chitsanzo chochepa, izi sizothandiza kwambiri.
Chiwonetserocho chili ndi malingaliro a 480 Γ 272, zomwe zikutanthauza kuti kukumbukira kwa framebuffer kudzakhala 522 bytes pakuya kwa 240 bits, i.e. izi ndizoposa kukula kwa RAM, kotero framebuffer ndi mulu (omwe adzafunika, kuphatikizapo OpenCV, kusunga deta ya zithunzi ndi nyumba zothandizira) zidzapezeka mu SDRAM, china chirichonse (kukumbukira kwa stacks ndi zosowa zina zamakina) ) idzapita ku RAM .
Ngati titenga zocheperako za STM32F7Discovery (kutaya netiweki yonse, malamulo onse, pangani milu yaying'ono momwe tingathere, ndi zina zotero) ndikuwonjezera OpenCV ndi zitsanzo pamenepo, kukumbukira kofunikira kudzakhala motere:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Kwa iwo omwe sadziwa bwino magawo omwe amapita, ndikufotokozerani: mu .text
ΠΈ .rodata
malangizo ndi zokhazikika (kutanthauza, kuwerenga kokha) zilimo .data
data ndi yosinthika, .bss
pali zosintha "zopanda pake", zomwe, komabe, zimafunikira malo (gawoli "lipita" ku RAM).
Nkhani yabwino ndiyakuti .data
/.bss
ziyenera kukwanira, koma ndi .text
vuto ndiloti pali 1MiB yokha ya kukumbukira chithunzicho. Akhoza kutayidwa kunja .text
chithunzi kuchokera ku chitsanzo ndikuchiwerenga, mwachitsanzo, kuchokera ku SD khadi kupita kukumbukira poyambira, koma fruit.png imalemera pafupifupi 330KiB, kotero izi sizingathetse vutoli: ambiri .text
ili ndi code ya OpenCV.
Mwambiri, pali chinthu chimodzi chokha chomwe chatsala - kutsitsa gawo la code pa QSPI flash (ili ndi njira yapadera yopangira mapu kukumbukira ku bus system, kuti purosesa ipeze deta iyi mwachindunji). Pachifukwa ichi, pamakhala vuto: choyamba, kukumbukira kwa QSPI flash drive sikupezeka nthawi yomweyo chipangizocho chikangoyambiranso (muyenera kuyambitsa padera mawonekedwe okumbukira kukumbukira), ndipo kachiwiri, simungathe "kuwalitsa" kukumbukira uku. chojambulira chodziwika bwino.
Zotsatira zake, zidasankhidwa kulumikiza ma code onse mu QSPI, ndikuwunikira ndi chojambulira chodzilemba chomwe chidzalandira binary yofunikira kudzera pa TFTP.
chifukwa
Lingaliro lonyamula laibulale iyi ku Embox lidawonekera pafupifupi chaka chapitacho, koma mobwerezabwereza idaimitsidwa chifukwa chazifukwa zosiyanasiyana. Chimodzi mwa izo ndikuthandizira libstdc ++ ndi laibulale yokhazikika ya template. Vuto la chithandizo cha C ++ mu Embox ndi lopitirira malire a nkhaniyi, kotero apa ndingonena kuti tinakwanitsa kukwaniritsa chithandizo ichi pamlingo woyenera kuti laibulale iyi igwire ntchito π
Pamapeto pake, mavutowa adagonjetsedwa (osakwanira kuti chitsanzo cha OpenCV chigwire ntchito), ndipo chitsanzocho chinathamanga. Zimatenga masekondi a 40 kuti gululo lifufuze malire pogwiritsa ntchito fyuluta ya Canny. Izi, ndithudi, ndizotalika kwambiri (pali malingaliro a momwe mungakwaniritsire nkhaniyi, mudzatha kulemba nkhani ina ya izi ngati mutapambana).
Komabe, cholinga chapakati chinali kupanga chithunzi chomwe chidzawonetsa kuthekera koyambira kwa OpenCV pa STM32, motsatana, cholinga ichi chidakwaniritsidwa, hooray!
tl; dr: malangizo a sitepe ndi sitepe
0: Tsitsani magwero a Embox, monga chonchi:
git clone https://github.com/embox/embox && cd ./embox
1: Tiyeni tiyambe ndi kusonkhanitsa bootloader kuti "flash" QSPI kung'anima pagalimoto.
make confload-arm/stm32f7cube
Tsopano muyenera kukonza maukonde, chifukwa. Timayika chithunzicho kudzera pa TFTP. Kuti muyike board ndi ma adilesi a IP, muyenera kusintha conf/rootfs/network.
Chitsanzo chokonzekera:
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
- adilesi yolandila pomwe chithunzicho chidzakwezedwa, address
- adilesi ya board.
Pambuyo pake, timasonkhanitsa bootloader:
make
2: Kutsitsa mwachizolowezi kwa bootloader (pepani chifukwa cha pun) pa bolodi - palibe chilichonse apa, muyenera kuchita ngati pulogalamu ina iliyonse ya STM32F7Discovery. Ngati simukudziwa momwe mungachitire, mutha kuwerenga za izo
3: Kupanga chithunzi ndi kasinthidwe ka OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Chotsani kuchokera ku zigawo za ELF kuti zilembedwe ku QSPI kupita 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
Pali script mu conf directory yomwe imachita izi, kuti mutha kuyendetsa
./conf/qspi_objcopy.sh # ΠΡΠΆΠ½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ -- build/base/bin/qspi.bin
5: Pogwiritsa ntchito tftp, koperani qspi.bin.bin ku QSPI flash drive. Pa wolandirayo, kuti muchite izi, lembani qspi.bin ku chikwatu cha tftp seva (nthawi zambiri /srv/tftp/ kapena /var/lib/tftpboot/; phukusi la seva yofananira likupezeka m'magawidwe otchuka kwambiri, omwe nthawi zambiri amatchedwa. tftpd kapena tftp-hpa, nthawi zina muyenera kuchita systemctl start tftpd.service
kuyambira).
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Pa Embox (ie mu bootloader), muyenera kuchita lamulo ili (tikuganiza kuti seva ili ndi adilesi 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Ndi lamulo goto
muyenera "kulumpha" mu QSPI kukumbukira. Malo enieni adzasiyana malinga ndi momwe chithunzicho chikugwirizanirana, mukhoza kuwona adilesiyi ndi lamulo mem 0x90000000
(adiresi yoyambira ikugwirizana ndi mawu achiwiri a 32-bit a fano); muyeneranso kuwonetsa stack -s
, adilesi ya stack ili pa 0x90000000, mwachitsanzo:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
β β
ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ
ΡΡΡΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠΉ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ
embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡΠΆΠ΅Π½ ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
< ΠΠ°ΡΠΈΠ½Π°Ρ ΠΎΡΡΡΠ΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π½Π΅ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, Π° ΠΎΠ±ΡΠ°Π·Π° Ρ OpenCV >
7: Kukhazikitsa
embox> edges 20
ndipo sangalalani ndikusaka kwa malire kwa mphindi 40 π
Ngati china chake sichikuyenda bwino - lembani vuto
Source: www.habr.com