BuɗeCV akan STM32F7-Ganowa

BuɗeCV akan STM32F7-Ganowa Ina ɗaya daga cikin masu haɓaka tsarin aiki Akwati, kuma a cikin wannan labarin zan yi magana game da yadda na gudanar da gudanar da OpenCV akan allon STM32746G.

Idan ka rubuta wani abu kamar "OpenCV akan allon STM32" a cikin injin bincike, za ka iya samun mutane kaɗan waɗanda ke da sha'awar amfani da wannan ɗakin karatu a kan allunan STM32 ko wasu microcontrollers.
Akwai bidiyo da yawa waɗanda, yin la'akari da sunan, yakamata su nuna abin da ake buƙata, amma yawanci (a cikin duk bidiyon da na gani) akan allon STM32, hoton kawai ya karɓi daga kyamara kuma an nuna sakamakon akan allon. kuma sarrafa hoton kanta an yi shi ko dai akan kwamfuta ta yau da kullun, ko kuma akan alluna masu ƙarfi (misali, Raspberry Pi).

Me yasa yake da wahala?

Shahararriyar tambayoyin neman bayanai an bayyana shi ta hanyar cewa OpenCV ita ce mashahurin ɗakin karatu na hangen nesa na kwamfuta, wanda ke nufin cewa yawancin masu haɓakawa sun saba da shi, kuma ikon sarrafa lambar shirye-shiryen tebur akan microcontroller yana sauƙaƙa tsarin haɓakawa sosai. Amma me yasa har yanzu babu shahararrun girke-girke da aka shirya don magance wannan matsala?

Matsalar amfani da OpenCV akan ƙananan shawl yana da alaƙa da fasali guda biyu:

  • Idan kun tattara ɗakin karatu har ma da ƙaramin saiti na kayayyaki, kawai ba zai dace da ƙwaƙwalwar walƙiya na STM32F7Discovery guda ɗaya ba (ko da ba tare da la'akari da OS ba) saboda babban lambar (megabytes da yawa na umarni)
  • Laburaren da kansa an rubuta shi da C++, wanda ke nufin
    • Bukatar tallafi don ingantaccen lokacin gudu (bangare, da sauransu)
    • Ƙananan tallafi don LibC/Posix, wanda galibi ana samunsa a cikin OS don tsarin da aka haɗa - kuna buƙatar ma'auni da ɗakin karatu da daidaitaccen ɗakin karatu na samfurin STL (vector, da sauransu)

Ana aikawa zuwa Embox

Kamar yadda aka saba, kafin a tura kowace manhaja zuwa tsarin aiki, yana da kyau a yi kokarin gina shi ta hanyar da masu ci gaba suka nufa da shi. A cikin yanayinmu, babu matsaloli tare da wannan - ana iya samun lambar tushe akan github, an gina ɗakin karatu a ƙarƙashin GNU/Linux tare da cmake da aka saba.

Labari mai dadi shine cewa ana iya gina OpenCV daga cikin akwatin azaman ɗakin karatu na tsaye, wanda ke sauƙaƙe jigilar kaya. Muna tattara ɗakin karatu tare da daidaitaccen tsari kuma mu ga yawan sararin da suke ɗauka. Ana tattara kowane nau'i a cikin ɗakin karatu daban.

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

Kamar yadda kake gani daga layi na ƙarshe, .bss da .data ba su ɗaukar sarari da yawa, amma lambar ta fi 70 MiB. A bayyane yake cewa idan an haɗa wannan a ƙididdiga zuwa takamaiman aikace-aikacen, lambar za ta zama ƙasa.

Bari mu yi ƙoƙari mu jefar da yawancin kayayyaki kamar yadda zai yiwu domin ƙaramin misali ya taru (wanda, alal misali, kawai zai fitar da sigar OpenCV), don haka muna duba. cmake .. -LA kuma kashe a cikin zaɓuɓɓukan duk abin da ke kashewa.

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

A gefe guda, wannan nau'in ɗakin karatu ɗaya ne kawai, a gefe guda, wannan ba tare da haɓaka haɓakawa don girman lambar ba (-Os). ~3 MiB na lambar har yanzu yana da yawa, amma ya riga ya ba da bege ga nasara.

Gudu a cikin emulator

Yana da sauƙin gyara kuskure akan kwaikwaiyo, don haka da farko tabbatar da cewa ɗakin karatu yana aiki akan qemu. A matsayin dandamalin da aka kwaikwayi, na zaɓi Integrator / CP, saboda na farko, shi ma ARM ne, na biyu kuma, Embox yana goyan bayan fitowar hotuna don wannan dandali.

Embox yana da hanyar gina ɗakunan karatu na waje, ta amfani da shi muna ƙara OpenCV azaman module (wucewa duk zaɓuɓɓuka iri ɗaya don ginin "ƙananan" a cikin nau'ikan ɗakunan karatu na tsaye), bayan haka na ƙara aikace-aikacen mai sauƙi mai kama da wannan:

version.cpp:

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

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

    return 0;
}

Muna tattara tsarin, gudanar da shi - muna samun abin da ake sa ran.

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

Mataki na gaba shine gudanar da wasu misali, zai fi dacewa ɗaya daga cikin daidaitattun waɗanda masu haɓakawa suke bayarwa. a shafinku. na zaba canny mai gano iyaka.

Dole ne a sake rubuta misalin don nuna hoton tare da sakamakon kai tsaye a cikin ma'ajin firam. Dole ne in yi wannan, saboda. aiki imshow() na iya zana hotuna ta hanyar mu'amalar QT, GTK da Windows, wanda, ba shakka, ba zai kasance cikin tsarin STM32 ba. A zahiri, ana iya gudanar da QT akan STM32F7Discovery, amma za'a tattauna wannan a wani labarin 🙂

Bayan ɗan taƙaitaccen bayani a cikin wane tsari aka adana sakamakon mai gano gefen, muna samun hoto.

BuɗeCV akan STM32F7-Ganowa

hoto na asali

BuɗeCV akan STM32F7-Ganowa

sakamakon

Yin Gudu akan STM32F7Discovery

A kan 32F746GDISCOVERY akwai sassan ƙwaƙwalwar ajiyar hardware da yawa waɗanda za mu iya amfani da su ta wata hanya ko wata.

  1. 320 KB RAM
  2. 1MiB flash don hoto
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. Ramin katin microSD

Ana iya amfani da katin SD don adana hotuna, amma a cikin mahallin gudanar da ƙaramin misali, wannan ba shi da amfani sosai.
Nuni yana da ƙuduri na 480 × 272, wanda ke nufin cewa ƙwaƙwalwar ajiyar framebuffer za ta kasance 522 bytes a zurfin 240 bits, watau. wannan ya fi girman RAM, don haka framebuffer da heap (wanda za a buƙaci, ciki har da OpenCV, don adana bayanai don hotuna da tsarin kayan aiki) za su kasance a cikin SDRAM, duk wani abu (ƙwaƙwalwar ƙwaƙwalwar ajiya da sauran bukatun tsarin). ) zai fara zuwa RAM.

Idan muka ɗauki mafi ƙarancin saiti don STM32F7Discovery (fitar da hanyar sadarwa gaba ɗaya, duk umarni, sanya tari a matsayin ƙanƙanta gwargwadon yiwuwa, da sauransu) kuma ƙara OpenCV tare da misalai a can, ƙwaƙwalwar da ake buƙata zata kasance kamar haka:

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

Ga wadanda ba su da masaniya da waɗanne sassan ke zuwa, zan yi bayani: in .text и .rodata umarnin da akai-akai (kusan yin magana, bayanan karatu kawai) sun kwanta .data data iya canzawa, .bss akwai masu canji na "rasa", waɗanda, duk da haka, suna buƙatar wuri (wannan sashe zai "tafi" zuwa RAM).

Labari mai dadi shine .data/.bss ya kamata ya dace, amma tare da .text Matsalar ita ce akwai kawai 1MiB na ƙwaƙwalwar ajiya don hoton. Ana iya jefar da shi waje .text Hoton daga misalin kuma karanta shi, alal misali, daga katin SD zuwa ƙwaƙwalwar ajiya a farawa, amma fruit.png yana auna kimanin 330KiB, don haka wannan ba zai magance matsalar ba: mafi yawan. .text ya ƙunshi lambar OpenCV.

Gabaɗaya, abu ɗaya ne kawai ya rage - loda wani ɓangaren lambar akan filasha QSPI (yana da yanayin aiki na musamman don yin taswirar ƙwaƙwalwar ajiya zuwa bas ɗin tsarin, ta yadda mai sarrafawa zai iya samun damar wannan bayanan kai tsaye). A wannan yanayin, matsala ta taso: da farko, ƙwaƙwalwar QSPI flash drive ba ta samuwa nan da nan bayan an sake kunna na'urar (kana buƙatar fara fara yanayin taswirar ƙwaƙwalwar ajiya daban), kuma na biyu, ba za ku iya "flash" wannan ƙwaƙwalwar ba tare da shi. saba bootloader.

A sakamakon haka, an yanke shawarar haɗa duk lambar a cikin QSPI, kuma a kunna shi tare da mai ɗaukar hoto wanda zai karɓi binary ɗin da ake buƙata ta hanyar TFTP.

sakamakon

Tunanin aika wannan ɗakin karatu zuwa Embox ya bayyana kusan shekara guda da ta gabata, amma akai-akai an jinkirta shi saboda wasu dalilai. Ɗayan su shine goyan baya ga libstdc++ da madaidaicin ɗakin karatu na samfuri. Matsalar tallafin C ++ a cikin Embox ya wuce iyakar wannan labarin, don haka a nan zan ce kawai mun sami nasarar cimma wannan tallafin a cikin adadin da ya dace don wannan ɗakin karatu ya yi aiki 🙂

A ƙarshe, an shawo kan waɗannan matsalolin (aƙalla isa ga misalin OpenCV don yin aiki), kuma misalin ya gudana. Yana ɗaukar tsawon daƙiƙa 40 don allon don bincika iyakoki ta amfani da tace Canny. Wannan, ba shakka, ya yi tsayi sosai (akwai la'akari da yadda za a inganta wannan al'amari, zai yiwu a rubuta wani labarin dabam game da wannan idan an yi nasara).

BuɗeCV akan STM32F7-Ganowa

Koyaya, maƙasudin matsakaici shine ƙirƙirar samfuri wanda zai nuna ainihin yuwuwar gudanar da OpenCV akan STM32, bi da bi, an cimma wannan burin, hooray!

tl;dr: umarnin mataki-mataki

0: Zazzage tushen Embox, kamar haka:

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

1: Bari mu fara da harhada bootloader wanda zai "flash" QSPI flash drive.

    make confload-arm/stm32f7cube

Yanzu kuna buƙatar saita hanyar sadarwar, saboda. Za mu loda hoton ta hanyar TFTP. Don saita allon da karɓar adiresoshin IP, kuna buƙatar shirya conf/rootfs/network.

Misalin tsari:

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 - adireshin masauki daga inda za a loda hoton, address - adireshin hukumar.

Bayan haka, muna tattara bootloader:

    make

2: Yawan shigar da bootloader na yau da kullun (yi hakuri da pun) akan allo - babu wani takamaiman abu anan, kuna buƙatar yin shi kamar kowane aikace-aikacen STM32F7Discovery. Idan baku san yadda ake yi ba, kuna iya karantawa game da shi a nan.
3: Haɗa hoto tare da saiti don OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Cire daga sassan ELF don rubutawa zuwa QSPI zuwa 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

Akwai rubutun a cikin kundin adireshin da ke yin wannan, don haka za ku iya gudanar da shi

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

5: Ta amfani da tftp, zazzage qspi.bin.bin zuwa filasha QSPI. A kan mai watsa shiri, don yin wannan, kwafi qspi.bin zuwa tushen babban fayil na uwar garken tftp (yawanci / srv/tftp/ ko /var/lib/tftpboot/; fakitin uwar garken da ya dace suna samuwa a cikin mafi yawan shahararrun rabawa, yawanci ake kira tftpd ko tftp-hpa, wani lokacin dole ku yi systemctl start tftpd.service fara).

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

A kan Embox (watau a cikin bootloader), kuna buƙatar aiwatar da umarni mai zuwa (muna ɗauka cewa uwar garken yana da adireshin 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Da umarni goto kuna buƙatar "tsalle" cikin ƙwaƙwalwar QSPI. Musamman wurin zai bambanta dangane da yadda aka haɗa hoton, zaku iya ganin wannan adireshin tare da umarnin mem 0x90000000 (adireshin farawa ya dace da kalmar 32-bit na biyu na hoton); za ku kuma buƙaci tuta tari -s, adireshin da aka tara yana a 0x90000000, misali:

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

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

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

7: Kaddamar

    embox> edges 20

kuma ku ji daɗin binciken iyaka na daƙiƙa 40 🙂

Idan wani abu ba daidai ba - rubuta wani batu a ciki ma'ajiyar mu, ko zuwa jerin aikawasiku [email kariya], ko a sharhi a nan.

source: www.habr.com

Add a comment