OpenCV ntawm STM32F7-Discovery

OpenCV ntawm STM32F7-Discovery Kuv yog ib tug ntawm cov developers ntawm lub operating system Embox, thiab nyob rau hauv tsab xov xwm no kuv yuav tham txog yuav ua li cas kuv tswj kom khiav OpenCV ntawm lub rooj tsavxwm STM32746G.

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 github, lub tsev qiv ntawv yog tsim nyob rau hauv GNU / Linux nrog rau ib txwm cmake.

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. ntawm koj qhov chaw. kuv xaiv ciam teb detector canny.

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.

OpenCV ntawm STM32F7-Discovery

daim duab qub

OpenCV ntawm STM32F7-Discovery

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

  1. 320 KiB RAM
  2. 1 MiB flash rau duab
  3. 8 MiB SDRAM
  4. 16 MiB QSPI NAND Flash
  5. 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).

OpenCV ntawm STM32F7-Discovery

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 S, SΡ“S,.
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 peb repository, los yog mus rau daim ntawv xa ntawv [email tiv thaiv], los yog nyob rau hauv ib tug saib ntawm no.

Tau qhov twg los: www.hab.com

Ntxiv ib saib