Emi li ọkan ninu awọn Difelopa ti awọn ẹrọ
Ti o ba tẹ nkan bii “OpenCV lori igbimọ STM32” sinu ẹrọ wiwa, o le wa awọn eniyan diẹ ti o nifẹ si lilo ile-ikawe yii lori awọn igbimọ STM32 tabi awọn oludari microcontroller miiran.
Awọn fidio pupọ wa ti, ṣiṣe idajọ nipasẹ orukọ, yẹ ki o ṣafihan ohun ti o nilo, ṣugbọn nigbagbogbo (ni gbogbo awọn fidio ti Mo rii) lori igbimọ STM32, aworan nikan ni a gba lati kamẹra ati abajade ti han loju iboju, ati ṣiṣe aworan funrararẹ ti ṣe boya lori kọnputa deede, tabi lori awọn igbimọ ti o lagbara diẹ sii (fun apẹẹrẹ, Rasipibẹri Pi).
Kini idi ti o ṣoro?
Gbaye-gbale ti awọn ibeere wiwa jẹ alaye nipasẹ otitọ pe OpenCV jẹ ile-ikawe iran kọnputa olokiki julọ, eyiti o tumọ si pe awọn olupilẹṣẹ diẹ sii faramọ pẹlu rẹ, ati agbara lati ṣiṣẹ koodu imurasilẹ-lori tabili lori microcontroller jẹ ki ilana idagbasoke rọrun pupọ. Ṣugbọn kilode ti ko si awọn ilana ti o ṣetan-ṣe olokiki fun yiyan iṣoro yii?
Iṣoro ti lilo OpenCV lori awọn shawls kekere jẹ ibatan si awọn ẹya meji:
- Ti o ba ṣajọ ile-ikawe paapaa pẹlu eto awọn modulu kekere, kii yoo ni ibamu si iranti filasi ti STM32F7Discovery kanna (paapaa laisi akiyesi OS) nitori koodu ti o tobi pupọ (awọn megabytes pupọ ti awọn ilana)
- Ile-ikawe funrararẹ ni a kọ sinu C ++, eyiti o tumọ si
- Nilo atilẹyin fun akoko ṣiṣe rere (awọn imukuro, ati bẹbẹ lọ)
- Atilẹyin kekere fun LibC/Posix, eyiti a rii nigbagbogbo ni OS fun awọn eto ifibọ - o nilo boṣewa kan pẹlu ile-ikawe ati ile ikawe awoṣe STL boṣewa (fekito, ati bẹbẹ lọ)
Gbigbe si Apoti
Gẹgẹbi igbagbogbo, ṣaaju gbigbe awọn eto eyikeyi si ẹrọ ṣiṣe, o jẹ imọran ti o dara lati gbiyanju lati kọ ni fọọmu eyiti awọn olupilẹṣẹ pinnu rẹ. Ninu ọran wa, ko si awọn iṣoro pẹlu eyi - koodu orisun le ṣee rii lori
Irohin ti o dara ni pe OpenCV le ṣe bi ile-ikawe aimi lati inu apoti, eyiti o jẹ ki gbigbe gbigbe rọrun. A gba a ìkàwé pẹlu kan boṣewa konfigi ati ki o wo bi o Elo aaye ti won gba soke. Kọọkan module ti wa ni gba ni lọtọ ìkàwé.
> 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)
Gẹgẹbi o ti le rii lati laini to kẹhin, .bss ati .data ko gba aaye pupọ, ṣugbọn koodu naa jẹ diẹ sii ju 70 MiB. O han gbangba pe ti eyi ba ni asopọ ni iṣiro si ohun elo kan pato, koodu yoo dinku.
Jẹ ki a gbiyanju lati jabọ jade bi ọpọlọpọ awọn modulu bi o ti ṣee ṣe ki apẹẹrẹ ti o kere julọ ni apejọ (eyiti, fun apẹẹrẹ, yoo ṣe agbejade ẹya OpenCV nirọrun), nitorinaa a wo. cmake .. -LA
ki o si pa ninu awọn aṣayan ohun gbogbo ti o wa ni pipa.
-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)
Ni apa kan, eyi jẹ module kan nikan ti ile-ikawe, ni apa keji, eyi jẹ laisi iṣapeye akopọ fun iwọn koodu (-Os
). ~ 3 MiB ti koodu tun jẹ pupọ pupọ, ṣugbọn tẹlẹ funni ni ireti fun aṣeyọri.
Ṣiṣe ni emulator
O rọrun pupọ lati ṣatunṣe lori emulator, nitorinaa akọkọ rii daju pe ile-ikawe ṣiṣẹ lori qemu. Bi ohun emulated Syeed, Mo ti yan Integrator / CP, nitori Ni akọkọ, o tun jẹ ARM, ati keji, Embox ṣe atilẹyin iṣelọpọ awọn aworan fun pẹpẹ yii.
Embox ni ẹrọ kan fun kikọ awọn ile ikawe itagbangba, lilo rẹ a ṣafikun OpenCV bi module (gbigba gbogbo awọn aṣayan kanna fun “iwọn” kọ ni irisi awọn ile-ikawe aimi), lẹhin iyẹn Mo ṣafikun ohun elo ti o rọrun ti o dabi eyi:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
A pejọ eto naa, ṣiṣe rẹ - a gba abajade ti a nireti.
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 включены в сборку и т.п.>
Igbesẹ ti o tẹle ni lati ṣiṣẹ diẹ ninu apẹẹrẹ, pelu ọkan ninu awọn boṣewa ti a funni nipasẹ awọn olupilẹṣẹ funrararẹ.
Apeere naa ni lati tun kọ die-die lati ṣafihan aworan naa pẹlu abajade taara ninu ifipamọ fireemu. Mo ni lati ṣe eyi, nitori. iṣẹ imshow()
le fa awọn aworan nipasẹ QT, GTK ati awọn atọkun Windows, eyiti, dajudaju, kii yoo wa ni atunto fun STM32. Ni otitọ, QT tun le ṣiṣẹ lori STM32F7Discovery, ṣugbọn eyi ni yoo jiroro ni nkan miiran 🙂
Lẹhin alaye kukuru ninu eyiti ọna kika abajade ti oluwari eti ti wa ni ipamọ, a gba aworan kan.
atilẹba aworan
Esi
Nṣiṣẹ lori STM32F7Discovery
Lori 32F746GDISCOVERY ọpọlọpọ awọn apakan iranti hardware wa ti a le lo ni ọna kan tabi omiiran
- 320KiB Ramu
- 1MiB filasi fun aworan
- 8MiB SDRAM
- 16MiB QSPI NAND Flash
- Iho kaadi microSD
Kaadi SD le ṣee lo lati tọju awọn aworan, ṣugbọn ni aaye ti ṣiṣe apẹẹrẹ kekere, eyi ko wulo pupọ.
Ifihan naa ni ipinnu ti 480×272, eyi ti o tumọ si pe iranti framebuffer yoo jẹ 522 awọn baiti ni ijinle 240 bits, i.e. Eyi jẹ diẹ sii ju iwọn Ramu lọ, nitorinaa framebuffer ati okiti (eyi ti yoo nilo, pẹlu fun OpenCV, lati tọju data fun awọn aworan ati awọn ẹya arannilọwọ) yoo wa ni SDRAM, ohun gbogbo miiran (iranti fun awọn akopọ ati awọn iwulo eto miiran). ) yoo lọ si Ramu.
Ti a ba mu atunto to kere julọ fun STM32F7Discovery (jabọ gbogbo nẹtiwọọki, gbogbo awọn aṣẹ, ṣe awọn akopọ bi o ti ṣee ṣe, ati bẹbẹ lọ) ati ṣafikun OpenCV pẹlu awọn apẹẹrẹ nibẹ, iranti ti o nilo yoo jẹ atẹle yii:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Fun awon ti o wa ni ko gan faramọ pẹlu eyi ti ruju lọ ibi ti, Emi yoo se alaye: ni .text
и .rodata
awọn ilana ati awọn igbagbogbo (ni aijọju sisọ, data kika nikan) dubulẹ ninu .data
data jẹ iyipada, .bss
awọn oniyipada “asan” wa, eyiti, sibẹsibẹ, nilo aaye kan (apakan yii yoo “lọ” si Ramu).
Irohin ti o dara ni pe .data
/.bss
yẹ ki o baamu, ṣugbọn pẹlu .text
iṣoro naa ni pe 1MiB ti iranti nikan wa fun aworan naa. Le ti wa ni ju jade .text
aworan lati apẹẹrẹ ki o ka, fun apẹẹrẹ, lati kaadi SD sinu iranti ni ibẹrẹ, ṣugbọn awọn eso.png ṣe iwọn nipa 330KiB, nitorina eyi kii yoo yanju iṣoro naa: julọ. .text
oriširiši OpenCV koodu.
Nipa ati ki o tobi, nibẹ ni nikan kan ohun osi - ikojọpọ apa kan ninu awọn koodu pẹlẹpẹlẹ a QSPI filasi (o ni o ni pataki kan mode ti isẹ fun a maapu iranti si awọn eto bosi, ki awọn isise le wọle si yi data taara). Ni ọran yii, iṣoro kan dide: ni akọkọ, iranti ti dirafu filasi QSPI ko wa lẹsẹkẹsẹ lẹhin atunbere ẹrọ naa (o nilo lati ṣe ipilẹṣẹ ipo iranti ti o ya sọtọ lọtọ), ati ni ẹẹkeji, iwọ ko le “filaṣi” iranti yii pẹlu a faramọ bootloader.
Bi abajade, o pinnu lati sopọ gbogbo koodu ni QSPI, ati filasi rẹ pẹlu agberu ti ara ẹni ti yoo gba alakomeji ti o nilo nipasẹ TFTP.
Esi
Ero lati gbe ile-ikawe yii si Embox han ni ọdun kan sẹhin, ṣugbọn leralera o sun siwaju nitori ọpọlọpọ awọn idi. Ọkan ninu wọn jẹ atilẹyin fun libstdc++ ati ile-ikawe awoṣe boṣewa. Iṣoro ti atilẹyin C ++ ni Embox kọja ipari ti nkan yii, nitorinaa Emi yoo sọ nikan pe a ṣakoso lati ṣaṣeyọri atilẹyin yii ni iye to tọ fun ile-ikawe yii lati ṣiṣẹ 🙂
Ni ipari, awọn iṣoro wọnyi ti bori (o kere ju fun apẹẹrẹ OpenCV lati ṣiṣẹ), ati apẹẹrẹ naa nṣiṣẹ. Yoo gba to iṣẹju-aaya 40 fun igbimọ lati wa awọn aala nipa lilo àlẹmọ Canny. Eyi, dajudaju, gun ju (awọn ero wa lori bi o ṣe le mu ọrọ yii dara, yoo ṣee ṣe lati kọ nkan lọtọ nipa eyi ni ọran ti aṣeyọri).
Sibẹsibẹ, ibi-afẹde agbedemeji ni lati ṣẹda apẹrẹ kan ti yoo ṣafihan iṣeeṣe ipilẹ ti ṣiṣiṣẹ OpenCV lori STM32, ni atele, ibi-afẹde yii ti waye, hooray!
tl;dr: igbese nipa igbese ilana
0: Ṣe igbasilẹ awọn orisun Embox, bii eyi:
git clone https://github.com/embox/embox && cd ./embox
1: Jẹ ká bẹrẹ nipa a Nto a bootloader ti yoo "filasi" a QSPI filasi drive.
make confload-arm/stm32f7cube
Bayi o nilo lati tunto nẹtiwọki, nitori. A yoo po si aworan nipasẹ TFTP. Lati ṣeto igbimọ ati gbalejo awọn adirẹsi IP, o nilo lati satunkọ conf/rootfs/nẹtiwọọki.
Apẹẹrẹ iṣeto:
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
- adirẹsi ogun lati ibiti aworan yoo ti gbe, address
- adirẹsi ti awọn ọkọ.
Lẹhin iyẹn, a gba bootloader:
make
2: Ikojọpọ igbagbogbo ti bootloader (binu fun pun) lori igbimọ - ko si ohunkan pato nibi, o nilo lati ṣe bi fun eyikeyi ohun elo miiran fun STM32F7Discovery. Ti o ko ba mọ bi o ṣe le ṣe, o le ka nipa rẹ
3: Iṣakojọpọ aworan pẹlu atunto kan fun OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Jade lati awọn apakan ELF lati kọ si QSPI si 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
Iwe afọwọkọ kan wa ninu itọsọna conf ti o ṣe eyi, nitorinaa o le ṣiṣe
./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin
5: Lilo tftp, ṣe igbasilẹ qspi.bin.bin si kọnputa filasi QSPI kan. Lori agbalejo, lati ṣe eyi, daakọ qspi.bin si folda root ti olupin tftp (nigbagbogbo / srv/tftp/ tabi / var/lib/tftpboot/; awọn idii fun olupin ti o baamu wa ni awọn pinpin olokiki julọ, ti a npe ni nigbagbogbo tftpd tabi tftp-hpa, nigbami o ni lati ṣe systemctl start tftpd.service
lati bẹrẹ).
# вариант для tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# вариант для tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Lori Embox (ie ni bootloader), o nilo lati ṣiṣẹ pipaṣẹ atẹle (a ro pe olupin naa ni adirẹsi 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Pelu ase goto
o nilo a "fo" sinu QSPI iranti. Ipo kan pato yoo yatọ si da lori bi aworan ṣe sopọ, o le rii adirẹsi yii pẹlu aṣẹ naa mem 0x90000000
(adirẹsi ibẹrẹ ni ibamu si ọrọ 32-bit keji ti aworan naa); iwọ yoo tun nilo lati fi ami si akopọ naa -s
, adirẹsi akopọ wa ni 0x90000000, apẹẹrẹ:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
↑ ↑
это адрес это адрес
стэка первой
инструкции
embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы
< Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >
7: Ifilọlẹ
embox> edges 20
ati ki o gbadun wiwa aala 40-keji 🙂
Ti nkan kan ba jẹ aṣiṣe - kọ ọrọ kan sinu
orisun: www.habr.com