ç§ã¯ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®éçºè
ã® XNUMX 人ã§ã
æ€çŽ¢ãšã³ãžã³ã«ãSTM32 ããŒãã® OpenCVããªã©ãšå
¥åãããšããã®ã©ã€ãã©ãªã STM32 ããŒããä»ã®ãã€ã¯ãã³ã³ãããŒã©ã§äœ¿çšããããšã«èå³ããã人ãããªãå€ãèŠã€ãããŸãã
ååããå€æãããšãå¿
èŠãªãã®ã説æãããããªãããã€ããããŸãããéåžž (ç§ãèŠããã¹ãŠã®ãããªã§) STM32 ããŒãã§ã¯ãã«ã¡ã©ããç»åã®ã¿ãåä¿¡ãããã®çµæãç»é¢ã«è¡šç€ºãããŠããŸãããç»ååŠçèªäœã¯ãéåžžã®ã³ã³ãã¥ãŒã¿ãŒãŸãã¯ãã匷åãªããŒã (Raspberry Pi ãªã©) ã§å®è¡ãããŸããã
ãªãé£ããã®ã§ããïŒ
æ€çŽ¢ã¯ãšãªã®äººæ°ã¯ãOpenCV ãæã人æ°ã®ããã³ã³ãã¥ãŒã¿ ããžã§ã³ ã©ã€ãã©ãªã§ãããšããäºå®ã«ãã£ãŠèª¬æãããŸããã€ãŸããããå€ãã®éçºè ã OpenCV ã«ç²ŸéããŠããããã€ã¯ãã³ã³ãããŒã©äžã§ãã¹ã¯ããã察å¿ã®ã³ãŒããå®è¡ã§ãããããéçºããã»ã¹ãå€§å¹ ã«ç°¡çŽ åãããŸãã ãããããªããã®åé¡ã解決ããããã®äººæ°ã®ããæ¢è£œã¬ã·ãããŸã ååšããªãã®ã§ãããã?
å°ããªã·ã§ãŒã«ã§ OpenCV ã䜿çšããå Žåã®åé¡ã¯ã次㮠XNUMX ã€ã®æ©èœã«é¢é£ããŠããŸãã
- æå°éã®ã¢ãžã¥ãŒã« ã»ããã§ã©ã€ãã©ãªãã³ã³ãã€ã«ããå Žåã§ããéåžžã«å€§ããªã³ãŒã (æ°ã¡ã¬ãã€ãã®åœä»€) ãçºçããããã(OS ãèæ ®ããªããŠã) åã STM32F7Discovery ã®ãã©ãã·ã¥ ã¡ã¢ãªã«åãŸããŸããã
- ã©ã€ãã©ãªèªäœã¯ C++ ã§æžãããŠããŸããã€ãŸãã
- ããžãã£ããªã©ã³ã¿ã€ã ïŒäŸå€ãªã©ïŒã®ãµããŒããå¿ èŠ
- çµã¿èŸŒã¿ã·ã¹ãã çšã® OS ã«éåžžèŠããã LibC/Posix ã¯ã»ãšãã©ãµããŒããããŠããŸãããæšæº Plus ã©ã€ãã©ãªãšæšæº STL ãã³ãã¬ãŒã ã©ã€ãã©ãª (ãã¯ãã«ãªã©) ãå¿ èŠã§ãã
Embox ãžã®ç§»æ€
ãã€ãã®ããã«ãããã°ã©ã ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«ç§»æ€ããåã«ãéçºè
ãæå³ãã圢åŒã§ããã°ã©ã ããã«ãããŠã¿ãããšããå§ãããŸãã ç§ãã¡ã®å Žåãããã«åé¡ã¯ãããŸããããœãŒã¹ ã³ãŒãã¯æ¬¡ã®å Žæã«ãããŸãã
幞ããªããšã«ãOpenCV ã¯ããã«äœ¿çšã§ããéçã©ã€ãã©ãªãšããŠæ§ç¯ã§ããããã移æ€ã容æã«ãªããŸãã æšæºæ§æã®ã©ã€ãã©ãªãåéããããããã©ãã ãã®ã¹ããŒã¹ãå ãããã確èªããŸãã åã¢ãžã¥ãŒã«ã¯åå¥ã®ã©ã€ãã©ãªã«åéãããŸãã
> 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)
æåŸã®è¡ãããããããã«ã.bss ãš .data ã¯ããã»ã©ã¹ããŒã¹ãå æããŸããããã³ãŒã㯠70 MiB ãè¶ ããŠããŸãã ãããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«éçã«ãªã³ã¯ãããšãã³ãŒããå°ãªããªãã®ã¯æããã§ãã
æå°éã®ãµã³ãã«ãã¢ã»ã³ãã«ãããããã«ãã§ããã ãå€ãã®ã¢ãžã¥ãŒã«ãç Žæ£ããŠã¿ãŸããã (ããšãã°ãåçŽã« OpenCV ããŒãžã§ã³ãåºåããŸã)ã cmake .. -LA
ãããŠãªãã·ã§ã³ã§ãªãã«ãªããã®ããã¹ãŠãªãã«ããŸãã
-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)
äžæ¹ã§ã¯ãããã¯ã©ã€ãã©ãªã® XNUMX ã€ã®ã¢ãžã¥ãŒã«ã«ãããŸããããä»æ¹ã§ã¯ãããã¯ã³ãŒã ãµã€ãºã®ã³ã³ãã€ã©æé©åãè¡ãããŠããªããã®ã§ã (-Os
ïŒã çŽ 3 MiB ã®ã³ãŒãã¯ãŸã ããªãã®éã§ããããã§ã«æåã®æåŸ
ãæãŠãŸãã
ãšãã¥ã¬ãŒã¿ã§å®è¡ãã
ãšãã¥ã¬ãŒã¿ã§ãããã°ããæ¹ãã¯ããã«ç°¡åãªã®ã§ããŸãã©ã€ãã©ãªã qemu ã§åäœããããšã確èªããŸãã ãšãã¥ã¬ãŒãããããã©ãããã©ãŒã ãšããŠãIntegrator / CP ãéžæããŸããã 第äžã«ããã㯠ARM ã§ãããã第äºã«ãEMbox ã¯ãã®ãã©ãããã©ãŒã ã®ã°ã©ãã£ãã¯åºåããµããŒãããŠããŸãã
Embox ã«ã¯å€éšã©ã€ãã©ãªãæ§ç¯ããããã®ã¡ã«ããºã ããããããã䜿çšã㊠OpenCV ãã¢ãžã¥ãŒã«ãšããŠè¿œå ã (éçã©ã€ãã©ãªã®åœ¢åŒã§ãæå°éã®ããã«ãã«åããªãã·ã§ã³ããã¹ãŠæž¡ããŸã)ããã®åŸã次ã®ãããªåçŽãªã¢ããªã±ãŒã·ã§ã³ãè¿œå ããŸãã
version.cpp:
#include <stdio.h>
#include <opencv2/core/utility.hpp>
int main() {
printf("OpenCV: %s", cv::getBuildInformation().c_str());
return 0;
}
ã·ã¹ãã ãçµã¿ç«ãŠãŠå®è¡ãããšãæåŸ ã©ããã®åºåãåŸãããŸãã
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 вклÑÑÐµÐœÑ Ð² ÑбПÑÐºÑ Ðž Ñ.п.>
次ã®ã¹ãããã¯ãããã€ãã®äŸãã§ããã°éçºè
èªèº«ãæäŸããæšæºçãªäŸã® XNUMX ã€ãå®è¡ããããšã§ãã
çµæããã¬ãŒã ãããã¡ã«çŽæ¥è¡šç€ºããããã«ããã®äŸãå°ãæžãçŽãå¿
èŠããããŸããã ããããå¿
èŠããã£ãããã§ãã é¢æ° imshow()
QTãGTKãããã³ Windows ã€ã³ã¿ãŒãã§ã€ã¹ãéããŠã€ã¡ãŒãžãæç»ã§ããŸããããã¡ãããããã㯠STM32 ã®æ§æã«ã¯å«ãŸããŸããã å®éãQT 㯠STM32F7Discovery äžã§ãå®è¡ã§ããŸãããããã«ã€ããŠã¯å¥ã®èšäºã§èª¬æããŸã ð
ãšããžæ€åºã®çµæãã©ã®åœ¢åŒã§ä¿åãããããç°¡åã«èª¬æããåŸãç»åãååŸããŸãã
åç»
çµæ
STM32F7Discovery ã§å®è¡
32F746GDISCOVERY ã«ã¯ãäœããã®æ¹æ³ã§äœ¿çšã§ããããŒããŠã§ã¢ ã¡ã¢ãª ã»ã¯ã·ã§ã³ãããã€ããããŸãã
- 320KiB RAM
- ç»åçšã® 1MiB ãã©ãã·ã¥
- 8MiB SDRAM
- 16MiB QSPI NAND ãã©ãã·ã¥
- microSDã«ãŒãã¹ããã
SD ã«ãŒãã¯ã€ã¡ãŒãžã®ä¿åã«äœ¿çšã§ããŸãããæå°éã®ãµã³ãã«ãå®è¡ãããšãã芳ç¹ã§ã¯ãããŸã圹ã«ç«ã¡ãŸããã
ãã£ã¹ãã¬ã€ã®è§£å床㯠480Ã272 ã§ããããã¯ããã¬ãŒã ãããã¡ ã¡ã¢ãªã 522 ãããã®æ·±ã㧠240 ãã€ãã«ãªãããšãæå³ããŸãã ãã㯠RAM ã®ãµã€ãºãè¶
ããããããã¬ãŒã ãããã¡ãšããŒã (ç»åãè£å©æ§é ã®ããŒã¿ãä¿åããããã« OpenCV ãå«ã) 㯠SDRAM ã«é
眮ããããã®ä»ãã¹ãŠ (ã¹ã¿ãã¯çšã®ã¡ã¢ãªããã®ä»ã®ã·ã¹ãã ããŒãº) ) 㯠RAM ã«ç§»åããŸãã
STM32F7Discovery ã®æå°æ§æ (ãããã¯ãŒã¯å šäœããã¹ãŠã®ã³ãã³ããç Žæ£ãã¹ã¿ãã¯ãã§ããã ãå°ãããããªã©) ã䜿çšããããã«ãµã³ãã«ãå«ã OpenCV ãè¿œå ãããšãå¿ èŠãªã¡ã¢ãªã¯æ¬¡ã®ããã«ãªããŸãã
text data bss dec hex filename
2876890 459208 312736 3648834 37ad42 build/base/bin/embox
ã©ã®ã»ã¯ã·ã§ã³ãã©ãã«ããã®ãããããããªã人ã®ããã«ã次ã®ããã«èª¬æããŸãã .text
О .rodata
åœä»€ãšå®æ° (倧ãŸãã«èšãã°ãèªã¿åãå°çšããŒã¿) ã¯æ¬¡ã®å Žæã«ãããŸãã .data
ããŒã¿ã¯å€æŽå¯èœã§ãã .bss
ãnullãå€æ°ããããŸãããããã§ãå Žæãå¿
èŠã§ã (ãã®ã»ã¯ã·ã§ã³ã¯ RAM ã«ã移åãããŸã)ã
è¯ããã¥ãŒã¹ã¯ .data
/.bss
é©åããã¯ãã§ããã .text
åé¡ã¯ãç»åçšã®ã¡ã¢ãªã 1MiB ãããªãããšã§ãã æšãŠããã .text
äŸã®ç»åãååŸããŠãããšãã°èµ·åæã« SD ã«ãŒãããã¡ã¢ãªã«èªã¿èŸŒã¿ãŸãããfruits.png ã®éãã¯çŽ 330KiB ãªã®ã§ãããã§ã¯åé¡ã¯è§£æ±ºãããŸããã .text
OpenCVã³ãŒãã§æ§æãããŠããŸãã
æŠããŠãæ®ã£ãŠããããšã¯ XNUMX ã€ã ãã§ããã³ãŒãã®äžéšã QSPI ãã©ãã·ã¥ã«ããŒãããããšã§ã (ããã»ããµããã®ããŒã¿ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããããã«ãã¡ã¢ãªãã·ã¹ãã ãã¹ã«ãããã³ã°ããç¹å¥ãªåäœã¢ãŒãããããŸã)ã ãã®å Žåãåé¡ãçºçããŸãããŸããããã€ã¹ãåèµ·åããçŽåŸã«ã¯ QSPI ãã©ãã·ã¥ ãã©ã€ãã®ã¡ã¢ãªã䜿çšã§ããªããªããŸã (ã¡ã¢ãª ãããã ã¢ãŒããåå¥ã«åæåããå¿ èŠããããŸã)ã次ã«ããã®ã¡ã¢ãªããã®ã¡ã¢ãªã§ããã©ãã·ã¥ãããããšã¯ã§ããŸãããããªãã¿ã®ããŒãããŒããŒã
ãã®çµæãQSPI å ã®ãã¹ãŠã®ã³ãŒãããªã³ã¯ããTFTP çµç±ã§å¿ èŠãªãã€ããªãåãåãèªäœã®ããŒããŒã§ãã©ãã·ã¥ããããšã決å®ãããŸããã
çµæ
ãã®ã©ã€ãã©ãªã Embox ã«ç§»æ€ãããšããã¢ã€ãã¢ã¯çŽ XNUMX 幎åã«çŸããŸããããããŸããŸãªçç±ã«ããäœåºŠã延æãããŸããã ãã® XNUMX ã€ã¯ãlibstdc++ ãšæšæºãã³ãã¬ãŒã ã©ã€ãã©ãªã®ãµããŒãã§ãã Embox ã§ã® C++ ãµããŒãã®åé¡ã¯ãã®èšäºã®ç¯å²ãè¶ ããŠãããããããã§ã¯ããã®ã©ã€ãã©ãªãåäœããããã«é©åãªéã®ãµããŒããéæã§ããããšã ããè¿°ã¹ãŠãããŸã ð
æçµçã«ããããã®åé¡ã¯å æãã (å°ãªããšã OpenCV ãµã³ãã«ãåäœããã«ã¯åå)ããµã³ãã«ã¯å®è¡ãããŸããã ããŒãã Canny ãã£ã«ã¿ãŒã䜿çšããŠå¢çãæ€çŽ¢ããã«ã¯ã40 ç§ã»ã©ããããŸãã ãã¡ãããããã¯é·ãããŸã (ãã®åé¡ãæé©åããæ¹æ³ã«ã€ããŠã¯èæ ®äºé ããããæåããå Žåã«ã¯ããã«ã€ããŠå¥ã®èšäºãæžãããšãå¯èœã§ã)ã
ãã ããäžéç®æšã¯ãSTM32 äžã§ OpenCV ãå®è¡ããåºæ¬çãªå¯èœæ§ã瀺ããããã¿ã€ããäœæããããšã§ããããã®ç®æšã¯éæãããŸãããäžæ³ã§ãã
tl;dr: ã¹ããããã€ã¹ãããã®èª¬æ
0: 次ã®ããã« Embox ãœãŒã¹ãããŠã³ããŒãããŸãã
git clone https://github.com/embox/embox && cd ./embox
1: QSPI ãã©ãã·ã¥ ãã©ã€ããããã©ãã·ã¥ãããããŒãããŒããŒãçµã¿ç«ãŠãããšããå§ããŸãããã
make confload-arm/stm32f7cube
次ã«ããããã¯ãŒã¯ãæ§æããå¿ èŠããããŸãã TFTPçµç±ã§ç»åãã¢ããããŒãããŸãã ããŒããšãã¹ãã® IP ã¢ãã¬ã¹ãèšå®ããã«ã¯ãconf/rootfs/network ãç·šéããå¿ èŠããããŸãã
èšå®äŸïŒ
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
- ã€ã¡ãŒãžã®ããŒãå
ã®ãã¹ã ã¢ãã¬ã¹ã address
- ããŒãã®ã¢ãã¬ã¹ã
ãã®åŸãããŒãããŒããŒãåéããŸãã
make
2: ããŒãäžã®ããŒãããŒããŒã®éåžžã®ããŒã (é§æŽèœã§ããããªãã) - ããã«ã¯ç¹ã«äœããããŸãããSTM32F7Discovery ã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ãšåæ§ã«è¡ãå¿
èŠããããŸãã ããæ¹ãããããªãå Žåã¯ãããã«ã€ããŠèªãããšãã§ããŸã
3: OpenCV ã®æ§æã䜿çšããŠã€ã¡ãŒãžãã³ã³ãã€ã«ããŸãã
make confload-platform/opencv/stm32f7discovery
make
4: QSPI ã«æžã蟌ã ELF ã»ã¯ã·ã§ã³ã 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
ãããè¡ãã¹ã¯ãªããã conf ãã£ã¬ã¯ããªã«ããã®ã§ããããå®è¡ã§ããŸãã
./conf/qspi_objcopy.sh # ÐÑжМÑй бОМаÑМОк -- build/base/bin/qspi.bin
5: tftp ã䜿çšããŠãqspi.bin.bin ã QSPI ãã©ãã·ã¥ ãã©ã€ãã«ããŠã³ããŒãããŸãã ãã¹ãäžã§ãããè¡ãã«ã¯ãqspi.bin ã tftp ãµãŒããŒã®ã«ãŒã ãã©ã«ã㌠(é垞㯠/srv/tftp/ ãŸã㯠/var/lib/tftpboot/) ã«ã³ããŒããŸãã察å¿ãããµãŒããŒã®ããã±ãŒãžã¯ãéåžž ãšåŒã°ããæãäžè¬çãªãã£ã¹ããªãã¥ãŒã·ã§ã³ã§å
¥æã§ããŸãã tftpd ãŸã㯠tftp-hpaãå Žåã«ãã£ãŠã¯ããããå¿
èŠããããŸã systemctl start tftpd.service
å§ããããšïŒã
# ваÑÐžÐ°ÐœÑ ÐŽÐ»Ñ tftpd
sudo cp build/base/bin/qspi.bin /srv/tftp
# ваÑÐžÐ°ÐœÑ ÐŽÐ»Ñ tftp-hpa
sudo cp build/base/bin/qspi.bin /var/lib/tftpboot
Embox (ã€ãŸããããŒãããŒããŒå ) ã§ã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸã (ãµãŒããŒã®ã¢ãã¬ã¹ã¯ 192.168.2.1 ã§ãããšä»®å®ããŸã)ã
embox> qspi_loader qspi.bin 192.168.2.1
6: ã³ãã³ããã goto
QSPI ã¡ã¢ãªã«ããžã£ã³ããããå¿
èŠããããŸãã å
·äœçãªå Žæã¯ç»åã®ãªã³ã¯æ¹æ³ã«ãã£ãŠç°ãªããŸãããã®ã¢ãã¬ã¹ã¯æ¬¡ã®ã³ãã³ãã§ç¢ºèªã§ããŸãã mem 0x90000000
(éå§ã¢ãã¬ã¹ã¯ã€ã¡ãŒãžã® 32 çªç®ã® XNUMX ããã ã¯ãŒãã«åãŸããŸã); ã¹ã¿ãã¯ã«ãã©ã°ãç«ãŠãå¿
èŠããããŸã -s
ãã¹ã¿ã㯠ã¢ãã¬ã¹ã¯ 0x90000000 ã§ããäŸ:
embox>mem 0x90000000
0x90000000: 0x20023200 0x9000c27f 0x9000c275 0x9000c275
â â
ÑÑП аЎÑÐµÑ ÑÑП аЎÑеÑ
ÑÑÑка пеÑвПй
ОМÑÑÑÑкÑОО
embox>goto -i 0x9000c27f -s 0x20023200 # Ѐлаг -i ÐœÑжеМ ÑÑÐŸÐ±Ñ Ð·Ð°Ð¿ÑеÑОÑÑ Ð¿ÑеÑÑÐ²Ð°ÐœÐžÑ Ð²ÐŸ вÑÐµÐŒÑ ÐžÐœÐžÑОалОзаÑОО ÑОÑÑеЌÑ
< ÐаÑÐžÐœÐ°Ñ ÐŸÑÑÑЎа бÑÐŽÐµÑ Ð²ÑвПЎ Ме загÑÑзÑОка, а ПбÑаза Ñ OpenCV >
7: æã¡äžã
embox> edges 20
40 ç§éã®åœå¢æ¢çŽ¢ãã楜ãã¿ãã ãã ð
äœãåé¡ãçºçããå Žåã¯ãåé¡ãæžã蟌ãã§ãã ãã
åºæïŒ habr.com