Aku salah siji saka pangembang saka sistem operasi
Yen sampeyan ngetik kaya "OpenCV ing papan STM32" menyang mesin telusur, sampeyan bisa nemokake sawetara wong sing kasengsem nggunakake perpustakaan iki ing papan STM32 utawa mikrokontroler liyane.
Ana sawetara video sing, miturut jeneng, kudu nduduhake apa sing dibutuhake, nanging biasane (ing kabeh video sing dakdeleng) ing papan STM32, mung gambar sing ditampa saka kamera lan asil ditampilake ing layar. lan pangolahan gambar dhewe ditindakake ing komputer biasa, utawa ing papan sing luwih kuat (contone, Raspberry Pi).
Napa angel?
Popularitas pitakon telusuran diterangake kanthi kasunyatan manawa OpenCV minangka perpustakaan visi komputer sing paling populer, tegese luwih akeh pangembang sing ngerti, lan kemampuan kanggo mbukak kode sing siap desktop ing mikrokontroler nyederhanakake proses pangembangan. Nanging kok isih ora ana resep-resep siap-digawe populer kanggo ngatasi masalah iki?
Masalah nggunakake OpenCV ing selendang cilik ana gandhengane karo rong fitur:
- Yen sampeyan ngumpulake perpustakaan malah karo pesawat paling tithik saka modul, iku mung ora pas menyang memori lampu kilat STM32F7Discovery padha (sanajan tanpa njupuk menyang akun OS) amarga kode gedhe banget (sawetara megabyte instruksi).
- Perpustakaan dhewe ditulis ing C ++, kang tegese
- Perlu dhukungan kanggo runtime positif (pengecualian, lsp.)
- Dhukungan cilik kanggo LibC / Posix, sing biasane ditemokake ing OS kanggo sistem sing dipasang - sampeyan butuh perpustakaan plus standar lan perpustakaan template STL standar (vektor, lsp.)
Porting menyang Embox
Kaya biasane, sadurunge ngirim program menyang sistem operasi, luwih becik nyoba mbangun ing wangun sing dikarepake para pangembang. Ing kasus kita, ora ana masalah karo iki - kode sumber bisa ditemokake ing
Kabar apik yaiku OpenCV bisa dibangun minangka perpustakaan statis metu saka kothak, sing nggawe porting luwih gampang. We ngumpulake perpustakaan karo config standar lan ndeleng carane akeh papan padha njupuk munggah. Saben modul diklumpukake ing perpustakaan sing kapisah.
> 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)
Nalika sampeyan bisa ndeleng saka baris pungkasan, .bss lan .data ora njupuk akeh papan, nanging kode luwih saka 70 MiB. Cetha yen iki disambungake kanthi statis menyang aplikasi tartamtu, kode bakal dadi kurang.
Ayo nyoba mbuwang modul sabisa-bisa supaya conto minimal dirakit (sing, contone, mung bakal ngasilake versi OpenCV), supaya kita katon. cmake .. -LA
lan mateni ing pilihan kabeh sing dipateni.
-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)
Ing tangan siji, iki mung siji modul perpustakaan, ing tangan liyane, iki tanpa optimasi compiler kanggo ukuran kode (-Os
). ~3 kode MiB isih akeh, nanging wis menehi pangarep-arep kanggo sukses.
Mbukak ing emulator
Luwih gampang debug ing emulator, mula priksa manawa perpustakaan bisa digunakake ing qemu. Minangka platform emulated, aku milih Integrator / CP, amarga sepisanan, iku uga ARM, lan sareh, Embox ndhukung output grafis kanggo platform iki.
Embox duwe mekanisme kanggo mbangun perpustakaan eksternal, nggunakake OpenCV minangka modul (ngliwati kabeh opsi sing padha kanggo mbangun "minimal" ing wangun perpustakaan statis), sawise iku aku nambah aplikasi prasaja sing katon kaya iki:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Kita ngumpulake sistem, mbukak - entuk output sing dikarepake.
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 Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠ±ΠΎΡΠΊΡ ΠΈ Ρ.ΠΏ.>
Langkah sabanjure yaiku mbukak sawetara conto, luwih becik salah sawijining standar sing ditawakake para pangembang dhewe.
Conto kudu rada ditulis maneh kanggo nampilake gambar kanthi asil langsung ing buffer pigura. Aku kudu nindakake iki, amarga. fungsi imshow()
bisa tarik gambar liwat antarmuka QT, GTK lan Windows, kang, mesthi, ora bakal ing config kanggo STM32. Nyatane, QT uga bisa mbukak ing STM32F7Discovery, nanging iki bakal dibahas ing artikel liyane π
Sawise klarifikasi singkat babagan format asil detektor pinggiran disimpen, kita entuk gambar.
gambar asli
asil
Mlaku ing STM32F7Discovery
Ing 32F746GDISCOVERY ana sawetara bagean memori hardware sing bisa digunakake kanthi cara siji utawa liyane
- 320 KiB RAM
- Lampu kilat 1MiB kanggo gambar
- 8 MiB SDRAM
- 16MiB QSPI NAND Flash
- slot kertu microSD
Kertu SD bisa digunakake kanggo nyimpen gambar, nanging ing konteks mbukak conto minimal, iki ora banget migunani.
Tampilan wis resolusi 480 Γ 272, kang tegese memori framebuffer bakal 522 byte ing ambane 240 bit, i.e. iki luwih saka ukuran RAM, supaya framebuffer lan numpuk (sing bakal dibutuhake, kalebu kanggo OpenCV, kanggo nyimpen data kanggo gambar lan struktur tambahan) bakal dumunung ing SDRAM, kabeh liya (memori kanggo tumpukan lan kabutuhan sistem liyane). ) bakal pindhah menyang RAM.
Yen kita njupuk konfigurasi minimal kanggo STM32F7Discovery (mbucal kabeh jaringan, kabeh printah, nggawe tumpukan minangka cilik sabisa, etc.) Lan nambah OpenCV karo conto ana, memori sing dibutuhake bakal kaya ing ngisor iki:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Kanggo sing ora banget menowo karo kang bagean pindhah ngendi, Aku bakal nerangake: ing .text
ΠΈ .rodata
instruksi lan konstanta (kira-kira, data mung diwaca) dumunung .data
data kasebut bisa diowahi, .bss
ana "nulled" variabel, kang, Nanging, perlu Panggonan (bagean iki bakal "go" kanggo RAM).
Kabar apik iku .data
/.bss
kudu pas, nanging karo .text
alangan iku ana mung 1MiB memori kanggo gambar. Bisa dibuwang metu .text
gambar saka conto lan maca, contone, saka kertu SD menyang memori ing wiwitan, nanging fruits.png abot bab 330KiB, supaya iki ora bakal ngatasi masalah: paling .text
kasusun saka kode OpenCV.
UmumΓ©, mung ana siji sing isih ana - ngemot bagean kode menyang lampu kilat QSPI (wis mode operasi khusus kanggo memori pemetaan menyang bis sistem, supaya prosesor bisa ngakses data iki langsung). Ing kasus iki, ana masalah: sepisanan, memori QSPI flash drive ora kasedhiya langsung sawise piranti rebooted (sampeyan kudu kapisah initialize mode memori-mapped), lan sareh, sampeyan ora bisa "kerlip" memori iki. bootloader sing akrab.
AkibatΓ©, diputusake kanggo nyambungake kabeh kode ing QSPI, lan kerlip nganggo loader sing ditulis dhewe sing bakal nampa binar sing dibutuhake liwat TFTP.
asil
Gagasan kanggo port perpustakaan iki menyang Embox muncul kira-kira setahun kepungkur, nanging bola-bali ditundha amarga macem-macem alasan. Salah sijine yaiku dhukungan kanggo libstdc ++ lan perpustakaan cithakan standar. Masalah dhukungan C ++ ing Embox ngluwihi ruang lingkup artikel iki, mula aku mung bakal ujar manawa kita bisa entuk dhukungan iki kanthi jumlah sing cocog kanggo perpustakaan iki π
Pungkasane, masalah kasebut diatasi (paling ora cukup kanggo conto OpenCV bisa digunakake), lan conto kasebut mlaku. Butuh 40 detik dawa kanggo Papan nelusuri wates nggunakake Filter Canny. Iki, mesthi, dawa banget (ana pertimbangan babagan carane ngoptimalake prakara iki, bakal bisa nulis artikel kapisah babagan iki ing kasus sukses).
Nanging, tujuan penengah yaiku nggawe prototipe sing bakal nuduhake kemungkinan dhasar mbukak OpenCV ing STM32, masing-masing, tujuan iki wis diraih, hooray!
tl;dr: instruksi langkah demi langkah
0: Ngundhuh sumber Embox, kaya iki:
git clone https://github.com/embox/embox && cd ./embox
1: Ayo miwiti kanthi ngrakit bootloader sing bakal "kerlip" flash drive QSPI.
make confload-arm/stm32f7cube
Saiki sampeyan kudu ngatur jaringan, amarga. Kita bakal ngunggah gambar liwat TFTP. Kanggo nyetel papan lan alamat IP host, sampeyan kudu ngowahi conf/rootfs/network.
Conto konfigurasi:
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
- alamat host saka ngendi gambar bakal dimuat, address
- alamat papan.
Sawise iku, kita ngumpulake bootloader:
make
2: Loading biasanipun saka bootloader (nuwun sewu) ing Papan - ana apa-apa tartamtu kene, sampeyan kudu nindakake kaya kanggo aplikasi liyane kanggo STM32F7Discovery. Yen sampeyan ora ngerti carane nindakake, sampeyan bisa maca babagan
3: Nglumpukake gambar nganggo konfigurasi kanggo OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Extract saka bagean ELF kanggo ditulis kanggo QSPI kanggo 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
Ana skrip ing direktori conf sing nindakake iki, supaya sampeyan bisa mbukak
./conf/qspi_objcopy.sh # ΠΡΠΆΠ½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ -- build/base/bin/qspi.bin
5: Nggunakake tftp, download qspi.bin.bin menyang QSPI flash drive. Ing host, kanggo nindakake iki, nyalin qspi.bin menyang folder root saka server tftp (biasane / srv / tftp / utawa / var / lib / tftpboot /; paket kanggo server sing cocog kasedhiya ing distribusi paling populer, biasane disebut tftpd utawa tftp-hpa, kadhangkala sampeyan kudu nindakake systemctl start tftpd.service
kanggo miwiti).
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Ing Embox (yaiku ing bootloader), sampeyan kudu nglakokake printah ing ngisor iki (kita nganggep yen server duwe alamat 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Kanthi printah goto
sampeyan kudu "mlumpat" menyang memori QSPI. Lokasi tartamtu bakal beda-beda gumantung carane gambar disambung, sampeyan bisa ndeleng alamat iki karo printah mem 0x90000000
(alamat wiwitan cocog karo tembung 32-bit gambar sing kapindho); sampeyan uga kudu flag tumpukan -s
, alamat tumpukan ana ing 0x90000000, contone:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
β β
ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ
ΡΡΡΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠΉ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ
embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡΠΆΠ΅Π½ ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
< ΠΠ°ΡΠΈΠ½Π°Ρ ΠΎΡΡΡΠ΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π½Π΅ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, Π° ΠΎΠ±ΡΠ°Π·Π° Ρ OpenCV >
7: ucul
embox> edges 20
lan seneng search wates 40 detik π
Yen ana masalah - nulis masalah ing
Source: www.habr.com