OpenCV ar STM32F7-Fionnachtain

OpenCV ar STM32F7-Fionnachtain Tá mé ar cheann de na forbróirí córais oibriúcháin Embox, agus san Airteagal seo beidh mé ag caint faoi conas a d'éirigh liom OpenCV a reáchtáil ar an mbord STM32746G.

Má chlóscríobhann tú rud éigin cosúil le “OpenCV ar bord STM32” in inneall cuardaigh, gheobhaidh tú go leor daoine ar spéis leo an leabharlann seo a úsáid ar chláir STM32 nó ar mhicririalaitheoirí eile.
Tá roinnt físeáin ann ar cheart, ag meas an teidil, a bhfuil ag teastáil a léiriú, ach de ghnáth (i ngach físeán a chonaic mé) ar an mbord STM32, gan ach íomhá a fháil ón gceamara agus an toradh a thaispeáint ar an scáileán, agus an rinneadh próiseáil íomhá féin ar ríomhaire rialta, nó ar chláir níos cumhachtaí (mar shampla, Raspberry Pi).

Cén fáth go bhfuil sé seo deacair?

Mínítear an tóir a bhí ar cheisteanna cuardaigh ag an bhfíric gurb é OpenCV an leabharlann fís ríomhaire is mó tóir, rud a chiallaíonn go bhfuil níos mó forbróirí eolach air, agus go simplíonn an cumas cód réidh le deasc a reáchtáil ar microcontroller an próiseas forbartha go mór. Ach cén fáth nach bhfuil aon oidis réamhdhéanta coitianta ann go fóill chun an fhadhb seo a réiteach?

Baineann an fhadhb le húsáid OpenCV ar chláir bheaga le dhá ghné:

  • Má thiomsaíonn tú an leabharlann fiú le sraith íosta de mhodúil, ní bheidh sé oiriúnach go simplí i gcuimhne flash an STM32F7Discovery céanna (fiú gan cur san áireamh an OS) mar gheall ar an gcód an-mhór (roinnt meigibheart treoracha)
  • Tá an leabharlann féin scríofa i C++, rud a chiallaíonn
    • Teastaíonn tacaíocht uainn le haghaidh am rite dearfach (eisceachtaí, etc.)
    • Is beag tacaíocht a thugtar do LibC/Posix, a fhaightear go hiondúil in OSanna do chórais leabaithe - teastaíonn leabharlann móide caighdeánach uait agus leabharlann teimpléad caighdeánach STL (veicteoir, etc.)

Á aistriú chuig Embox

Mar is gnách, sula ndéantar aon chláir a aistriú chuig an gcóras oibriúcháin, is smaoineamh maith é iarracht a dhéanamh é a thiomsú san fhoirm a raibh sé beartaithe ag na forbróirí é. Inár gcás, níl aon fadhbanna leis seo - is féidir an cód foinse a fháil ag github, cuirtear an leabharlann le chéile faoi GNU/Linux le cmake rialta.

Is é an dea-scéal ná gur féidir OpenCV a thógáil amach as an mbosca mar leabharlann statach, rud a fhágann gur fusa é a iompar. Cuirimid an leabharlann le chéile leis an gcumraíocht chaighdeánach agus feicimid cé mhéad spáis a thógann sé. Cuirtear gach modúl le chéile i leabharlann ar leith.

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

Mar a fheiceann tú ón líne dheireanach, ní thógann .bss agus .data mórán spáis, ach tá an cód níos mó ná 70 MiB. Tá sé soiléir má tá sé seo nasctha go statach le feidhmchlár ar leith, beidh níos lú cód ann.

Déanaimis iarracht an oiread modúil agus is féidir a chaitheamh amach chun sampla íosta a chruthú (a thaispeánfaidh, mar shampla, an leagan OpenCV go simplí), mar sin déanaimis féachaint cmake .. -LA agus gach rud atá faoi mhíchumas a dhíchumasú sna roghanna.

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

Ar thaobh amháin, níl anseo ach modúl leabharlainne amháin, ar an láimh eile, tá sé seo gan leas iomlán a bhaint as an tiomsaitheoir le haghaidh méid an chóid (-Os). Tá ~3 MiB de chód go leor fós, ach tugann sé dóchas do rath cheana féin.

Ag rith i aithriseoir

Tá sé i bhfad níos éasca dífhabhtú a dhéanamh ar aithriseoir, mar sin ar dtús déanfaimid cinnte go n-oibríonn an leabharlann ar qemu. Roghnaigh mé Integrator/CP mar an ardán aithrise, toisc... ar an gcéad dul síos, is ARM é freisin, agus ar an dara dul síos, tacaíonn Embox le aschur grafaicí don ardán seo.

Tá meicníocht ag Embox chun leabharlanna seachtracha a thógáil, lena chabhair cuirimid OpenCV mar mhodúl (ag dul thar na roghanna céanna maidir le tionól “íosta” i bhfoirm leabharlanna statacha), agus ina dhiaidh sin cuirim feidhmchlár simplí leis a bhreathnaíonn mar seo:

version.cpp:

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

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

    return 0;
}

Cuirimid an córas le chéile, reáchtáilimid é, agus faighimid an t-aschur ionchais.

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

Is é an chéad chéim eile ná sampla éigin a rith, b'fhearr sampla caighdeánach éigin a thairgeann na forbróirí iad féin ar do láithreán gréasáin. roghnaím Brathadóir teorann cannaí.

B'éigean an sampla a athscríobh beagán chun íomhá an toraidh a thaispeáint go díreach isteach sa mhaolán fráma. Bhí orm é seo a dhéanamh mar... feidhm imshow() Is féidir íomhánna a tharraingt trí chomhéadain QT, GTK agus Windows, nach mbeidh, ar ndóigh, sa chumraíocht le haghaidh STM32. Go deimhin, is féidir QT a reáchtáil ar an STM32F7Discovery freisin, ach pléifear é seo in alt eile :)

Tar éis dúinn a dhéanamh amach go hachomair cén fhormáid ina stóráiltear toradh an bhrathadóra chiumhais, faighimid íomhá.

OpenCV ar STM32F7-Fionnachtain

Pictiúr bunaidh

OpenCV ar STM32F7-Fionnachtain

Toradh

Ar siúl ar STM32F7Discovery

Tá roinnt codanna cuimhne crua-earraí ag an 32F746GDISCOVERY is féidir linn a úsáid ar bhealach amháin nó ar bhealach eile

  1. RAM 320KB
  2. Cuimhne flash 1MiB le haghaidh íomhá
  3. 8MiB SDRAM
  4. Tiomántán flash 16MiB QSPI NAND
  5. Sliotán cárta MicroSD

Is féidir cárta SD a úsáid chun íomhánna a stóráil, ach i gcomhthéacs sampla íosta a reáchtáil níl sé seo an-úsáideach.
Tá taifeach 480 × 272 ag an taispeáint, rud a chiallaíonn go mbeidh an chuimhne don mhaolán fráma 522 beart le doimhneacht 240 giotán, i.e. tá sé seo níos mó ná an méid RAM, mar sin beidh an framebuffer agus gcarn (a bheidh ag teastáil, i measc rudaí eile, do OpenCV chun sonraí a stóráil le haghaidh íomhánna agus struchtúir chúnta) a bheith suite i SDRAM, gach rud eile (cuimhne do stoic agus córais eile riachtanais) dul go RAM .

Má thógaimid an t-íosmhéid cumraíochta le haghaidh STM32F7Discovery (caith amach an líonra iomlán, gach ordú, déan stoic chomh beag agus is féidir, etc.) agus cuir OpenCV le samplaí ann, beidh an chuimhne riachtanach mar seo a leanas:

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

Dóibh siúd nach bhfuil an-eolach ar na hailt a théann i gcás, lig dom a mhíniú: i .text и .rodata ina bhfuil treoracha agus tairisigh (sonraí inléite amháin, go garbh), i .data tá sonraí inathraithe i .bss tá athróga “nialasacha” ann, a dteastaíonn spás uathu mar sin féin (rachaidh an chuid seo go RAM).

Is é an dea-scéal go .data/.bss chóir oiriúnach, ach le .text Is í an fhadhb atá ann nach bhfuil ach 1MiB de chuimhne don íomhá. Is féidir é a chaitheamh amach .text íomhá ón sampla agus é a léamh, mar shampla, ó chárta SD i gcuimhne ag am tosaithe, ach torthaí.png meáchan thart ar 330KiB, mar sin ní bheidh an fhadhb a réiteach: an chuid is mó .text comhdhéanta go beacht de chód OpenCV.

Tríd is tríd, níl ach rud amháin fágtha - cuid den chód a luchtú ar thiomántán splanc QSPI (tá modh oibriúcháin speisialta aige chun cuimhne a mhapáil ar bhus an chórais, ionas gur féidir leis an bpróiseálaí rochtain a fháil ar na sonraí seo go díreach). Sa chás seo, tagann fadhb chun cinn: ar an gcéad dul síos, níl an chuimhne ar thiomántán QSPI flash ar fáil díreach tar éis an gléas a atosú (ní mór modh léarscáilithe cuimhne a thosú ar leithligh), agus ar an dara dul síos, tá sé dodhéanta an chuimhne seo a "splancadh" leis an tosaitheoir gnáth.

Mar thoradh air sin, socraíodh an cód go léir a nascadh le QSPI agus é a splancadh le tosaitheoir féinscríofa, a gheobhaidh an dénártha riachtanach trí TFTP.

Toradh

Tháinig an smaoineamh chun an leabharlann seo a phortáil chuig Embox thart ar bhliain ó shin, ach arís agus arís eile cuireadh siar é mar gheall ar chúiseanna éagsúla. Ar cheann acu tá tacaíocht do libstdc++ agus leabharlann teimpléad caighdeánach. Tá fadhb na tacaíochta C ++ in Embox taobh amuigh de scóip an ailt seo, mar sin ní déarfaidh mé ach gur éirigh linn an tacaíocht seo a bhaint amach chomh fada agus is gá don leabharlann seo a bheith ag obair :)

Faoi dheireadh, sáraíodh na fadhbanna seo (ar a laghad go leor chun go n-oibreodh sampla OpenCV), agus rith an sampla. Tógann sé 40 soicind fada ar an gclár teorainneacha a chuardach ag baint úsáide as an scagaire Canny. Tá sé seo, ar ndóigh, ró-fhada (tá breithniúcháin ar conas an t-ábhar seo a bharrfheabhsú; d’fhéadfaí alt ar leith a scríobh faoi seo má éiríonn leis).

OpenCV ar STM32F7-Fionnachtain

Mar sin féin, ba é an sprioc idirmheánach ná fréamhshamhail a chruthú a thaispeánfadh an fhéidearthacht bhunúsach a bhaineann le OpenCV a reáchtáil ar an STM32, agus mar sin baineadh amach an sprioc seo, Hurray!

tl; dr: treoracha céim ar chéim

0: Íoslódáil foinsí Embox, mar shampla mar seo:

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

1: Let tús le chéile bootloader a flash an QSPI tiomáint flash.

    make confload-arm/stm32f7cube

Anois ní mór duit an líonra a chumrú, toisc go... Déanfaimid an íomhá a íoslódáil trí TFTP. Chun seoltaí IP an bhoird agus an óstaigh a shocrú, ní mór duit an conf/rootfs/network a chur in eagar.

Sampla cumraíochta:

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 — seoladh óstaigh óna luchtófar an íomhá, address — seoladh boird.

Ina dhiaidh sin cuirimid an bootloader le chéile:

    make

2: Gnáthlódáil an bootloader (maith an punt) ar an gclár - aon rud ar leith anseo, ní mór duit é a dhéanamh cosúil le haon fheidhmchlár eile don STM32F7Discovery. Mura bhfuil a fhios agat conas é seo a dhéanamh, is féidir leat léamh faoi anseo.
3: Íomhá a thiomsú le cumraíocht do OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Ailt a bhaint as ELF ar gá iad a scríobh chuig QSPI go 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

Tá script san eolaire conf a dhéanann é seo, ionas gur féidir leat é a rith

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

5: Ag baint úsáide as tftp, lódáil qspi.bin.bin ar thiomáint flash QSPI. Ar an ósta, chun é seo a dhéanamh, ní mór duit qspi.bin a chóipeáil chuig an bhfréamhfhillteán den fhreastalaí tftp (go hiondúil / srv/tftp/ nó /var/lib/tftpboot/; tá pacáistí don fhreastalaí comhfhreagrach ar fáil sna dáiltí is coitianta , ar a dtugtar de ghnáth tftpd nó tftp-hpa, uaireanta caithfidh tú a dhéanamh systemctl start tftpd.service chun tús a chur).

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

Ar Embox (i.e. sa bootloader) ní mór duit an t-ordú seo a leanas a rith (glaoimid go bhfuil seoladh 192.168.2.1 ag an bhfreastalaí):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Ag baint úsáide as ordú goto ní mór duit “léim” isteach i gcuimhne QSPI. Athróidh an suíomh sonrach ag brath ar an gcaoi a bhfuil an íomhá nasctha, is féidir leat an seoladh seo a fheiceáil leis an ordú mem 0x90000000 (oireann an seoladh tosaigh don dara focal 32-giotán den íomhá); beidh ort freisin an bhratach cruachta a shocrú -s, tá an seoladh cruachta ag 0x90000000, mar shampla:

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

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

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

7: Seoladh

    embox> edges 20

agus bain sult as an gcuardach 40 soicind le haghaidh teorainneacha :)

Má théann rud éigin mícheart, scríobh ceist chuig ár stór, nó chuig an nuachtlitir [ríomhphost faoi chosaint], nó i dtrácht anseo.

Foinse: will.com

Add a comment