Ina ɗaya daga cikin masu haɓaka tsarin aiki
Idan ka rubuta wani abu kamar "OpenCV akan allon STM32" a cikin injin bincike, za ka iya samun mutane kaɗan waɗanda ke da sha'awar amfani da wannan ɗakin karatu a kan allunan STM32 ko wasu microcontrollers.
Akwai bidiyo da yawa waɗanda, yin la'akari da sunan, yakamata su nuna abin da ake buƙata, amma yawanci (a cikin duk bidiyon da na gani) akan allon STM32, hoton kawai ya karɓi daga kyamara kuma an nuna sakamakon akan allon. kuma sarrafa hoton kanta an yi shi ko dai akan kwamfuta ta yau da kullun, ko kuma akan alluna masu ƙarfi (misali, Raspberry Pi).
Me yasa yake da wahala?
Shahararriyar tambayoyin neman bayanai an bayyana shi ta hanyar cewa OpenCV ita ce mashahurin ɗakin karatu na hangen nesa na kwamfuta, wanda ke nufin cewa yawancin masu haɓakawa sun saba da shi, kuma ikon sarrafa lambar shirye-shiryen tebur akan microcontroller yana sauƙaƙa tsarin haɓakawa sosai. Amma me yasa har yanzu babu shahararrun girke-girke da aka shirya don magance wannan matsala?
Matsalar amfani da OpenCV akan ƙananan shawl yana da alaƙa da fasali guda biyu:
- Idan kun tattara ɗakin karatu har ma da ƙaramin saiti na kayayyaki, kawai ba zai dace da ƙwaƙwalwar walƙiya na STM32F7Discovery guda ɗaya ba (ko da ba tare da la'akari da OS ba) saboda babban lambar (megabytes da yawa na umarni)
- Laburaren da kansa an rubuta shi da C++, wanda ke nufin
- Bukatar tallafi don ingantaccen lokacin gudu (bangare, da sauransu)
- Ƙananan tallafi don LibC/Posix, wanda galibi ana samunsa a cikin OS don tsarin da aka haɗa - kuna buƙatar ma'auni da ɗakin karatu da daidaitaccen ɗakin karatu na samfurin STL (vector, da sauransu)
Ana aikawa zuwa Embox
Kamar yadda aka saba, kafin a tura kowace manhaja zuwa tsarin aiki, yana da kyau a yi kokarin gina shi ta hanyar da masu ci gaba suka nufa da shi. A cikin yanayinmu, babu matsaloli tare da wannan - ana iya samun lambar tushe akan
Labari mai dadi shine cewa ana iya gina OpenCV daga cikin akwatin azaman ɗakin karatu na tsaye, wanda ke sauƙaƙe jigilar kaya. Muna tattara ɗakin karatu tare da daidaitaccen tsari kuma mu ga yawan sararin da suke ɗauka. Ana tattara kowane nau'i a cikin ɗakin karatu daban.
> 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)
Kamar yadda kake gani daga layi na ƙarshe, .bss da .data ba su ɗaukar sarari da yawa, amma lambar ta fi 70 MiB. A bayyane yake cewa idan an haɗa wannan a ƙididdiga zuwa takamaiman aikace-aikacen, lambar za ta zama ƙasa.
Bari mu yi ƙoƙari mu jefar da yawancin kayayyaki kamar yadda zai yiwu domin ƙaramin misali ya taru (wanda, alal misali, kawai zai fitar da sigar OpenCV), don haka muna duba. cmake .. -LA
kuma kashe a cikin zaɓuɓɓukan duk abin da ke kashewa.
-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)
A gefe guda, wannan nau'in ɗakin karatu ɗaya ne kawai, a gefe guda, wannan ba tare da haɓaka haɓakawa don girman lambar ba (-Os
). ~3 MiB na lambar har yanzu yana da yawa, amma ya riga ya ba da bege ga nasara.
Gudu a cikin emulator
Yana da sauƙin gyara kuskure akan kwaikwaiyo, don haka da farko tabbatar da cewa ɗakin karatu yana aiki akan qemu. A matsayin dandamalin da aka kwaikwayi, na zaɓi Integrator / CP, saboda na farko, shi ma ARM ne, na biyu kuma, Embox yana goyan bayan fitowar hotuna don wannan dandali.
Embox yana da hanyar gina ɗakunan karatu na waje, ta amfani da shi muna ƙara OpenCV azaman module (wucewa duk zaɓuɓɓuka iri ɗaya don ginin "ƙananan" a cikin nau'ikan ɗakunan karatu na tsaye), bayan haka na ƙara aikace-aikacen mai sauƙi mai kama da wannan:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Muna tattara tsarin, gudanar da shi - muna samun abin da ake sa ran.
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 включены в сборку и т.п.>
Mataki na gaba shine gudanar da wasu misali, zai fi dacewa ɗaya daga cikin daidaitattun waɗanda masu haɓakawa suke bayarwa.
Dole ne a sake rubuta misalin don nuna hoton tare da sakamakon kai tsaye a cikin ma'ajin firam. Dole ne in yi wannan, saboda. aiki imshow()
na iya zana hotuna ta hanyar mu'amalar QT, GTK da Windows, wanda, ba shakka, ba zai kasance cikin tsarin STM32 ba. A zahiri, ana iya gudanar da QT akan STM32F7Discovery, amma za'a tattauna wannan a wani labarin 🙂
Bayan ɗan taƙaitaccen bayani a cikin wane tsari aka adana sakamakon mai gano gefen, muna samun hoto.
hoto na asali
sakamakon
Yin Gudu akan STM32F7Discovery
A kan 32F746GDISCOVERY akwai sassan ƙwaƙwalwar ajiyar hardware da yawa waɗanda za mu iya amfani da su ta wata hanya ko wata.
- 320 KB RAM
- 1MiB flash don hoto
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- Ramin katin microSD
Ana iya amfani da katin SD don adana hotuna, amma a cikin mahallin gudanar da ƙaramin misali, wannan ba shi da amfani sosai.
Nuni yana da ƙuduri na 480 × 272, wanda ke nufin cewa ƙwaƙwalwar ajiyar framebuffer za ta kasance 522 bytes a zurfin 240 bits, watau. wannan ya fi girman RAM, don haka framebuffer da heap (wanda za a buƙaci, ciki har da OpenCV, don adana bayanai don hotuna da tsarin kayan aiki) za su kasance a cikin SDRAM, duk wani abu (ƙwaƙwalwar ƙwaƙwalwar ajiya da sauran bukatun tsarin). ) zai fara zuwa RAM.
Idan muka ɗauki mafi ƙarancin saiti don STM32F7Discovery (fitar da hanyar sadarwa gaba ɗaya, duk umarni, sanya tari a matsayin ƙanƙanta gwargwadon yiwuwa, da sauransu) kuma ƙara OpenCV tare da misalai a can, ƙwaƙwalwar da ake buƙata zata kasance kamar haka:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Ga wadanda ba su da masaniya da waɗanne sassan ke zuwa, zan yi bayani: in .text
и .rodata
umarnin da akai-akai (kusan yin magana, bayanan karatu kawai) sun kwanta .data
data iya canzawa, .bss
akwai masu canji na "rasa", waɗanda, duk da haka, suna buƙatar wuri (wannan sashe zai "tafi" zuwa RAM).
Labari mai dadi shine .data
/.bss
ya kamata ya dace, amma tare da .text
Matsalar ita ce akwai kawai 1MiB na ƙwaƙwalwar ajiya don hoton. Ana iya jefar da shi waje .text
Hoton daga misalin kuma karanta shi, alal misali, daga katin SD zuwa ƙwaƙwalwar ajiya a farawa, amma fruit.png yana auna kimanin 330KiB, don haka wannan ba zai magance matsalar ba: mafi yawan. .text
ya ƙunshi lambar OpenCV.
Gabaɗaya, abu ɗaya ne kawai ya rage - loda wani ɓangaren lambar akan filasha QSPI (yana da yanayin aiki na musamman don yin taswirar ƙwaƙwalwar ajiya zuwa bas ɗin tsarin, ta yadda mai sarrafawa zai iya samun damar wannan bayanan kai tsaye). A wannan yanayin, matsala ta taso: da farko, ƙwaƙwalwar QSPI flash drive ba ta samuwa nan da nan bayan an sake kunna na'urar (kana buƙatar fara fara yanayin taswirar ƙwaƙwalwar ajiya daban), kuma na biyu, ba za ku iya "flash" wannan ƙwaƙwalwar ba tare da shi. saba bootloader.
A sakamakon haka, an yanke shawarar haɗa duk lambar a cikin QSPI, kuma a kunna shi tare da mai ɗaukar hoto wanda zai karɓi binary ɗin da ake buƙata ta hanyar TFTP.
sakamakon
Tunanin aika wannan ɗakin karatu zuwa Embox ya bayyana kusan shekara guda da ta gabata, amma akai-akai an jinkirta shi saboda wasu dalilai. Ɗayan su shine goyan baya ga libstdc++ da madaidaicin ɗakin karatu na samfuri. Matsalar tallafin C ++ a cikin Embox ya wuce iyakar wannan labarin, don haka a nan zan ce kawai mun sami nasarar cimma wannan tallafin a cikin adadin da ya dace don wannan ɗakin karatu ya yi aiki 🙂
A ƙarshe, an shawo kan waɗannan matsalolin (aƙalla isa ga misalin OpenCV don yin aiki), kuma misalin ya gudana. Yana ɗaukar tsawon daƙiƙa 40 don allon don bincika iyakoki ta amfani da tace Canny. Wannan, ba shakka, ya yi tsayi sosai (akwai la'akari da yadda za a inganta wannan al'amari, zai yiwu a rubuta wani labarin dabam game da wannan idan an yi nasara).
Koyaya, maƙasudin matsakaici shine ƙirƙirar samfuri wanda zai nuna ainihin yuwuwar gudanar da OpenCV akan STM32, bi da bi, an cimma wannan burin, hooray!
tl;dr: umarnin mataki-mataki
0: Zazzage tushen Embox, kamar haka:
git clone https://github.com/embox/embox && cd ./embox
1: Bari mu fara da harhada bootloader wanda zai "flash" QSPI flash drive.
make confload-arm/stm32f7cube
Yanzu kuna buƙatar saita hanyar sadarwar, saboda. Za mu loda hoton ta hanyar TFTP. Don saita allon da karɓar adiresoshin IP, kuna buƙatar shirya conf/rootfs/network.
Misalin tsari:
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
- adireshin masauki daga inda za a loda hoton, address
- adireshin hukumar.
Bayan haka, muna tattara bootloader:
make
2: Yawan shigar da bootloader na yau da kullun (yi hakuri da pun) akan allo - babu wani takamaiman abu anan, kuna buƙatar yin shi kamar kowane aikace-aikacen STM32F7Discovery. Idan baku san yadda ake yi ba, kuna iya karantawa game da shi
3: Haɗa hoto tare da saiti don OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Cire daga sassan ELF don rubutawa zuwa QSPI zuwa 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
Akwai rubutun a cikin kundin adireshin da ke yin wannan, don haka za ku iya gudanar da shi
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Ta amfani da tftp, zazzage qspi.bin.bin zuwa filasha QSPI. A kan mai watsa shiri, don yin wannan, kwafi qspi.bin zuwa tushen babban fayil na uwar garken tftp (yawanci / srv/tftp/ ko /var/lib/tftpboot/; fakitin uwar garken da ya dace suna samuwa a cikin mafi yawan shahararrun rabawa, yawanci ake kira tftpd ko tftp-hpa, wani lokacin dole ku yi systemctl start tftpd.service
fara).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
A kan Embox (watau a cikin bootloader), kuna buƙatar aiwatar da umarni mai zuwa (muna ɗauka cewa uwar garken yana da adireshin 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Da umarni goto
kuna buƙatar "tsalle" cikin ƙwaƙwalwar QSPI. Musamman wurin zai bambanta dangane da yadda aka haɗa hoton, zaku iya ganin wannan adireshin tare da umarnin mem 0x90000000
(adireshin farawa ya dace da kalmar 32-bit na biyu na hoton); za ku kuma buƙaci tuta tari -s
, adireshin da aka tara yana a 0x90000000, misali:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Kaddamar
embox> edges 20
kuma ku ji daɗin binciken iyaka na daƙiƙa 40 🙂
Idan wani abu ba daidai ba - rubuta wani batu a ciki
source: www.habr.com