OpenCV i runga i te STM32F7-Discovery

OpenCV i runga i te STM32F7-Discovery Ko ahau tetahi o nga kaihanga o te punaha whakahaere Embox, a i roto i tenei tuhinga ka korero ahau mo te pehea i whakahaere ai ahau i te OpenCV i runga i te poari STM32746G.

Mena ka patohia e koe tetahi mea penei i te "OpenCV i runga i te papa STM32" ki roto i te miihini rapu, ka kitea e koe etahi tangata e pirangi ana ki te whakamahi i tenei whare pukapuka i runga i nga papa STM32 me etahi atu microcontrollers.
He maha nga ataata, ma te whakatau i te ingoa, me whakaatu nga mea e hiahiatia ana, engari ko te nuinga (i nga ataata katoa i kite ahau) i runga i te papa STM32, ko te ahua anake i riro mai i te kamera ka whakaatuhia te hua ki te mata, a ko te tukatuka whakaahua i mahia i runga rorohiko noa, i runga ranei i nga papa kaha ake (hei tauira, Raspberry Pi).

He aha te take uaua?

Ko te rongonui o nga patai rapu e whakamaramahia ana e te mea ko OpenCV te whare pukapuka tirohanga rorohiko tino rongonui, ko te tikanga he maha nga kaiwhakawhanake e mohio ana ki a ia, a, ko te kaha ki te whakahaere i te waehere kua rite ki te papamahi i runga i te microcontroller ka tino ngawari te mahi whanaketanga. Engari he aha te take kaore ano kia rongonui nga tohutao kua oti te hanga hei whakaoti i tenei raru?

Ko te raru o te whakamahi OpenCV i runga i nga kaakahu iti e pa ana ki nga waahanga e rua:

  • Mena ka whakahiatohia e koe te whare pukapuka ahakoa he iti noa nga waahanga, kaore e uru ki roto i te mahara flash o taua STM32F7Discovery (ahakoa me te kore e whai whakaaro ki te OS) na te nui o te waehere (he maha nga megabytes o nga tohutohu)
  • Ko te whare pukapuka ake kua tuhia ki te C++, ko te tikanga
    • Me tautoko mo te wa whakahaere pai (he rereke, aha atu.)
    • He iti te tautoko mo LibC/Posix, e kitea ana i roto i te OS mo nga punaha whakauru - me hiahia koe ki tetahi whare pukapuka paerewa me tetahi whare pukapuka tauira STL (vector, etc.)

Te kawe ki te Embox

Ka rite ki o mua, i mua i te kawe i nga kaupapa ki te punaha whakahaere, he pai ki te ngana ki te hanga kia rite ki ta nga kaihanga i whakaaro ai. I roto i to maatau, kaore he raruraru ki tenei - ka kitea te waehere puna i runga github, ka hangaia te whare pukapuka i raro i te GNU/Linux me te cmake o mua.

Ko te rongo pai ko te OpenCV ka taea te hanga hei whare pukapuka pateko i waho o te pouaka, he maamaa ake te tauranga. Ka kohia e matou he whare pukapuka me te whirihora paerewa ka kite i te nui o te waahi ka pau. Ka kohia ia kōwae ki tētahi whare pukapuka motuhake.

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

Ka taea e koe te kite mai i te rarangi whakamutunga, .bss me .data e kore e nui te waahi, engari ko te waehere he nui atu i te 70 MiB. He maamaa mena ka honoa tenei ki tetahi tono motuhake, ka iti ake te waehere.

Me ngana ki te maka i te maha o nga waahanga ka taea kia kohia he tauira iti (hei tauira, ka whakaputa noa i te putanga OpenCV), na reira ka titiro tatou cmake .. -LA ka whakawetohia i roto i nga whiringa nga mea katoa ka huri.

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

I tetahi taha, kotahi noa tenei waahanga o te whare pukapuka, i tetahi atu taha, kaore he arotautanga whakahiato mo te rahi o te waehere (-Os). ~3 He nui tonu te MiB o te waehere, engari he tumanako mo te angitu.

Rere i roto i te emulator

He maamaa ake te patuiro i runga i te emulator, na me matua mohio kei te mahi te whare pukapuka ki runga qemu. Ka rite ki te turanga emulated, i whiriwhiria e ahau Integrator / CP, no te mea tuatahi, he ARM ano, tuarua, kei te tautoko a Embox i nga whakaputanga whakairoiro mo tenei turanga.

Kei a Embox tetahi tikanga mo te hanga whare pukapuka o waho, ma te whakamahi ka taapirihia e matou te OpenCV hei kōwae (whakawhitihia nga whiringa katoa mo te hanga "iti" i roto i te ahua o nga whare pukapuka tuuturu), i muri i tera ka taapirihia e au he tono ngawari penei:

version.cpp:

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

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

    return 0;
}

Ka whakaemihia e matou te punaha, ka whakahaere - ka whiwhi matou i te putanga e tumanakohia ana.

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

Ko te mahi e whai ake nei ko te whakahaere i etahi tauira, he pai ake ko tetahi o nga paerewa e tukuna ana e nga kaihanga ake. i runga i to pae. I whiriwhiria e au kaitao taitapa canny.

Me tuhi paku ano te tauira hei whakaatu i te ahua me te hua tika ki roto i te papaatanga anga. Me mahi ahau i tenei, na te mea. mahi imshow() Ka taea e koe te tuhi whakaahua ma roto i nga hononga QT, GTK me te Matapihi, ko te tikanga, kaore e uru ki te whirihora mo STM32. Inaa, ka taea hoki te whakahaere a QT i runga i te STM32F7Discovery, engari ka korerohia tenei i tetahi atu tuhinga 🙂

Whai muri i te whakamaarama poto i roto i te whakatakotoranga e rongoa ana te hua o te kaitao mata, ka whiwhi tatou i tetahi ahua.

OpenCV i runga i te STM32F7-Discovery

pikitia taketake

OpenCV i runga i te STM32F7-Discovery

hua

Rere ana i runga i te STM32F7Discovery

I runga i te 32F746GDISCOVERY he maha nga waahanga mahara taputapu ka taea e tatou te whakamahi i tetahi huarahi, i tetahi atu

  1. 320KiB RAM
  2. 1MiB flash mo te ahua
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. mokamoka kāri microSD

Ka taea te whakamahi i te kaari SD ki te penapena whakaahua, engari i roto i te horopaki o te whakahaere i tetahi tauira iti, kaore tenei i te tino whai hua.
Ko te whakaaturanga he 480 × 272 taumira, ko te tikanga ko te whakamaharatanga framebuffer ka 522 paita i te hohonu o te 240 bits, i.e. he nui ake tenei i te rahi o te RAM, no reira ko te framebuffer me te puranga (e hiahiatia ana, tae atu ki te OpenCV, hei penapena raraunga mo nga whakaahua me nga hanganga awhina) ka noho ki SDRAM, nga mea katoa (te mahara mo nga puranga me etahi atu hiahia o te punaha. ) ka haere ki te RAM .

Mena ka tangohia e tatou te iti rawa o te whirihora mo STM32F7Discovery (peia katoatia te whatunga, nga whakahau katoa, hanga i nga taapu kia iti rawa, me etahi atu) ka taapiri atu i a OpenCV me etahi tauira ki reira, ka penei te mahara e whai ake nei:

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

Mo te hunga kaore i tino mohio ki nga waahanga e haere ana ki hea, ka whakamarama ahau: in .text и .rodata Ko nga tohutohu me nga taurite (he korero noa, he korero panui anake) kei roto .data he rereke nga raraunga, .bss he "nulled" taurangi, ahakoa, me whai waahi (ka "haere" tenei waahanga ki te RAM).

Ko te rongo pai ko tera .data/.bss me uru, engari me .text Ko te raruraru he 1MiB anake te mahara mo te ahua. Ka taea te maka ki waho .text te pikitia mai i te tauira me te panui, hei tauira, mai i te kaari SD ki te mahara i te tiimatanga, engari ko te fruits.png he 330KiB te taumaha, no reira kaore tenei e whakaoti i te raru: te nuinga .text kei roto te waehere OpenCV.

I te nuinga, kotahi noa te mea e toe ana - te uta i tetahi waahanga o te waehere ki runga i te rama QSPI (kei a ia he aratau mahi motuhake mo te mapi mahara ki te pahi punaha, kia uru tika ai te tukatuka ki enei raraunga). I tenei keehi, ka puta he raru: tuatahi, kaore i te waatea te mahara o te puku kohiko QSPI i muri tonu i te whakaara ano o te taputapu (me wehe kee koe i te aratau mapi-mahara), tuarua, kaore e taea e koe te "whakawhiti" i tenei mahara. he bootloader mohio.

Ko te mutunga mai, i whakatauhia kia hono nga waehere katoa i roto i te QSPI, me te whakakorikori ki te utauta tuhi whaiaro ka whiwhi i te rua e hiahiatia ana ma te TFTP.

hua

Ko te whakaaro ki te kawe i tenei whare pukapuka ki a Embox i puta mai i te kotahi tau ki muri, engari he maha nga wa i hikitia ai na te maha o nga take. Ko tetahi o ratou ko te tautoko mo te libstdc++ me te whare pukapuka tauira paerewa. Ko te raruraru o te tautoko C++ i Embox kei tua atu i te waahanga o tenei tuhinga, na konei ka kii noa ahau i tutuki i a maatau tenei tautoko i roto i te moni tika mo tenei whare pukapuka kia mahi 🙂

I te mutunga, i hinga enei raruraru (he iti rawa mo te tauira OpenCV ki te mahi), ka rere te tauira. E 40 hekona te roa mo te poari ki te rapu rohe ma te whakamahi i te tātari Canny. Ko te tikanga, he roa rawa tenei (kei reira nga whakaaro me pehea te arotau i tenei take, ka taea te tuhi i tetahi tuhinga motuhake mo tenei mehemea ka angitu).

OpenCV i runga i te STM32F7-Discovery

Heoi, ko te whainga takawaenga ko te hanga tauira e whakaatu ana i te tino tupono ki te whakahaere OpenCV i runga i te STM32, i tutuki tenei whainga, hooray!

tl;dr: nga tohutohu taahiraa

0: Tangohia nga puna Embox, penei:

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

1: Me timata ma te whakahiato i te bootloader ka "kohiko" he puku kohiko QSPI.

    make confload-arm/stm32f7cube

Inaianei me whirihora e koe te whatunga, no te mea. Ka tukuna e matou te ahua ma te TFTP. Hei tautuhi i te poari me te manaaki i nga wahitau IP, me whakatika koe i te conf/rootfs/whatunga.

Tauira whirihoranga:

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 - te wahitau kaihautu mai i te waahi ka utaina te ahua, address - te wahi noho o te poari.

I muri i tera, ka kohia e matou te bootloader:

    make

2: Ko te utaina noa o te bootloader (pouri mo te punga) i runga i te poari - kaore he mea motuhake i konei, me mahi pera mo etahi atu tono mo STM32F7Discovery. Mena kaore koe e mohio ki te mahi, ka taea e koe te panui mo taua mea konei.
3: Te whakahiato whakaahua me te whirihora mo OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Tango mai i nga waahanga ELF kia tuhia ki te QSPI ki 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

He tuhinga kei roto i te whaiaronga conf e mahi ana i tenei, ka taea e koe te whakahaere

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

5: Ma te whakamahi i te tftp, tango qspi.bin.bin ki te puku kohiko QSPI. I runga i te kaihautu, ki te mahi i tenei, kape te qspi.bin ki te kōpaki pakiaka o te tūmau tftp (te nuinga o / srv / tftp / ranei / var / lib / tftpboot /; kei te waatea nga kohinga mo te tūmau e rite ana ki nga tohatoha rongonui, e kiia ana tftpd tftp-hpa ranei, i etahi wa me mahi koe systemctl start tftpd.service ki te timata).

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

I runga i te Embox (i.e. kei roto i te bootloader), me mahi e koe te whakahau e whai ake nei (e whakaaro ana matou kei te tūmau te wāhitau 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Me te whakahau goto me "peke" koe ki te mahara QSPI. Ka rereke te waahi motuhake i runga i te hononga o te ahua, ka kite koe i tenei wahitau me te whakahau mem 0x90000000 (ka uru te wahitau timatanga ki te kupu 32-bit tuarua o te ahua); ka hiahia hoki koe ki te kara i te tāpae -s, kei te 0x90000000 te wāhitau tāpae, hei tauira:

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

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

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

7: Whakarewa

    embox> edges 20

me te pai ki te rapu taitapa 40-tuarua 🙂

Ki te he tetahi - tuhia he take ki roto to tatou putunga, ki te rarangi mēra ranei [email tiakina], i roto ranei i tetahi korero i konei.

Source: will.com

Tāpiri i te kōrero