ṢiiCV lori STM32F7-Awari

ṢiiCV lori STM32F7-Awari Emi li ọkan ninu awọn Difelopa ti awọn ẹrọ Apoti, ati ninu nkan yii Emi yoo sọrọ nipa bii MO ṣe ṣakoso lati ṣiṣẹ OpenCV lori igbimọ STM32746G.

Ti o ba tẹ nkan bii “OpenCV lori igbimọ STM32” sinu ẹrọ wiwa, o le wa awọn eniyan diẹ ti o nifẹ si lilo ile-ikawe yii lori awọn igbimọ STM32 tabi awọn oludari microcontroller miiran.
Awọn fidio pupọ wa ti, ṣiṣe idajọ nipasẹ orukọ, yẹ ki o ṣafihan ohun ti o nilo, ṣugbọn nigbagbogbo (ni gbogbo awọn fidio ti Mo rii) lori igbimọ STM32, aworan nikan ni a gba lati kamẹra ati abajade ti han loju iboju, ati ṣiṣe aworan funrararẹ ti ṣe boya lori kọnputa deede, tabi lori awọn igbimọ ti o lagbara diẹ sii (fun apẹẹrẹ, Rasipibẹri Pi).

Kini idi ti o ṣoro?

Gbaye-gbale ti awọn ibeere wiwa jẹ alaye nipasẹ otitọ pe OpenCV jẹ ile-ikawe iran kọnputa olokiki julọ, eyiti o tumọ si pe awọn olupilẹṣẹ diẹ sii faramọ pẹlu rẹ, ati agbara lati ṣiṣẹ koodu imurasilẹ-lori tabili lori microcontroller jẹ ki ilana idagbasoke rọrun pupọ. Ṣugbọn kilode ti ko si awọn ilana ti o ṣetan-ṣe olokiki fun yiyan iṣoro yii?

Iṣoro ti lilo OpenCV lori awọn shawls kekere jẹ ibatan si awọn ẹya meji:

  • Ti o ba ṣajọ ile-ikawe paapaa pẹlu eto awọn modulu kekere, kii yoo ni ibamu si iranti filasi ti STM32F7Discovery kanna (paapaa laisi akiyesi OS) nitori koodu ti o tobi pupọ (awọn megabytes pupọ ti awọn ilana)
  • Ile-ikawe funrararẹ ni a kọ sinu C ++, eyiti o tumọ si
    • Nilo atilẹyin fun akoko ṣiṣe rere (awọn imukuro, ati bẹbẹ lọ)
    • Atilẹyin kekere fun LibC/Posix, eyiti a rii nigbagbogbo ni OS fun awọn eto ifibọ - o nilo boṣewa kan pẹlu ile-ikawe ati ile ikawe awoṣe STL boṣewa (fekito, ati bẹbẹ lọ)

Gbigbe si Apoti

Gẹgẹbi igbagbogbo, ṣaaju gbigbe awọn eto eyikeyi si ẹrọ ṣiṣe, o jẹ imọran ti o dara lati gbiyanju lati kọ ni fọọmu eyiti awọn olupilẹṣẹ pinnu rẹ. Ninu ọran wa, ko si awọn iṣoro pẹlu eyi - koodu orisun le ṣee rii lori github, Ile-ikawe ti kọ labẹ GNU/Linux pẹlu cmake deede.

Irohin ti o dara ni pe OpenCV le ṣe bi ile-ikawe aimi lati inu apoti, eyiti o jẹ ki gbigbe gbigbe rọrun. A gba a ìkàwé pẹlu kan boṣewa konfigi ati ki o wo bi o Elo aaye ti won gba soke. Kọọkan module ti wa ni gba ni lọtọ ìkàwé.

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

Gẹgẹbi o ti le rii lati laini to kẹhin, .bss ati .data ko gba aaye pupọ, ṣugbọn koodu naa jẹ diẹ sii ju 70 MiB. O han gbangba pe ti eyi ba ni asopọ ni iṣiro si ohun elo kan pato, koodu yoo dinku.

Jẹ ki a gbiyanju lati jabọ jade bi ọpọlọpọ awọn modulu bi o ti ṣee ṣe ki apẹẹrẹ ti o kere julọ ni apejọ (eyiti, fun apẹẹrẹ, yoo ṣe agbejade ẹya OpenCV nirọrun), nitorinaa a wo. cmake .. -LA ki o si pa ninu awọn aṣayan ohun gbogbo ti o wa ni pipa.

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

Ni apa kan, eyi jẹ module kan nikan ti ile-ikawe, ni apa keji, eyi jẹ laisi iṣapeye akopọ fun iwọn koodu (-Os). ~ 3 MiB ti koodu tun jẹ pupọ pupọ, ṣugbọn tẹlẹ funni ni ireti fun aṣeyọri.

Ṣiṣe ni emulator

O rọrun pupọ lati ṣatunṣe lori emulator, nitorinaa akọkọ rii daju pe ile-ikawe ṣiṣẹ lori qemu. Bi ohun emulated Syeed, Mo ti yan Integrator / CP, nitori Ni akọkọ, o tun jẹ ARM, ati keji, Embox ṣe atilẹyin iṣelọpọ awọn aworan fun pẹpẹ yii.

Embox ni ẹrọ kan fun kikọ awọn ile ikawe itagbangba, lilo rẹ a ṣafikun OpenCV bi module (gbigba gbogbo awọn aṣayan kanna fun “iwọn” kọ ni irisi awọn ile-ikawe aimi), lẹhin iyẹn Mo ṣafikun ohun elo ti o rọrun ti o dabi eyi:

version.cpp:

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

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

    return 0;
}

A pejọ eto naa, ṣiṣe rẹ - a gba abajade ti a nireti.

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

Igbesẹ ti o tẹle ni lati ṣiṣẹ diẹ ninu apẹẹrẹ, pelu ọkan ninu awọn boṣewa ti a funni nipasẹ awọn olupilẹṣẹ funrararẹ. lori aaye rẹ. Mo yan aala oluwari canny.

Apeere naa ni lati tun kọ die-die lati ṣafihan aworan naa pẹlu abajade taara ninu ifipamọ fireemu. Mo ni lati ṣe eyi, nitori. iṣẹ imshow() le fa awọn aworan nipasẹ QT, GTK ati awọn atọkun Windows, eyiti, dajudaju, kii yoo wa ni atunto fun STM32. Ni otitọ, QT tun le ṣiṣẹ lori STM32F7Discovery, ṣugbọn eyi ni yoo jiroro ni nkan miiran 🙂

Lẹhin alaye kukuru ninu eyiti ọna kika abajade ti oluwari eti ti wa ni ipamọ, a gba aworan kan.

ṢiiCV lori STM32F7-Awari

atilẹba aworan

ṢiiCV lori STM32F7-Awari

Esi

Nṣiṣẹ lori STM32F7Discovery

Lori 32F746GDISCOVERY ọpọlọpọ awọn apakan iranti hardware wa ti a le lo ni ọna kan tabi omiiran

  1. 320KiB Ramu
  2. 1MiB filasi fun aworan
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND Flash
  5. Iho kaadi microSD

Kaadi SD le ṣee lo lati tọju awọn aworan, ṣugbọn ni aaye ti ṣiṣe apẹẹrẹ kekere, eyi ko wulo pupọ.
Ifihan naa ni ipinnu ti 480×272, eyi ti o tumọ si pe iranti framebuffer yoo jẹ 522 awọn baiti ni ijinle 240 bits, i.e. Eyi jẹ diẹ sii ju iwọn Ramu lọ, nitorinaa framebuffer ati okiti (eyi ti yoo nilo, pẹlu fun OpenCV, lati tọju data fun awọn aworan ati awọn ẹya arannilọwọ) yoo wa ni SDRAM, ohun gbogbo miiran (iranti fun awọn akopọ ati awọn iwulo eto miiran). ) yoo lọ si Ramu.

Ti a ba mu atunto to kere julọ fun STM32F7Discovery (jabọ gbogbo nẹtiwọọki, gbogbo awọn aṣẹ, ṣe awọn akopọ bi o ti ṣee ṣe, ati bẹbẹ lọ) ati ṣafikun OpenCV pẹlu awọn apẹẹrẹ nibẹ, iranti ti o nilo yoo jẹ atẹle yii:

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

Fun awon ti o wa ni ko gan faramọ pẹlu eyi ti ruju lọ ibi ti, Emi yoo se alaye: ni .text и .rodata awọn ilana ati awọn igbagbogbo (ni aijọju sisọ, data kika nikan) dubulẹ ninu .data data jẹ iyipada, .bss awọn oniyipada “asan” wa, eyiti, sibẹsibẹ, nilo aaye kan (apakan yii yoo “lọ” si Ramu).

Irohin ti o dara ni pe .data/.bss yẹ ki o baamu, ṣugbọn pẹlu .text iṣoro naa ni pe 1MiB ti iranti nikan wa fun aworan naa. Le ti wa ni ju jade .text aworan lati apẹẹrẹ ki o ka, fun apẹẹrẹ, lati kaadi SD sinu iranti ni ibẹrẹ, ṣugbọn awọn eso.png ṣe iwọn nipa 330KiB, nitorina eyi kii yoo yanju iṣoro naa: julọ. .text oriširiši OpenCV koodu.

Nipa ati ki o tobi, nibẹ ni nikan kan ohun osi - ikojọpọ apa kan ninu awọn koodu pẹlẹpẹlẹ a QSPI filasi (o ni o ni pataki kan mode ti isẹ fun a maapu iranti si awọn eto bosi, ki awọn isise le wọle si yi data taara). Ni ọran yii, iṣoro kan dide: ni akọkọ, iranti ti dirafu filasi QSPI ko wa lẹsẹkẹsẹ lẹhin atunbere ẹrọ naa (o nilo lati ṣe ipilẹṣẹ ipo iranti ti o ya sọtọ lọtọ), ati ni ẹẹkeji, iwọ ko le “filaṣi” iranti yii pẹlu a faramọ bootloader.

Bi abajade, o pinnu lati sopọ gbogbo koodu ni QSPI, ati filasi rẹ pẹlu agberu ti ara ẹni ti yoo gba alakomeji ti o nilo nipasẹ TFTP.

Esi

Ero lati gbe ile-ikawe yii si Embox han ni ọdun kan sẹhin, ṣugbọn leralera o sun siwaju nitori ọpọlọpọ awọn idi. Ọkan ninu wọn jẹ atilẹyin fun libstdc++ ati ile-ikawe awoṣe boṣewa. Iṣoro ti atilẹyin C ++ ni Embox kọja ipari ti nkan yii, nitorinaa Emi yoo sọ nikan pe a ṣakoso lati ṣaṣeyọri atilẹyin yii ni iye to tọ fun ile-ikawe yii lati ṣiṣẹ 🙂

Ni ipari, awọn iṣoro wọnyi ti bori (o kere ju fun apẹẹrẹ OpenCV lati ṣiṣẹ), ati apẹẹrẹ naa nṣiṣẹ. Yoo gba to iṣẹju-aaya 40 fun igbimọ lati wa awọn aala nipa lilo àlẹmọ Canny. Eyi, dajudaju, gun ju (awọn ero wa lori bi o ṣe le mu ọrọ yii dara, yoo ṣee ṣe lati kọ nkan lọtọ nipa eyi ni ọran ti aṣeyọri).

ṢiiCV lori STM32F7-Awari

Sibẹsibẹ, ibi-afẹde agbedemeji ni lati ṣẹda apẹrẹ kan ti yoo ṣafihan iṣeeṣe ipilẹ ti ṣiṣiṣẹ OpenCV lori STM32, ni atele, ibi-afẹde yii ti waye, hooray!

tl;dr: igbese nipa igbese ilana

0: Ṣe igbasilẹ awọn orisun Embox, bii eyi:

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

1: Jẹ ká bẹrẹ nipa a Nto a bootloader ti yoo "filasi" a QSPI filasi drive.

    make confload-arm/stm32f7cube

Bayi o nilo lati tunto nẹtiwọki, nitori. A yoo po si aworan nipasẹ TFTP. Lati ṣeto igbimọ ati gbalejo awọn adirẹsi IP, o nilo lati satunkọ conf/rootfs/nẹtiwọọki.

Apẹẹrẹ iṣeto:

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 - adirẹsi ogun lati ibiti aworan yoo ti gbe, address - adirẹsi ti awọn ọkọ.

Lẹhin iyẹn, a gba bootloader:

    make

2: Ikojọpọ igbagbogbo ti bootloader (binu fun pun) lori igbimọ - ko si ohunkan pato nibi, o nilo lati ṣe bi fun eyikeyi ohun elo miiran fun STM32F7Discovery. Ti o ko ba mọ bi o ṣe le ṣe, o le ka nipa rẹ nibi.
3: Iṣakojọpọ aworan pẹlu atunto kan fun OpenCV.

    make confload-platform/opencv/stm32f7discovery
    make

4: Jade lati awọn apakan ELF lati kọ si QSPI si 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

Iwe afọwọkọ kan wa ninu itọsọna conf ti o ṣe eyi, nitorinaa o le ṣiṣe

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

5: Lilo tftp, ṣe igbasilẹ qspi.bin.bin si kọnputa filasi QSPI kan. Lori agbalejo, lati ṣe eyi, daakọ qspi.bin si folda root ti olupin tftp (nigbagbogbo / srv/tftp/ tabi / var/lib/tftpboot/; awọn idii fun olupin ti o baamu wa ni awọn pinpin olokiki julọ, ti a npe ni nigbagbogbo tftpd tabi tftp-hpa, nigbami o ni lati ṣe systemctl start tftpd.service lati bẹrẹ).

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

Lori Embox (ie ni bootloader), o nilo lati ṣiṣẹ pipaṣẹ atẹle (a ro pe olupin naa ni adirẹsi 192.168.2.1):

    embox> qspi_loader qspi.bin 192.168.2.1

6: Pelu ase goto o nilo a "fo" sinu QSPI iranti. Ipo kan pato yoo yatọ si da lori bi aworan ṣe sopọ, o le rii adirẹsi yii pẹlu aṣẹ naa mem 0x90000000 (adirẹsi ibẹrẹ ni ibamu si ọrọ 32-bit keji ti aworan naa); iwọ yoo tun nilo lati fi ami si akopọ naa -s, adirẹsi akopọ wa ni 0x90000000, apẹẹrẹ:

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

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

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

7: Ifilọlẹ

    embox> edges 20

ati ki o gbadun wiwa aala 40-keji 🙂

Ti nkan kan ba jẹ aṣiṣe - kọ ọrọ kan sinu ibi ipamọ wa, tabi si akojọ ifiweranṣẹ [imeeli ni idaabobo], tabi ni a ọrọìwòye nibi.

orisun: www.habr.com

Fi ọrọìwòye kun