Kuv yog ib tug ntawm cov developers ntawm lub operating system
Yog tias koj ntaus ib yam dab tsi zoo li "OpenCV ntawm STM32 board" rau hauv lub tshuab tshawb nrhiav, koj tuaj yeem pom ob peb tus neeg uas xav siv lub tsev qiv ntawv no ntawm STM32 boards lossis lwm yam microcontrollers.
Muaj ntau cov yeeb yaj kiab uas, txiav txim los ntawm lub npe, yuav tsum ua kom pom qhov xav tau, tab sis feem ntau (hauv txhua cov yeeb yaj kiab uas kuv pom) ntawm lub rooj tsavxwm STM32, tsuas yog cov duab tau txais los ntawm lub koob yees duab thiab cov txiaj ntsig tau tshwm sim ntawm qhov screen, thiab cov duab ua nws tus kheej tau ua nyob rau hauv lub computer tsis tu ncua, lossis ntawm cov laug cam ntau zog (piv txwv li, Raspberry Pi).
Vim li cas nws nyuaj?
Qhov nrov ntawm cov lus nug tshawb fawb tau piav qhia los ntawm qhov tseeb tias OpenCV yog lub khoos phis tawj nrov tshaj plaws hauv lub zeem muag, uas txhais tau hais tias ntau tus neeg tsim khoom tau paub txog nws, thiab lub peev xwm los khiav lub desktop-npaj code ntawm microcontroller ua rau txoj kev txhim kho yooj yim heev. Tab sis yog vim li cas tseem tsis tau muaj cov zaub mov uas nrov npaj rau kev daws qhov teeb meem no?
Qhov teeb meem ntawm kev siv OpenCV ntawm me me shawls muaj feem xyuam rau ob yam ntxwv:
- Yog tias koj sau cov tsev qiv ntawv txawm tias muaj cov txheej txheem me me, nws tsuas yog yuav tsis haum rau hauv lub cim xeeb flash ntawm tib STM32F7Discovery (txawm tias tsis suav nrog OS) vim muaj cov cai loj heev (ntau cov lus qhia megabytes)
- Lub tsev qiv ntawv nws tus kheej sau hauv C ++, uas txhais tau tias
- Xav tau kev txhawb nqa rau lub sijhawm zoo (exceptions, etc.)
- Kev them nyiaj yug me me rau LibC/Posix, uas feem ntau pom muaj nyob rau hauv OS rau embedded systems - koj xav tau ib tug qauv ntxiv rau lub tsev qiv ntawv thiab tus qauv STL template tsev qiv ntawv (vector, thiab lwm yam)
Kev xa mus rau Embox
Raws li ib txwm muaj, ua ntej porting ib qho kev pab cuam rau lub operating system, nws yog ib lub tswv yim zoo los sim tsim nws nyob rau hauv daim ntawv uas cov developers npaj nws. Hauv peb cov ntaub ntawv, tsis muaj teeb meem nrog qhov no - qhov chaws tuaj yeem pom ntawm
Qhov xwm zoo yog tias OpenCV tuaj yeem tsim ua lub tsev qiv ntawv zoo li qub tawm ntawm lub thawv, uas ua rau kev xa khoom yooj yim dua. Peb sau ib lub tsev qiv ntawv nrog tus qauv config thiab saib seb lawv siv ntau npaum li cas. Txhua qhov module raug sau rau hauv ib lub tsev qiv ntawv cais.
> 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)
Raws li koj tuaj yeem pom los ntawm kab kawg, .bss thiab .data tsis siv ntau qhov chaw, tab sis tus lej yog ntau dua 70 MiB. Nws yog qhov tseeb tias yog tias qhov no txuas nrog rau ib daim ntawv thov tshwj xeeb, cov cai yuav dhau los ua tsawg dua.
Cia peb sim muab pov tseg ntau npaum li qhov ua tau kom qhov piv txwv tsawg tau sib sau ua ke (uas, piv txwv li, yuav tsuas tso tawm OpenCV version), yog li peb saib cmake .. -LA
thiab tua nyob rau hauv cov kev xaiv txhua yam uas tig tawm.
-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)
Ntawm qhov tod tes, qhov no tsuas yog ib qho module ntawm lub tsev qiv ntawv, ntawm qhov tod tes, qhov no yog tsis muaj compiler optimization rau code loj (-Os
). ~ 3 MiB ntawm code tseem yog heev, tab sis twb muab kev cia siab rau kev vam meej.
Khiav hauv lub emulator
Nws yooj yim dua rau kev debug ntawm lub emulator, yog li ua ntej kom paub tseeb tias lub tsev qiv ntawv ua haujlwm ntawm qemu. Raws li lub platform emulated, kuv xaiv Integrator / CP, vim thawj zaug, nws tseem yog ARM, thiab thib ob, Embox txhawb nqa cov duab tso tawm rau lub platform no.
Embox muaj cov txheej txheem rau kev tsim cov tsev qiv ntawv sab nraud, siv nws peb ntxiv OpenCV ua ib qho module (dhau tag nrho cov kev xaiv tib yam rau "tsawg kawg" tsim nyob rau hauv daim ntawv ntawm cov tsev qiv ntawv zoo li qub), tom qab ntawd kuv ntxiv ib daim ntawv thov yooj yim uas zoo li no:
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
Peb sib sau ua ke lub system, khiav nws - peb tau txais qhov kev cia siab tso zis.
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 Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΡΠ±ΠΎΡΠΊΡ ΠΈ Ρ.ΠΏ.>
Cov kauj ruam tom ntej yog khiav qee qhov piv txwv, zoo dua yog ib qho ntawm cov qauv muab los ntawm cov neeg tsim khoom lawv tus kheej.
Cov piv txwv yuav tsum tau rov sau dua me ntsis los tso saib cov duab nrog qhov tshwm sim ncaj qha rau hauv tus ncej tsis. Kuv yuav tsum ua qhov no, vim. muaj nuj nqi imshow()
tuaj yeem kos duab los ntawm QT, GTK thiab Windows interfaces, uas, ntawm chav kawm, yuav tsis nyob hauv config rau STM32. Qhov tseeb, QT kuj tseem tuaj yeem khiav ntawm STM32F7Discovery, tab sis qhov no yuav tau tham hauv lwm tsab xov xwm π
Tom qab ib qho kev qhia luv luv nyob rau hauv uas hom ntawv qhov tshwm sim ntawm ntug ntes tau khaws cia, peb tau txais cov duab.
daim duab qub
tshwm sim
Khiav ntawm STM32F7Discovery
Ntawm 32F746GDISCOVERY muaj ob peb lub cim xeeb kho vajtse uas peb tuaj yeem siv ib txoj kev lossis lwm qhov
- 320 KiB RAM
- 1 MiB flash rau duab
- 8 MiB SDRAM
- 16 MiB QSPI NAND Flash
- microSD daim npav qhov
Daim npav SD tuaj yeem siv los khaws cov duab, tab sis nyob rau hauv cov ntsiab lus ntawm kev khiav ib qho piv txwv tsawg, qhov no tsis muaj txiaj ntsig zoo.
Cov zaub muaj kev daws teeb meem ntawm 480 Γ 272, uas txhais tau hais tias lub cim xeeb ntawm lub cim xeeb yuav yog 522 bytes ntawm qhov tob ntawm 240 khoom, piv txwv li. qhov no yog ntau tshaj qhov luaj li cas ntawm RAM, yog li lub framebuffer thiab lub heap (uas yuav tsum tau, nrog rau OpenCV, khaws cov ntaub ntawv rau dluab thiab auxiliary qauv) yuav tsum nyob rau hauv SDRAM, txhua yam (nco rau stacks thiab lwm yam system xav tau kev pab). ) yuav mus rau RAM.
Yog tias peb coj qhov tsawg kawg nkaus config rau STM32F7Discovery (tso tawm tag nrho lub network, tag nrho cov lus txib, ua pawg kom tsawg li tsawg tau, thiab lwm yam) thiab ntxiv OpenCV nrog cov piv txwv nyob ntawd, lub cim xeeb yuav tsum tau ua raws li hauv qab no:
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
Rau cov neeg uas tsis paub txog qhov twg mus qhov twg, kuv yuav piav qhia: hauv .text
ΠΈ .rodata
cov lus qhia thiab qhov tsis tu ncua (hais lus, nyeem ntawv nkaus xwb) pw hauv .data
cov ntaub ntawv yog mutable, .bss
muaj "nulled" variables, uas, txawm li cas los xij, xav tau qhov chaw (qhov no yuav "mus" rau RAM).
Txoj xov zoo yog qhov ntawd .data
/.bss
yuav tsum haum, tab sis nrog .text
Qhov teeb meem yog tias tsuas muaj 1MiB ntawm lub cim xeeb rau daim duab. Muaj peev xwm muab pov tseg .text
daim duab los ntawm cov piv txwv thiab nyeem nws, piv txwv li, los ntawm SD daim npav rau hauv lub cim xeeb ntawm kev pib, tab sis fruits.png hnyav txog 330KiB, yog li qhov no yuav tsis daws qhov teeb meem: feem ntau .text
muaj OpenCV code.
Los ntawm thiab loj, tsuas yog ib qho tseem tshuav - thauj ib feem ntawm cov lej mus rau QSPI flash (nws muaj hom kev ua haujlwm tshwj xeeb rau daim npav nco rau lub tsheb npav, kom lub processor tuaj yeem nkag mus rau cov ntaub ntawv no ncaj qha). Hauv qhov no, ib qho teeb meem tshwm sim: thawj zaug, lub cim xeeb ntawm QSPI flash drive tsis muaj tam sim ntawd tom qab lub cuab yeej rebooted (koj yuav tsum cais pib lub cim xeeb-mapped hom), thiab qhov thib ob, koj tsis tuaj yeem "flash" lub cim xeeb no nrog. ib tug paub bootloader.
Raws li qhov tshwm sim, nws tau txiav txim siab los txuas tag nrho cov cai hauv QSPI, thiab nyem nws nrog tus kheej sau ntawv uas yuav tau txais qhov xav tau binary ntawm TFTP.
tshwm sim
Lub tswv yim los thauj cov tsev qiv ntawv no mus rau Embox tau tshwm sim li ib xyoos dhau los, tab sis ntau zaus nws raug ncua vim muaj ntau yam laj thawj. Ib qho ntawm lawv yog kev txhawb nqa rau libstdc ++ thiab cov tsev qiv ntawv qauv qauv. Qhov teeb meem ntawm C ++ kev txhawb nqa hauv Embox yog dhau qhov kev nthuav dav ntawm tsab xov xwm no, yog li ntawm no kuv tsuas yog hais tias peb tau tswj hwm kom ua tiav qhov kev txhawb nqa no raws li qhov tsim nyog rau lub tsev qiv ntawv no ua haujlwm π
Thaum kawg, cov teeb meem no tau kov yeej (tsawg kawg txaus rau OpenCV piv txwv ua haujlwm), thiab qhov piv txwv tau khiav. Nws siv sijhawm 40 vib nas this ntev rau pawg thawj coj los tshawb nrhiav thaj tsam siv Canny lim. Qhov no, tau kawg, ntev dhau lawm (muaj kev xav txog yuav ua li cas txhawm rau txhim kho qhov teeb meem no, nws yuav muaj peev xwm sau ib tsab xov xwm cais txog qhov no thaum ua tiav).
Txawm li cas los xij, lub hom phiaj nruab nrab yog los tsim cov qauv uas yuav qhia txog qhov tseem ceeb ntawm kev khiav OpenCV ntawm STM32, raws li lub hom phiaj no tau ua tiav, hooray!
tl;dr: step by step cov lus qhia
0: Download Embox qhov chaw, zoo li no:
git clone https://github.com/embox/embox && cd ./embox
1: Cia peb pib los ntawm kev sib sau ua ke bootloader uas yuav "flash" QSPI flash drive.
make confload-arm/stm32f7cube
Tam sim no koj yuav tsum teeb tsa lub network, vim. Peb yuav upload cov duab ntawm TFTP. Txhawm rau teeb tsa lub rooj tsavxwm thiab tus tswv tsev IP chaw nyob, koj yuav tsum hloov kho conf/rootfs/network.
Configuration piv txwv:
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
- chaw nyob ntawm tus tswv tsev los ntawm qhov twg cov duab yuav raug thauj khoom, address
- chaw nyob ntawm lub rooj tsavxwm.
Tom qab ntawd, peb sau lub bootloader:
make
2: Kev thauj khoom ib txwm ntawm lub bootloader (thov txim rau lub pun) ntawm lub rooj tsavxwm - tsis muaj dab tsi tshwj xeeb ntawm no, koj yuav tsum ua nws zoo li rau lwm daim ntawv thov rau STM32F7Discovery. Yog koj tsis paub yuav ua li cas, koj tuaj yeem nyeem txog nws
3: Sau ib daim duab nrog config rau OpenCV.
make confload-platform/opencv/stm32f7discovery
make
4: Extract los ntawm ELF seem yuav tsum tau sau rau QSPI rau 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
Muaj ib tsab ntawv hauv conf directory uas ua qhov no, yog li koj tuaj yeem khiav nws
./conf/qspi_objcopy.sh # ΠΡΠΆΠ½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊ -- build/base/bin/qspi.bin
5: Siv tftp, rub tawm qspi.bin.bin rau QSPI flash drive. Ntawm tus tswv tsev, ua qhov no, luam qspi.bin mus rau hauv paus nplaub tshev ntawm tftp server (feem ntau /srv/tftp/ lossis /var/lib/tftpboot/; pob khoom rau cov neeg siv khoom sib xws muaj nyob rau hauv cov kev faib tawm nrov tshaj plaws, feem ntau hu ua tftpd lossis tftp-hpa, qee zaum koj yuav tsum ua systemctl start tftpd.service
pib).
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π»Ρ tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Ntawm Embox (piv txwv li hauv bootloader), koj yuav tsum ua raws li cov lus txib hauv qab no (peb xav tias lub server muaj qhov chaw nyob 192.168.2.1):
embox> qspi_loader qspi.bin 192.168.2.1
6: Nrog lus txib goto
koj yuav tsum "dhia" rau hauv QSPI nco. Qhov chaw tshwj xeeb yuav txawv nyob ntawm seb cov duab txuas li cas, koj tuaj yeem pom qhov chaw nyob no nrog cov lus txib mem 0x90000000
(qhov chaw pib haum rau qhov thib ob 32-ntsis lo lus ntawm daim duab); koj tseem yuav tau chij lub pawg -s
, qhov chaw nyob yog ntawm 0x90000000, piv txwv li:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
β β
ΡΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΡΠΎ Π°Π΄ΡΠ΅Ρ
ΡΡΡΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠΉ
ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ
embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡΠΆΠ΅Π½ ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ
< ΠΠ°ΡΠΈΠ½Π°Ρ ΠΎΡΡΡΠ΄Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²ΠΎΠ΄ Π½Π΅ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠ°, Π° ΠΎΠ±ΡΠ°Π·Π° Ρ OpenCV >
7: Laib
embox> edges 20
thiab txaus siab rau 40-thib ob ciam teb nrhiav π
Yog hais tias ib yam dab tsi mus tsis ncaj ncees lawm - sau ib qho teeb meem rau hauv
Tau qhov twg los: www.hab.com