MepeeCV na STM32F7-Nchọpụta

MepeeCV na STM32F7-Nchọpụta Abụ m otu n'ime ndị nrụpụta sistemụ arụmọrụ igbe igbe, na n'isiokwu a, m ga-ekwu maka otu m siri mee OpenCV na bọọdụ STM32746G.

Ọ bụrụ na ị pịnye ihe dị ka “OpenCV na bọọdụ STM32” n'ime igwe nchọta, ị nwere ike ịhụ ọtụtụ ndị nwere mmasị iji ọbá akwụkwọ a na bọọdụ STM32 ma ọ bụ microcontrollers ndị ọzọ.
Enwere vidiyo dị iche iche nke, na-ekpe ikpe site na aha, kwesịrị igosipụta ihe achọrọ, mana ọ na-abụkarị (na vidiyo niile m hụrụ) na bọọdụ STM32, naanị na-enweta onyonyo site na igwefoto wee gosipụta nsonaazụ na ihuenyo, yana A na-eme nhazi onyonyo n'onwe ya ma ọ bụ na kọmpụta oge niile, ma ọ bụ na bọọdụ dị ike karịa (dịka ọmụmaatụ, Raspberry Pi).

Gịnị mere nke a ji esi ike?

A na-akọwa ewu ewu nke ajụjụ ọchụchọ site n'eziokwu ahụ bụ na OpenCV bụ ọbá akwụkwọ ọhụụ kọmputa kachasị ewu ewu, nke pụtara na ọtụtụ ndị mmepe maara ya nke ọma, na ikike ịme koodu dị njikere na desktọpụ na microcontroller na-eme ka usoro mmepe ahụ dịkwuo mfe. Ma gịnị mere na-enwekwa ndị na-ewu ewu na-emere Ezi ntụziaka maka idozi nsogbu a?

Nsogbu dị na iji OpenCV na obere bọọdụ metụtara atụmatụ abụọ:

  • Ọ bụrụ na ị na-achịkọta ọba akwụkwọ ahụ ọbụlagodi na obere modul, ọ gaghị adaba na ebe nchekwa flash nke otu STM32F7Discovery (ọbụlagodi na-eburu n'uche OS) n'ihi koodu buru ibu (ọtụtụ megabyte ntuziaka)
  • Edere ọbá akwụkwọ n'onwe ya na C++, nke pụtara
    • Anyị chọrọ nkwado maka oge ịgba ọsọ dị mma (wepu, wdg)
    • Enwere obere nkwado maka LibC/Posix, nke a na-ahụkarị na OS maka sistemu agbakwunyere - ịchọrọ ọkọlọtọ gbakwunyere ọba akwụkwọ yana ọba akwụkwọ ndebiri STL ọkọlọtọ (vector, wdg)

Na-ebufe na igbe igbe

Dị ka ọ dị na mbụ, tupu ibuga mmemme ọ bụla na sistemụ arụmọrụ, ọ dị mma ịgbalị ịchịkọta ya n'ụdị nke ndị nrụpụta chọrọ ya. N'ọnọdụ anyị, enweghị nsogbu na nke a - enwere ike ịchọta koodu isi na github, A na-achịkọta ọba akwụkwọ n'okpuru GNU/Linux na cmake mgbe niile.

Ozi ọma ahụ bụ na enwere ike wulite OpenCV site na igbe dị ka ọbá akwụkwọ kwụ ọtọ, nke na-eme ka mbubata ngwa ngwa dị mfe. Anyị na-agbakọta ọbá akwụkwọ ahụ na nhazi ọkọlọtọ wee hụ ókè ohere ọ na-ewe. A na-achịkọta modul ọ bụla n'ọba akwụkwọ dị iche.

> 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)

Dịka ị nwere ike ịhụ site na ahịrị ikpeazụ, .bss na .data anaghị ewepụta ohere dị ukwuu, mana koodu ahụ karịrị 70 MiB. O doro anya na ọ bụrụ na nke a jikọtara ya na ngwa ngwa, a ga-enwe obere koodu.

Ka anyị gbalịa ịtụfu modul dị ka o kwere mee iji mepụta ntakịrị ihe atụ (nke, dịka ọmụmaatụ, ga-egosipụta ụdị OpenCV naanị), yabụ ka anyị lelee anya. cmake .. -LA ma gbanyụọ na nhọrọ ihe ọ bụla nwere nkwarụ.

        -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)

N'otu aka ahụ, nke a bụ naanị otu modul ọbá akwụkwọ, n'aka nke ọzọ, nke a bụ na-enweghị njikarịcha site n'aka onye na-achịkọta maka nha koodu (code).-Os). ~ 3 MiB nke koodu ka dị ọtụtụ, mana ọ na-enyelarị olile anya maka ịga nke ọma.

Na-agba ọsọ na emulator

Ọ dị mfe ịmegharị na emulator, yabụ na mbụ anyị ga-ahụ na ọbá akwụkwọ na-arụ ọrụ na qemu. M họọrọ Integrator/CP dị ka ikpo okwu e ṅomiri, n'ihi na ... Nke mbụ, ọ bụkwa ARM, na nke abụọ, Embox na-akwado mmepụta eserese maka ikpo okwu a.

Embox nwere usoro iji wuo ọba akwụkwọ ndị dị n'èzí, site n'enyemaka ya, anyị na-agbakwunye OpenCV dị ka modul (na-agafe otu nhọrọ niile maka mgbakọ "obere" n'ụdị ọba akwụkwọ static), mgbe nke ahụ gasịrị, m na-agbakwunye ngwa dị mfe nke dị ka nke a:

version.cpp:

#include <stdio.h>
#include <opencv2/core/utility.hpp>

int main() {
    printf("OpenCV: %s", cv::getBuildInformation().c_str());

    return 0;
}

Anyị na-agbakọta usoro ahụ, na-agba ya, ma nweta mmepụta a tụrụ anya ya.

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 включены в сборку и т.п.>

Nzọụkwụ ọzọ bụ ịgba ọsọ ụfọdụ atụ, ọkacha mma ụfọdụ ọkọlọtọ nke ndị mmepe n'onwe ha na-enye na saịtị gị. Ahọrọ m Ihe nchọpụta oke ala.

Ekwesịrị ka edegharị ihe atụ ahụ ntakịrị iji gosipụta onyonyo nsonaazụ ozugbo n'ime ebe nchekwa. Ekwesịrị m ime nke a n'ihi na... ọrụ imshow() nwere ike ise foto site na QT, GTK na Windows interfaces, nke, n'ezie, agaghị adị na nhazi maka STM32. N'ezie, QT nwekwara ike na-agba ọsọ na STM32F7Discovery, ma nke a ga-atụle n'isiokwu ọzọ :)

Mgbe anyị nyochachara nkenke kpọmkwem ụdị usoro nke ihe nchọta ihu na-echekwara, anyị na-enweta onyonyo.

MepeeCV na STM32F7-Nchọpụta

Foto izizi

MepeeCV na STM32F7-Nchọpụta

N'ihi

Na-agba ọsọ na STM32F7Discovery

32F746GDISCOVERY nwere ọtụtụ ngalaba ebe nchekwa ngwaike anyị nwere ike iji n'otu ụzọ ma ọ bụ ọzọ.

  1. 320 KiB RAM
  2. Ebe nchekwa 1MiB maka onyonyo
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND flash mbanye
  5. Oghere kaadị MicroSD

Enwere ike iji kaadị SD na-echekwa onyonyo, mana n'ihe gbasara ịme obere ihe atụ nke a anaghị aba uru.
Ngosipụta ahụ nwere mkpebi nke 480x272, nke pụtara na ebe nchekwa maka framebuffer ga-abụ 522 bytes na omimi nke 240 bits, ya bụ. nke a dị ukwuu karịa nha RAM, ya mere framebuffer na ikpo (nke a ga-achọrọ, n'etiti ihe ndị ọzọ, maka OpenCV iji chekwaa data maka ihe oyiyi na ihe inyeaka) ga-adị na SDRAM, ihe ọ bụla ọzọ (ncheta maka stacks na usoro ndị ọzọ). mkpa) ga-aga RAM .

Ọ bụrụ na anyị ewere nhazi kacha nta maka STM32F7Discovery (tụpụ netwọkụ niile, iwu niile, mee ka ngwugwu dị obere ka enwere ike, wdg) wee tinye OpenCV na ihe atụ ebe ahụ, ebe nchekwa achọrọ ga-abụ ihe ndị a:

   text    data     bss     dec     hex filename
2876890  459208  312736 3648834  37ad42 build/base/bin/embox

Maka ndị na-amaghị nke ọma na ngalaba na-aga ebe, ka m kọwaa: in .text и .rodata nwere ntuziaka na nkwubi okwu (na-ekwu okwu, naanị data na-agụ), na .data enwere data nwere ike ịgbanwe .bss enwere mgbanwe "zeroed", nke, ka o sina dị, chọrọ ohere (ngalaba a "ga-aga" na RAM).

Ozi ọma ahụ bụ .data/.bss kwesịrị dabara, ma na .text Nsogbu a bụ na enwere naanị 1MiB nke ebe nchekwa maka onyonyo a. Enwere ike ịtụfu ya .text onyonyo site na ihe atụ wee gụọ ya, dịka ọmụmaatụ, site na kaadị SD n'ime ebe nchekwa na mmalite, mana fruit.png dị ihe dịka 330KiB, yabụ nke a agaghị edozi nsogbu ahụ: ọtụtụ. .text nwere koodu OpenCV kpọmkwem.

N'ozuzu, enwere naanị otu ihe fọdụrụ - itinye akụkụ nke koodu ahụ na draịvụ flash QSPI (o nwere ọnọdụ ọrụ pụrụ iche maka ebe nchekwa eserese na bọs sistemụ, ka onye nrụpụta wee nweta data a ozugbo). N'okwu a, nsogbu na-ebilite: nke mbụ, ebe nchekwa QSPI flash drive adịghị ozugbo ka ịmalitegharịa ngwaọrụ ahụ (ọnọdụ ebe nchekwa ga-amalite iche iche), na nke abụọ, ọ gaghị ekwe omume iji "flash" ebe nchekwa a. mbụ bootloader.

N'ihi nke a, e kpebiri ijikọ koodu niile na QSPI wee jiri bootloader dee onwe ya, nke ga-enweta ọnụọgụ abụọ achọrọ site na TFTP.

N'ihi

Echiche ibubata ọba akwụkwọ a na Embox pụtara ihe dị ka otu afọ gara aga, mana e yigharịrị ya ugboro ugboro n'ihi ihe dị iche iche. Otu n'ime ha bụ nkwado maka libstdc++ yana ọba akwụkwọ ndebiri ọkọlọtọ. Nsogbu nke nkwado C ++ na Embox karịrị nke isiokwu a, yabụ ebe a ka m ga-ekwu na anyị jisiri ike nweta nkwado a ruo n'ókè achọrọ ka ọbá akwụkwọ a rụọ ọrụ :)

N'ikpeazụ, a meriri nsogbu ndị a (opekata mpe maka ihe atụ OpenCV ka ọ rụọ ọrụ), ihe atụ ahụ gbakwara. Ọ na-ewe bọọdụ 40 ogologo sekọnd iji chọọ ókèala site na iji Canny filter. Nke a, n'ezie, dị ogologo (enwere echiche banyere otu esi ebuli okwu a, enwere ike dee isiokwu dị iche banyere nke a ma ọ bụrụ na ọ ga-aga nke ọma).

MepeeCV na STM32F7-Nchọpụta

Agbanyeghị, ebumnuche etiti bụ imepụta prototype nke ga-egosi ohere dị mkpa nke ịgba ọsọ OpenCV na STM32, yabụ e mezuru ebumnuche a, ngwa ngwa!

tl;dr: ntuziaka nzọụkwụ site nzọụkwụ

0: Budata isi mmalite Embox, dịka ọmụmaatụ:

    git clone https://github.com/embox/embox && cd ./embox

1: Ka anyị bido site n'ịchịkọta bootloader nke ga-ebufe draịva QSPI.

    make confload-arm/stm32f7cube

Ugbu a ịkwesịrị ịhazi netwọkụ ahụ, n'ihi na ... Anyị ga-ebudata onyonyo a site na TFTP. Iji tọọ adreesị IP nke bọọdụ na onye ọbịa, ịkwesịrị idezi conf / mgbọrọgwụ / netwọkụ.

Ọmụmaatụ nhazi:

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 - adreesị nnabata site na ebe a ga-ebugo ihe onyonyo a, address - adreesị osisi.

Mgbe nke ahụ gasịrị, anyị na-achịkọta bootloader:

    make

2: Nbudata nke bootloader nkịtị (mgbaghara pun) na bọọdụ - ọ nweghị akọwapụtara ebe a, ịkwesịrị ịme ya dịka ngwa ọ bụla ọzọ maka STM32F7Discovery. Ọ bụrụ na ị maghị ka esi eme nke a, ị nwere ike ịgụ banyere ya ebe a.
3: Na-achịkọta onyonyo na nhazi maka OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Wepụ akụkụ site na ELF nke achọrọ ka edegara QSPI n'ime 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

Enwere edemede na ndekọ conf na-eme nke a, yabụ ị nwere ike ịme ya

    ./conf/qspi_objcopy.sh # Нужный бинарник -- build/base/bin/qspi.bin

5: Iji tftp, buo qspi.bin.bin na draịva QSPI. Na onye ọbịa, iji mee nke a, ịkwesịrị idetuo qspi.bin na nchekwa mgbọrọgwụ nke sava tftp (na-abụkarị / srv/tftp/ ma ọ bụ /var/lib/tftpboot/; ngwugwu maka ihe nkesa kwekọrọ dị na nkesa kachasị ewu ewu). , a na-akpọkarị tftpd ma ọ bụ tftp-hpa, mgbe ụfọdụ ị ga-eme ya systemctl start tftpd.service ibido).

    # вариант для tftpd
    sudo cp build/base/bin/qspi.bin /srv/tftp
    # вариант для tftp-hpa
    sudo cp build/base/bin/qspi.bin /var/lib/tftpboot

Na Embox (ya bụ na bootloader) ịkwesịrị ịme iwu na-esonụ (anyị chere na ihe nkesa ahụ nwere adreesị 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Iji iwu goto ịkwesịrị 'ịwụlikwa' n'ime ebe nchekwa QSPI. Ebe a kapịrị ọnụ ga-adịgasị iche dabere n'otu esi ejikọta onyonyo a, ị nwere ike ịlele adreesị a na iwu mem 0x90000000 (adreesị mmalite dabara na okwu 32-bit nke abụọ nke onyonyo a); ị ga-achọkwa ịtọ ọkọlọtọ njupụta -s, adreesị nchịkọta dị na 0x90000000, ọmụmaatụ:

    embox>mem 0x90000000
    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275
                      ↑           ↑
              это адрес    это  адрес 
                стэка        первой
                           инструкции

    embox>goto -i 0x9000c27f -s 0x20023200 # Флаг -i нужен чтобы запретить прерывания во время инициализации системы

    < Начиная отсюда будет вывод не загрузчика, а образа с OpenCV >

7: Mwepụta

    embox> edges 20

ma nwee ọ enjoyụ n'ọchịchọ 40 nke abụọ maka oke :)

Ọ bụrụ na ihe na-aga nke ọma, degara ya mbipụta ebe nchekwa anyị, ma ọ bụ na akwụkwọ akụkọ [email protected], ma ọ bụ na a ikwu ebe a.

isi: www.habr.com

Tinye a comment