OpenCV ma STM32F7-Discovery

OpenCV ma STM32F7-Discovery ʻO wau kekahi o nā mea hoʻomohala o ka ʻōnaehana hana Embox, a ma kēia ʻatikala e kamaʻilio wau e pili ana i koʻu hoʻokō ʻana i ka OpenCV ma ka papa STM32746G.

Inā ʻoe e paʻi i kekahi mea e like me "OpenCV ma ka papa STM32" i loko o kahi ʻenekini huli, hiki iā ʻoe ke loaʻa i kekahi poʻe hoihoi e hoʻohana i kēia waihona ma nā papa STM32 a i ʻole nā ​​microcontrollers ʻē aʻe.
He nui nā wikiō, e hoʻoholo ana i ka inoa, e hōʻike i ka mea e pono ai, akā maʻamau (i nā wikiō āpau aʻu i ʻike ai) ma ka papa STM32, loaʻa wale ke kiʻi mai ke kāmela a hōʻike ʻia ka hopena ma ka pale, a ua hana ʻia ka hoʻoili kiʻi iā ia iho ma ke kamepiula maʻamau, a i ʻole ma nā papa ikaika (e laʻa, Raspberry Pi).

No ke aha he paʻakikī?

Ua wehewehe ʻia ka kaulana o nā nīnau hulina ma ka ʻoiaʻiʻo ʻo OpenCV ka waihona ʻike kamepiula kaulana loa, ʻo ia hoʻi, ʻoi aku ka nui o nā mea hoʻomohala i kamaʻāina iā ia, a ʻo ka hiki ke holo i ka papa kuhikuhi papakaukau ma kahi microcontroller e maʻalahi loa i ke kaʻina hana. Akā, no ke aha i loaʻa ʻole nā ​​​​mea hoʻomaʻamaʻa kaulana i hoʻomākaukau ʻia no ka hoʻoponopono ʻana i kēia pilikia?

ʻO ka pilikia o ka hoʻohana ʻana iā OpenCV ma nā shawl liʻiliʻi e pili ana i ʻelua mau hiʻohiʻona:

  • Inā ʻoe e hōʻuluʻulu i ka waihona me ka liʻiliʻi liʻiliʻi o nā modules, ʻaʻole ia e komo i ka hoʻomanaʻo flash o ka STM32F7Discovery (ʻoiai me ka ʻole o ka noʻonoʻo ʻana i ka OS) ma muli o kahi code nui loa (he mau megabytes o nā kuhikuhi).
  • Ua kākau ʻia ka waihona ma C ++, ʻo ia hoʻi
    • Pono ke kākoʻo no ka manawa holo maikaʻi (koe, etc.)
    • Kākoʻo liʻiliʻi no LibC/Posix, ka mea maʻamau i loaʻa i ka OS no nā ʻōnaehana hoʻopili - pono ʻoe i kahi waihona waihona maʻamau a me kahi waihona waihona STL maʻamau (vector, etc.)

Ka lawe ʻana i ka Embox

E like me ka mea maʻamau, ma mua o ka lawe ʻana i nā polokalamu i ka ʻōnaehana hana, he mea maikaʻi e hoʻāʻo e kūkulu iā ia ma ke ʻano i manaʻo ʻia e nā mea hoʻomohala. I kā mākou hihia, ʻaʻohe pilikia me kēia - hiki ke loaʻa ke kumu kumu ma github, kūkulu ʻia ka waihona ma lalo o GNU/Linux me ka cmake maʻamau.

ʻO ka nūhou maikaʻi, hiki ke kūkulu ʻia ʻo OpenCV ma ke ʻano he hale waihona puke ma waho o ka pahu, kahi e maʻalahi ai ka lawe ʻana. E hōʻiliʻili mākou i kahi waihona me kahi hoʻonohonoho maʻamau a ʻike i ka nui o nā wahi a lākou e lawe ai. ʻOhi ʻia kēlā me kēia module i loko o kahi waihona ʻokoʻa.

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

E like me kāu e ʻike ai mai ka laina hope loa, ʻaʻole lawe nui ka .bss a me .data, akā ʻoi aku ka code ma mua o 70 MiB. Ua maopopo inā pili kēia i kahi noi kikoʻī, e emi ana ke code.

E hoʻāʻo mākou e hoʻolei i nā modula he nui i hiki ke hōʻuluʻulu ʻia kahi hiʻohiʻona liʻiliʻi (ʻo ia, no ka laʻana, e hoʻopuka wale i ka OpenCV version), no laila ke nānā nei mākou cmake .. -LA a hoʻopau i nā koho i nā mea a pau e pio.

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

Ma ka ʻaoʻao hoʻokahi, hoʻokahi wale nō module o ka waihona, ma ka ʻaoʻao ʻē aʻe, ʻaʻole kēia me ka hoʻonui ʻana i ka compiler no ka nui code (-Os). ~ 3 MiB o ke code he nui loa, akā hāʻawi mua i ka manaolana no ka kūleʻa.

Holo i ka emulator

ʻOi aku ka maʻalahi o ka debug ma ka emulator, no laila e ʻike mua i ka hana ʻana o ka waihona ma qemu. Ma ke ʻano he kahua i hoʻohālikelike ʻia, ua koho wau iā Integrator / CP, no ka mea ʻO ka mea mua, ʻo ia nō ka ARM, a ʻo ka lua, kākoʻo ʻo Embox i nā kiʻi kiʻi no kēia kahua.

Loaʻa iā Embox kahi hana no ke kūkulu ʻana i nā hale waihona puke o waho, me ka hoʻohana ʻana iā ia e hoʻohui mākou iā OpenCV ma ke ʻano he module (e hāʻawi ana i nā koho like ʻole no ka hale "liʻiliʻi" ma ke ʻano o nā hale waihona puke), a laila hoʻohui wau i kahi noi maʻalahi e like me kēia:

version.cpp:

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

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

    return 0;
}

Hoʻohui mākou i ka ʻōnaehana, holo - loaʻa iā mākou ka hopena i manaʻo ʻia.

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

ʻO ka hana aʻe e holo i kekahi laʻana, ʻoi aku ka maikaʻi o kekahi o nā mea maʻamau i hāʻawi ʻia e nā mea hoʻomohala ponoʻī. ma kāu pūnaewele. Ua koho au mea ʻike palena palena.

Pono e kākau hou ʻia ka laʻana no ka hōʻike ʻana i ke kiʻi me ka hopena pololei i loko o ka pahu pahu. Pono wau e hana i kēia, no ka mea. hana imshow() Hiki iā ia ke kaha kiʻi ma o ka QT, GTK a me Windows interfaces, ʻoiaʻiʻo, ʻaʻole ia i loko o ka config no STM32. ʻOiaʻiʻo, hiki ke holo ʻia ka QT ma STM32F7Discovery, akā e kūkākūkā ʻia kēia ma kekahi ʻatikala 🙂

Ma hope o ka wehewehe pōkole ʻana i ke ʻano i mālama ʻia ka hopena o ka ʻike maka, loaʻa iā mākou kahi kiʻi.

OpenCV ma STM32F7-Discovery

kiʻi kumu

OpenCV ma STM32F7-Discovery

hopena

E holo ana ma STM32F7Discovery

Ma ka 32F746GDISCOVERY he nui nā ʻāpana hoʻomanaʻo hardware hiki iā mākou ke hoʻohana i kekahi ala a i ʻole.

  1. 320KiB RAM
  2. 1MiB flash no ke kiʻi
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. slot kāleka microSD

Hiki ke hoʻohana ʻia kahi kāleka SD e mālama i nā kiʻi, akā i ke ʻano o ka holo ʻana i kahi hiʻohiʻona liʻiliʻi, ʻaʻole pono kēia.
ʻO ka hōʻike he 480 × 272 hoʻonā, ʻo ia hoʻi, ʻo ka hoʻomanaʻo framebuffer he 522 bytes ma kahi hohonu o 240 bits, ʻo ia hoʻi. ʻOi aku kēia ma mua o ka nui o ka RAM, no laila ʻo ka framebuffer a me ka puʻu (e koi ʻia, me OpenCV, e mālama i ka ʻikepili no nā kiʻi a me nā hale kōkua) e loaʻa i SDRAM, nā mea āpau (hoʻomanaʻo no nā stacks a me nā pono ʻē aʻe. ) e hele i ka RAM.

Inā lawe mākou i ka hoʻonohonoho liʻiliʻi loa no STM32F7Discovery (hoʻolei i ka pūnaewele holoʻokoʻa, nā kauoha āpau, e hana i nā pūʻulu liʻiliʻi e like me ka hiki, a me nā mea ʻē aʻe) a hoʻohui iā OpenCV me nā hiʻohiʻona ma laila, ʻo ka hoʻomanaʻo pono e like me kēia:

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

No ka poe i kamaaina ole i na pauku hea, e wehewehe au: in .text и .rodata ʻO nā ʻōlelo aʻo a me nā mea mau (ma ka ʻōlelo ʻana, ka ʻikepili heluhelu wale nō) aia i loko .data hiki ke loli ka ʻikepili, .bss aia nā ʻano "nulled", akā naʻe, pono kahi wahi (e "hele" kēia ʻāpana i RAM).

ʻO ka nūhou maikaʻi kēlā .data/.bss kupono, aka me .text ʻO ka pilikia he 1MiB wale nō ka hoʻomanaʻo no ke kiʻi. Hiki ke kiola ʻia i waho .text ke kiʻi mai ka laʻana a heluhelu ia, no ka laʻana, mai ke kāleka SD i ka hoʻomanaʻo i ka hoʻomaka ʻana, akā ke kaupaona ʻo fruits.png ma kahi o 330KiB, no laila ʻaʻole kēia e hoʻonā i ka pilikia: ka hapa nui .text aia i ka OpenCV code.

Ma ka nui, hoʻokahi wale nō mea i koe - e hoʻouka ana i kahi ʻāpana o ke code ma kahi flash QSPI (he ʻano hana kūikawā no ka hoʻomanaʻo ʻana i ka hoʻomanaʻo ʻana i ke kaʻa ʻōnaehana, i hiki i ka mea hana ke komo pololei i kēia ʻikepili). I kēia hihia, kū mai kahi pilikia: ʻo ka mea mua, ʻaʻole i loaʻa ka hoʻomanaʻo o kahi flash drive QSPI ma hope koke o ka hoʻomaka ʻana o ka hāmeʻa (pono ʻoe e hoʻokaʻawale i ke ʻano hoʻomanaʻo-mapped mode), a ʻo ka lua, ʻaʻole hiki iā ʻoe ke "flash" i kēia hoʻomanaʻo me he bootloader kamaʻāina.

ʻO ka hopena, ua hoʻoholo ʻia e hoʻopili i nā code a pau ma QSPI, a uila iā ia me kahi loader kākau ponoʻī e loaʻa i ka binary pono ma o TFTP.

hopena

Ua ʻike ʻia ka manaʻo e lawe i kēia waihona iā Embox ma kahi o hoʻokahi makahiki i hala, akā ua hoʻopanee pinepine ʻia ma muli o nā kumu like ʻole. ʻO kekahi o lākou ke kākoʻo no libstdc ++ a me ka waihona waihona maʻamau. ʻO ka pilikia o ke kākoʻo C ++ ma Embox ma waho aʻe o ke ʻano o kēia ʻatikala, no laila e ʻōlelo wale wau ua hoʻokō mākou i kēia kākoʻo i ka nui kūpono no kēia waihona e hana 🙂

I ka hopena, ua lanakila kēia mau pilikia (ma ka liʻiliʻi loa no ka hana OpenCV e hana), a holo ka laʻana. He 40 kekona lōʻihi no ka ʻimi ʻana o ka papa i nā palena me ka kānana Canny. ʻO kēia, ʻoiaʻiʻo, lōʻihi loa (aia nā noʻonoʻo e pili ana i ka hoʻomaikaʻi ʻana i kēia mea, hiki ke kākau i kahi ʻatikala ʻokoʻa e pili ana i kēia inā e kūleʻa).

OpenCV ma STM32F7-Discovery

Eia naʻe, ʻo ka pahuhopu waena ka hana ʻana i kahi prototype e hōʻike ana i ka hiki ke holo i ka OpenCV ma STM32, kēlā me kēia, ua hoʻokō ʻia kēia pahuhopu, hooray!

tl;dr: nā ʻōlelo kuhikuhi i kēlā me kēia pae

0: Hoʻoiho i nā kumu Embox, e like me kēia:

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

1: E hoʻomaka kākou ma ka hoʻohui ʻana i kahi bootloader e "flash" a QSPI flash drive.

    make confload-arm/stm32f7cube

I kēia manawa pono ʻoe e hoʻonohonoho i ka pūnaewele, no ka mea. E hoʻouka mākou i ke kiʻi ma o TFTP. No ka hoʻonohonoho ʻana i ka papa a me ka hoʻokipa IP, pono ʻoe e hoʻoponopono i ka conf/rootfs/network.

Laʻana hoʻonohonoho:

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 - ka helu hoʻokipa mai kahi e hoʻouka ʻia ai ke kiʻi, address - helu wahi o ka papa.

Ma hope o kēlā, hōʻiliʻili mākou i ka bootloader:

    make

2: ʻO ka hoʻouka maʻamau o ka bootloader (e kala mai no ka pun) ma ka papa - ʻaʻohe mea kikoʻī ma aneʻi, pono ʻoe e hana e like me nā noi ʻē aʻe no STM32F7Discovery. Inā ʻaʻole ʻoe maopopo pehea e hana ai, hiki iā ʻoe ke heluhelu e pili ana maanei.
3: Hoʻopili i kahi kiʻi me kahi config no OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Wehe mai nā ʻāpana ELF e kākau ʻia i QSPI i 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

Aia kahi palapala ma ka papa kuhikuhi conf e hana i kēia, no laila hiki iā ʻoe ke holo

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

5: Me ka hoʻohana ʻana i ka tftp, hoʻoiho i ka qspi.bin.bin i kahi pahu uila QSPI. Ma ka mea hoʻokipa, e hana i kēia, kope qspi.bin i ka waihona kumu o ka server tftp (maʻamau / srv/tftp/ a i ʻole /var/lib/tftpboot/; loaʻa nā pūʻolo no ka server pili i nā māhele kaulana loa, i kapa pinepine ʻia. tftpd a i ʻole tftp-hpa, i kekahi manawa pono ʻoe e hana systemctl start tftpd.service e hoʻomaka).

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

Ma ka Embox (ʻo ia hoʻi i ka bootloader), pono ʻoe e hoʻokō i kēia kauoha (manaʻo mākou aia ka server i ka helu 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Me ke kauoha goto pono ʻoe e "lele" i ka hoʻomanaʻo QSPI. E ʻokoʻa ka wahi kikoʻī ma muli o ka pili ʻana o ke kiʻi, hiki iā ʻoe ke ʻike i kēia helu me ke kauoha mem 0x90000000 (ua pili ka helu hoʻomaka i ka huaʻōlelo 32-bit ʻelua o ke kiʻi); e pono no hoi oe e hae i ka ahu -s, aia ka helu helu ma 0x90000000, laʻana:

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

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

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

7: Hoʻomaka

    embox> edges 20

a hauʻoli i ka huli palena 40-kekona 🙂

Inā hewa kekahi mea - e kākau i kahi pilikia ma kā mākou waihona, a i ʻole i ka papa inoa leka uila [pale ʻia ka leka uila], a i ʻole ma kahi ʻōlelo ma aneʻi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka