OpenCV li ser STM32F7-Discovery

OpenCV li ser STM32F7-Discovery Ez yek ji pêşdebirên pergala xebitandinê me Embox, û di vê gotarê de ez ê biaxivim ka min çawa karî OpenCV li ser panela STM32746G bimeşîne.

Ger hûn tiştek wekî "OpenCV li ser panela STM32" di motorek lêgerînê de binivîsin, hûn dikarin çend kesên ku bala xwe didin vê pirtûkxaneyê li ser panelên STM32 an mîkrokontrolerên din bikar bînin bibînin.
Gelek vîdyo hene ku, li ser navê dadbarkirinê, divê tiştê ku hewce ye destnîşan bikin, lê bi gelemperî (di hemî vîdyoyên ku min dît) li ser panela STM32, tenê wêne ji kamerayê hate wergirtin û encam li ser ekranê hate xuyang kirin. û hilberandina wêneyê bixwe an li ser komputerek birêkûpêk, an jî li ser panelên bihêztir (mînak, Raspberry Pi) hate kirin.

Çima dijwar e?

Popularîteya pirsên lêgerînê ji hêla vê yekê ve tê ravekirin ku OpenCV pirtûkxaneya dîtina komputerê ya herî populer e, ku tê vê wateyê ku bêtir pêşdebiran pê re nas dikin, û şiyana ku koda sermaseyê-amade li ser mîkrokontroller bimeşîne, pêvajoya pêşkeftinê pir hêsan dike. Lê çima hîn jî ji bo çareserkirina vê pirsgirêkê reçeteyên hazir ên populer tune ne?

Pirsgirêka karanîna OpenCV li ser şalên piçûk bi du taybetmendiyan ve girêdayî ye:

  • Ger hûn pirtûkxaneyê bi komek modulên hindiktirîn jî berhev bikin, ew ê ji ber kodek pir mezin (çend megabyte rêwerzan) bi tenê di bîra flash ya heman STM32F7Discovery de cih negire (tevî bêyî ku OS-yê hesab bike)
  • Pirtûkxane bixwe bi C++ hatiye nivîsandin, ku tê vê wateyê
    • Ji bo dema xebitandina erênî (îstisna, hwd.)
    • Piştgiriyek hindik ji bo LibC/Posix, ku bi gelemperî di OS-ê de ji bo pergalên pêvekirî tê dîtin - hûn hewceyê pirtûkxaneyek standard plus û pirtûkxaneyek standard STL (vektor, hwd.)

Veguheztin bo Embox

Wekî gelemperî, berî ku hûn bernameyek ji pergala xebitandinê re veguhezînin, fikrek baş e ku hûn hewl bidin ku wê bi forma ku pêşdebiran ew armanc kirine ava bikin. Di doza me de, di vê yekê de pirsgirêk tune - koda çavkaniyê dikare li ser were dîtin github, pirtûkxane di bin GNU/Linux de bi cmakeya asayî hatiye avakirin.

Mizgîn ev e ku OpenCV dikare wekî pirtûkxaneyek statîk ji qutiyê were çêkirin, ku veguheztinê hêsantir dike. Em pirtûkxaneyek bi mîhengek standard berhev dikin û dibînin ku ew çiqas cîh digirin. Her modul di pirtûkxaneyek cihê de tê berhev kirin.

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

Wekî ku hûn ji rêza paşîn jî dibînin, .bss û .data pir cîh nagirin, lê kod ji 70 MiB zêdetir e. Eşkere ye ku heke ev statîkî bi serîlêdanek taybetî ve girêdayî be, dê kod kêm bibe.

Ka em hewl bidin ku bi qasî ku pêkan pir modulan derxînin da ku mînakek hindiktirîn were berhev kirin (ku, mînakî, dê bi tenê guhertoya OpenCV derxe), ji ber vê yekê em lê dinêrin cmake .. -LA û di vebijarkan de her tiştê ku vedibe vemirîne.

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

Ji aliyek ve, ev tenê yek modulek pirtûkxaneyê ye, ji hêla din ve, ev ji bo mezinahiya kodê bêyî xweşbîniya berhevkerê ye (-Os). ~ 3 MiB kod hîn pir pir e, lê jixwe hêviya serkeftinê dide.

Di emulatorê de bixebitin

Debugkirina li ser emulatorê pir hêsantir e, ji ber vê yekê pêşî piştrast bikin ku pirtûkxane li ser qemu dixebite. Wekî platformek emulkirî, min Integrator / CP hilbijart, ji ber ku yekem, ew jî ARM e, û ya duyemîn jî, Embox ji bo vê platformê hilberîna grafîkê piştgirî dike.

Embox ji bo avakirina pirtûkxaneyên derveyî mekanîzmayek heye, bi karanîna wê em OpenCV-ê wekî modulek lê zêde dikin (hemû vebijarkên ji bo avakirina "kêmtirîn" di forma pirtûkxaneyên statîk de derbas dikin), piştî wê ez serîlêdanek hêsan ku bi vî rengî xuya dike lê zêde dikim:

version.cpp:

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

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

    return 0;
}

Em pergalê dicivînin, dimeşînin - em hilberîna hêvîkirî digirin.

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

Pêngava paşîn ev e ku meriv hin mînakan bimeşîne, bijare yek ji standardên ku ji hêla pêşdebiran ve têne pêşkêş kirin. li ser malpera xwe. Min hilbijart detektorê sînor canny.

Diviyabû mînak hinekî ji nû ve were nivîsandin da ku wêneyê bi encamê re rasterast di tampona çarçoveyê de were xuyang kirin. Ez neçar bûm ku vê yekê bikim, ji ber ku. karkirin imshow() dikare bi navgînên QT, GTK û Windows-ê wêneyan bikişîne, ku, bê guman, dê bê guman di veavakirina STM32 de nebe. Bi rastî, QT dikare li ser STM32F7Discovery jî were xebitandin, lê ev ê di gotarek din de were nîqaş kirin 🙂

Piştî zelalkirinek kurt di kîjan formatê de encama detektorê keviya tê hilanîn, em wêneyek digirin.

OpenCV li ser STM32F7-Discovery

wêneya orîjînal

OpenCV li ser STM32F7-Discovery

Di encama

Li ser STM32F7Discovery dimeşe

Li ser 32F746GDISCOVERY çend beşên bîranîna hardware hene ku em dikarin bi rengekî an din bikar bînin

  1. 320 KiB RAM
  2. 1MiB flash ji bo wêneyê
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. hêlînê karta microSD

Karta SD dikare ji bo hilanîna wêneyan were bikar anîn, lê di çarçoveya xebitandina mînakek hindiktirîn de, ev ne pir bikêr e.
Dîmender xwedan çareseriyek 480×272 e, ku tê vê wateyê ku bîranîna framebuffer dê di kûrahiya 522 bit de 240 byte be, yanî. ev ji mezinahiya RAM-ê wêdetir e, ji ber vê yekê çarçowe û girek (ya ku dê hewce be, di nav de ji bo OpenCV, ji bo hilanîna daneyan ji bo wêneyan û strukturên alîkar) dê di SDRAM-ê de, her tiştê din (bîra ji bo stûnan û hewcedariyên pergalê yên din). ) dê biçe RAMê.

Ger em ji bo STM32F7Discovery mîhenga herî kêm bigirin (tevahiya torê, hemî fermanan bavêjin, bi qasî ku mimkun be stûnan çêkin, hwd.) û OpenCV-ê bi mînakan li wir zêde bikin, bîra hewce dê wekî jêrîn be:

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

Ji bo kesên ku ne pir bi kîjan beşan diçin ku derê, ez ê rave bikim: di .text и .rodata talîmat û domdar (bi gelemperî, daneyên tenê xwendinê) tê de ne .data daneyên guherbar e, .bss guhêrbarên "nulled" hene, ku, lêbelê, cîhek hewce dike (ev beş dê "biçe" RAM-ê).

Mizgîn ev e .data/.bss divê fit, lê bi .text Pirsgirêk ev e ku ji bo wêneyê tenê 1 MiB bîranîn heye. Dikare were avêtin .text wêneyê ji nimûneyê bixwîne û wê bixwîne, mînakî, di destpêkê de ji qerta SD-ê di bîranînê de, lê fruits.png bi qasî 330 KiB giran e, ji ber vê yekê ev ê pirsgirêkê çareser neke: pir .text ji koda OpenCV pêk tê.

Bi gelemperî, tenê tiştek maye - barkirina beşek kodê li ser fîşekek QSPI (ji bo nexşeya bîranînê bi otobusa pergalê re şêwazek taybetî ya xebatê heye, da ku pêvajo rasterast bigihîje van daneyan). Di vê rewşê de, pirsgirêkek derdikeve: yekem, bîranîna ajokerek flash QSPI tavilê piştî ku amûrê ji nû ve hatî destpêkirin nayê peyda kirin (hûn hewce ne ku moda nexşeya bîranînê ji hev veqetînin dest pê bikin), û ya duyemîn jî, hûn nekarin vê bîranînê bi "flash" bikin. bootloaderek naskirî.

Wekî encamek, biryar hate girtin ku hemî kodê di QSPI-ê de were girêdan, û wê bi barkerek xwe-nivîskî ku dê binarya pêwîst bi riya TFTP-ê werbigire, bişewitîne.

Di encama

Fikra veguhestina vê pirtûkxaneyê ji Embox re nêzî salek berê xuya bû, lê dîsa û dîsa ji ber sedemên cihêreng ew hate paşxistin. Yek ji wan piştgirî ji bo libstdc ++ û pirtûkxaneya şablonê standard e. Pirsgirêka piştgirîya C++ ya di Embox de ji çarçoweya vê gotarê wêdetir e, ji ber vê yekê ez ê li vir tenê bibêjim ku me karî bi qasî rast vê piştgirîyê bi dest bixin da ku ev pirtûkxane bixebite 🙂

Di dawiyê de, ev pirsgirêk hatin derbas kirin (bi kêmanî bes ji bo ku mînaka OpenCV bixebite), û mînakek rijand. Ji bo ku panel bi karanîna Parzûna Canny li sînoran bigere 40 saniyeyên dirêj digire. Ev, bê guman, pir dirêj e (hişmendî hene ku meriv çawa vê mijarê xweşbîn dike, di serkeftinekê de dê di derbarê vê yekê de gotarek cûda were nivîsandin).

OpenCV li ser STM32F7-Discovery

Lêbelê, armanca navîn ev bû ku meriv prototîpek biafirîne ku dê îmkana bingehîn a xebitandina OpenCV-ê li ser STM32 nîşan bide, bi rêzê ve, ev armanc hate bidestxistin, çu!

tl;dr: talîmatên gav bi gav

0: Çavkaniyên Embox dakêşin, mîna vê:

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

1: Ka em dest bi komkirina bootloaderek ku dê ajokerek flash QSPI-yê "flash" bikin dest pê bikin.

    make confload-arm/stm32f7cube

Naha hûn hewce ne ku torê mîheng bikin, ji ber. Em ê wêneyê bi rêya TFTP barkirin. Ji bo danîna navnîşanên IP-yê panel û mêvandar, hûn hewce ne ku conf/rootfs/torê biguherînin.

Mînaka veavakirinê:

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 - Navnîşana mêvandar ji cihê ku wêne dê were barkirin, address - navnîşana panelê.

Piştî wê, em bootloader berhev dikin:

    make

2: Barkirina asayî ya bootloader (bibore ji bo lêdanê) li ser panelê - li vir tiştek taybetî tune, hûn hewce ne ku wê wekî her serîlêdana din ji bo STM32F7Discovery bikin. Heke hûn nizanin ka meriv wê çawa bike, hûn dikarin li ser wê bixwînin vir.
3: Berhevkirina wêneyek bi konfigurasyonek ji bo OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Ji beşên ELF derxînin ku ji QSPI-yê re ji qspi.bin re bêne nivîsandin

    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

Di pelrêça conf de skrîptek heye ku vê yekê dike, da ku hûn wê bimeşînin

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

5: Bi tftp bikar bînin, qspi.bin.bin li ajokerek flash QSPI dakêşin. Li ser mêvandarê, ji bo kirina vê yekê, qspi.bin li peldanka root ya servera tftp kopî bikin (bi gelemperî /srv/tftp/ an /var/lib/tftpboot/; pakêtên ji bo servera têkildar di belavokên herî populer de hene, bi gelemperî jê re tê gotin. tftpd an tftp-hpa, carinan divê hûn bikin systemctl start tftpd.service dest pê kirin).

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

Li ser Embox (ango di bootloader de), hûn hewce ne ku emrê jêrîn bicîh bikin (em texmîn dikin ku server navnîşana 192.168.2.1 heye):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Bi ferman goto hûn hewce ne ku "bikevin" nav bîra QSPI. Cihê taybetî dê li gorî ka çawa wêneyê ve girêdayî ye diguhere, hûn dikarin vê navnîşanê bi fermanê bibînin mem 0x90000000 (navnîşana destpêkê di peyva duyemîn 32-bit ya wêneyê de cih digire); hûn ê her weha hewce bikin ku stikê ala bikin -s, navnîşana stikê li 0x90000000 e, mînak:

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

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

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

7: Destpêkirin

    embox> edges 20

û ji lêgerîna sînorê 40-duyemîn kêfxweş bibin 🙂

Ger tiştek xelet bibe - pirsgirêkek tê de binivîse depoya me, an navnîşa posteyê [email parastî], an di şîroveyek vir de.

Source: www.habr.com

Add a comment