OpenCV amin'ny STM32F7-Discovery

OpenCV amin'ny STM32F7-Discovery Izaho dia iray amin'ireo mpamorona ny rafitra fandidiana Embox, ary ato amin'ity lahatsoratra ity dia hiresaka momba ny fomba nahavitako ny OpenCV teo amin'ny birao STM32746G aho.

Raha manoratra zavatra toy ny "OpenCV amin'ny STM32 board" ianao ao anaty milina fikarohana, dia afaka mahita olona vitsivitsy liana amin'ny fampiasana an'io tranomboky io amin'ny tabilao STM32 na microcontrollers hafa ianao.
Misy horonan-tsary maromaro izay, raha tsaraina amin'ny anarana, dia tokony hampiseho izay ilaina, fa matetika (amin'ny horonan-tsary rehetra hitako) eo amin'ny solaitrabe STM32, ny sary ihany no voaray avy amin'ny fakantsary ary ny vokatra dia naseho teo amin'ny efijery, ary ny fanodinana sary dia natao tamin'ny ordinatera mahazatra, na tamin'ny boards mahery kokoa (ohatra, Raspberry Pi).

Fa maninona no sarotra?

Ny lazan'ny fangataham-pikarohana dia hazavaina amin'ny hoe OpenCV no tranomboky fahita amin'ny solosaina malaza indrindra, izay midika fa betsaka kokoa ny developer mahafantatra azy, ary ny fahafahana mampandeha kaody efa vonona amin'ny desktop amin'ny microcontroller dia manamora be ny fizotran'ny fampandrosoana. Fa maninona no mbola tsy misy fomba fanamboarana efa vonona ho an'ny famahana ity olana ity?

Ny olana amin'ny fampiasana OpenCV amin'ny shawls kely dia mifandray amin'ny endri-javatra roa:

  • Raha manambatra ny tranomboky ianao na dia misy modely kely indrindra aza, dia tsy hiditra amin'ny fahatsiarovana tselatra an'ny STM32F7Discovery (na dia tsy misy OS aza) noho ny fehezan-dalΓ na lehibe (megabytes maromaro)
  • Ny tranomboky mihitsy dia voasoratra amin'ny C ++, izay midika hoe
    • Mila fanohanana ho an'ny fampandehanana tsara (exception, sns.)
    • Fanohanana kely ho an'ny LibC/Posix, izay matetika hita ao amin'ny OS ho an'ny rafitra napetraka - mila tranomboky miampy miampy sy tranomboky modely STL mahazatra ianao (vector, sns.)

Hiverina any amin'ny embox

Toy ny mahazatra, alohan'ny handefasana programa amin'ny rafitra miasa, dia tsara ny manandrana manamboatra azy amin'ny endrika izay nokasain'ny mpamorona azy. Amin'ity tranga ity dia tsy misy olana amin'izany - ny kaody loharano dia hita ao github, ny tranomboky dia naorina eo ambanin'ny GNU/Linux miaraka amin'ny cmake mahazatra.

Ny vaovao tsara dia ny OpenCV dia azo amboarina ho tranomboky static ivelan'ny boaty, izay manamora ny fandefasana entana. Manangona tranomboky misy config manara-penitra izahay ary mijery ny haben'ny habaka azony. Angonina ao anaty tranomboky mitokana ny module tsirairay.

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

Araka ny hitanao amin'ny andalana farany, ny .bss sy .data dia tsy maka toerana be, fa ny code dia mihoatra ny 70 MiB. Mazava fa raha ampifandraisina amin'ny fampiharana manokana izany dia hihena ny code.

Andao hiezaka hanipy mΓ΄dely betsaka araka izay azo atao mba hanangonana ohatra kely indrindra (izay, ohatra, dia hamoaka ny dikan-teny OpenCV fotsiny), ka mijery isika. cmake .. -LA ary vonoy ao amin'ny safidy izay rehetra mivadika.

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

Amin'ny lafiny iray, ity dia maodely iray amin'ny tranomboky, amin'ny lafiny iray, ity dia tsy misy fanatsarana ny compiler amin'ny haben'ny code (-Os). ~3 MiB ny kaody dia mbola betsaka, fa efa manome fanantenana ny fahombiazana.

Hiverina any amin'ny emulator

Mora kokoa ny mi-debug amin'ny emulator, koa ataovy azo antoka aloha fa miasa amin'ny qemu ny tranomboky. Amin'ny maha sehatra emulated dia nisafidy Integrator / CP aho, satria voalohany, ARM ihany koa izy io, ary faharoa, ny Embox dia manohana ny famoahana sary ho an'ity sehatra ity.

Ny Embox dia manana mekanika amin'ny fananganana tranomboky ivelany, amin'ny fampiasana azy dia ampianay OpenCV ho module (mandalo ireo safidy mitovy amin'ny fananganana "minimal" amin'ny endrika tranomboky static), ary avy eo dia manampy fampiharana tsotra toa izao aho:

version.cpp:

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

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

    return 0;
}

Manangona ny rafitra izahay, mihazakazaka izany - mahazo ny vokatra andrasana.

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 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² сборку ΠΈ Ρ‚.ΠΏ.>

Ny dingana manaraka dia ny fampandehanana ohatra sasantsasany, indrindra fa ny iray amin'ireo fenitra atolotry ny mpamorona azy manokana. amin'ny tranokalanao. nisafidy aho sisintany detector canny.

Tsy maintsy nosoratana kely ny ohatra mba hampisehoana ny sary miaraka amin'ny vokatra mivantana ao amin'ny buffer frame. Tsy maintsy nanao izany aho, satria. asa imshow() dia afaka manao sary amin'ny alΓ lan'ny interface QT, GTK ary Windows, izay mazava ho azy fa tsy ho ao amin'ny config ho an'ny STM32. Raha ny marina, ny QT dia azo atao amin'ny STM32F7Discovery, fa horesahina amin'ny lahatsoratra hafa izany πŸ™‚

Taorian'ny fanazavana fohy momba ny endrika izay voatahiry ny vokatry ny sisiny detector, dia mahazo sary.

OpenCV amin'ny STM32F7-Discovery

sary tany am-boalohany

OpenCV amin'ny STM32F7-Discovery

vokatra

Ireo singa mifandraika amin'ny STM32F7Discovery

Ao amin'ny 32F746GDISCOVERY dia misy fizarana fitadidiana hardware maromaro izay azontsika ampiasaina amin'ny fomba iray na hafa

  1. 320 KiB RAM
  2. Flash 1MiB ho an'ny sary
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot karatra microSD

Ny karatra SD dia azo ampiasaina hitahirizana sary, saingy amin'ny toe-javatra misy ohatra kely indrindra dia tsy dia ilaina loatra izany.
Ny fampisehoana dia manana famaha 480 Γ— 272, izay midika fa ny fahatsiarovana framebuffer dia ho 522 bytes amin'ny halalin'ny 240 bit, i.e. mihoatra noho ny haben'ny RAM izany, ka ny framebuffer sy ny heap (izay takiana, anisan'izany ny OpenCV, mba hitahiry ny angona ho an'ny sary sy ny rafitra fanampiny) dia ho hita ao amin'ny SDRAM, ny zavatra hafa rehetra (fahatsiarovana ho an'ny stacks sy ny filan'ny rafitra hafa). ) dia handeha amin'ny RAM.

Raha maka ny config kely indrindra ho an'ny STM32F7Discovery isika (ariantsika ny tambazotra manontolo, ny baiko rehetra, ataovy kely araka izay azo atao ny stacks, sns.) ary ampio ny OpenCV misy ohatra ao, dia toy izao manaraka izao ny fitadidiana ilaina:

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

Ho an'ireo izay tsy dia mahazatra loatra amin'ny fizarana aiza no hazavaiko: in .text ΠΈ .rodata torolalana sy tsy miova (raha lazaina amin'ny teny manodidina, angona vakiana fotsiny) no mipetraka .data ny data dia miovaova, .bss Misy "nulled" variables, izay, na izany aza, mila toerana (ity fizarana ity dia "handeha" amin'ny RAM).

Ny vaovao tsara dia izany .data/.bss tokony hifanaraka, fa miaraka .text ny olana dia tsy misy afa-tsy 1MiB ny fahatsiarovana ny sary. Azo ariana .text ny sary avy amin'ny ohatra ary vakio, ohatra, avy amin'ny karatra SD ho fahatsiarovana amin'ny fanombohana, fa ny fruits.png dia milanja 330KiB, ka tsy hamaha ny olana izany: ny ankamaroany .text dia misy ny kaody OpenCV.

Amin'ny ankapobeny, tsy misy afa-tsy zavatra iray sisa tavela - ny fampidirana ampahany amin'ny kaody amin'ny tselatra QSPI (manana fomba fiasa manokana amin'ny fametahana fahatsiarovana amin'ny fiara fitateram-bahoaka, mba hahafahan'ny processeur miditra mivantana amin'ity data ity). Amin'ity tranga ity, dia misy olana: voalohany, ny fahatsiarovana ny QSPI flash drive dia tsy hita avy hatrany aorian'ny rebooting ny fitaovana (mila misaraka manomboka ny fahatsiarovana-sarintany fomba), ary faharoa, dia tsy afaka "flash" ity fahatsiarovana ity. bootloader mahazatra.

Vokatr'izany dia nanapa-kevitra ny hampifandray ny kaody rehetra ao amin'ny QSPI, ary tselatra izany miaraka amin'ny loader sora-tena izay hahazo ny binary ilaina amin'ny TFTP.

vokatra

Nipoitra teo amin'ny herintaona teo ho eo izay ny hevitra hampidirana ity tranomboky ity ho any amin'ny Embox, saingy nahemotra hatrany izany noho ny antony samihafa. Ny iray amin'izy ireo dia ny fanohanana ny libstdc ++ sy ny tranomboky modely mahazatra. Ny olan'ny fanohanan'ny C ++ ao amin'ny Embox dia mihoatra ny sahan'ity lahatsoratra ity, ka eto aho dia hilaza fotsiny fa nahavita nahatratra io fanohanana io tamin'ny vola mety ho an'ity tranomboky ity izahay πŸ™‚

Tamin'ny farany dia resy ireo olana ireo (farafaharatsiny ampy ho an'ny ohatra OpenCV hiasa), ary nihazakazaka ny ohatra. Mitaky 40 segondra lava ny birao hikaroka sisintany amin'ny alΓ lan'ny sivana Canny. Mazava ho azy fa lava loatra izany (misy ny fiheverana ny fomba hanatsarana ity raharaha ity, azo atao ny manoratra lahatsoratra mitokana momba izany raha toa ka mahomby).

OpenCV amin'ny STM32F7-Discovery

Na izany aza, ny tanjona mpanelanelana dia ny hamorona prototype izay hampiseho ny fahafahana fototra hampandehanana ny OpenCV amin'ny STM32, tsirairay avy, tratra io tanjona io, hooray!

tl;dr: torolalana tsikelikely

0: Misintona loharano Embox, toy izao:

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

1: Andeha isika hanomboka amin'ny fanangonana bootloader izay "mamelatra" QSPI flash drive.

    make confload-arm/stm32f7cube

Ankehitriny dia mila manamboatra ny tambajotra ianao, satria. Hampiakatra ny sary amin'ny alΓ lan'ny TFTP izahay. Mba hametrahana ny birao sy ny adiresy IP mpampiantrano dia mila manova ny conf/rootfs/network.

Ohatra config:

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 - adiresin'ny mpampiantrano izay hampidirana ny sary, address - adiresin'ny birao.

Aorian'izay dia manangona ny bootloader izahay:

    make

2: Ny famenoana mahazatra ny bootloader (miala tsiny amin'ny fanararaotana) eo amin'ny solaitrabe - tsy misy zavatra voafaritra eto, mila manao izany ianao tahaka ny fampiharana hafa amin'ny STM32F7Discovery. Raha tsy hainao ny manao izany dia azonao atao ny mamaky momba izany eto.
3: Manangona sary miaraka amin'ny config ho an'ny OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Esory avy amin'ny fizarana ELF hosoratana amin'ny QSPI mankany 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

Misy script ao amin'ny lahatahiry conf manao an'izany, ka azonao atao ny mampandeha azy

    ./conf/qspi_objcopy.sh # НуТный Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ -- build/base/bin/qspi.bin

5: Mampiasa tftp, alaivo ny qspi.bin.bin amin'ny kapila tselatra QSPI. Ao amin'ny mpampiantrano, mba hanaovana izany, kopia qspi.bin amin'ny lahatahiry fototry ny mpizara tftp (matetika / srv / tftp / na / var / lib / tftpboot /; ny fonosana ho an'ny mpizara mifanaraka amin'izany dia misy amin'ny ankamaroan'ny fizarana malaza, matetika antsoina hoe tftpd na tftp-hpa, indraindray tsy maintsy ataonao systemctl start tftpd.service manomboka).

    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftpd
    sudo cp build/base/bin/qspi.bin /srv/tftp
    # Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ для tftp-hpa
    sudo cp build/base/bin/qspi.bin /var/lib/tftpboot

Ao amin'ny Embox (izany hoe ao amin'ny bootloader), mila manatanteraka ity baiko manaraka ity ianao (heverintsika fa manana ny adiresy 192.168.2.1 ny mpizara):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Miaraka amin'ny baiko goto mila "mitsambikina" ao amin'ny fitadidiana QSPI ianao. Ny toerana manokana dia hiova arakaraka ny fomba ifandraisan'ny sary, azonao jerena ity adiresy ity miaraka amin'ny baiko mem 0x90000000 (ny adiresy fanombohana dia mifanaraka amin'ny teny 32-bit faharoa amin'ny sary); ianao koa dia mila manenjana ny stack -s, ny adiresy stack dia amin'ny 0x90000000, ohatra:

    embox>mem 0x90000000
    0x90000000:     0x20023200  0x9000c27f  0x9000c275  0x9000c275
                      ↑           ↑
              это адрСс    это  адрСс 
                стэка        ΠΏΠ΅Ρ€Π²ΠΎΠΉ
                           инструкции

    embox>goto -i 0x9000c27f -s 0x20023200 # Π€Π»Π°Π³ -i Π½ΡƒΠΆΠ΅Π½ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ прСрывания Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы

    < Начиная ΠΎΡ‚ΡΡŽΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, Π° ΠΎΠ±Ρ€Π°Π·Π° с OpenCV >

7: Alefaso

    embox> edges 20

ary ankafizo ny fikarohana sisintany 40 segondra πŸ™‚

Raha misy tsy mety - manorata olana ao ny fitehirizanay, na amin'ny lisitry ny mailaka [email voaaro], na amin'ny fanehoan-kevitra eto.

Source: www.habr.com

Add a comment