OpenCV په STM32F7-Discovery کې

OpenCV په STM32F7-Discovery کې زه د عملیاتي سیسټم یو له پراختیا کونکو څخه یم ایمبکس، او پدې مقاله کې به زه د دې په اړه وغږیږم چې څنګه ما د STM32746G بورډ کې OpenCV پرمخ وړم.

که تاسو د لټون انجن کې "OpenCV on STM32 board" په څیر یو څه ټایپ کړئ، تاسو کولی شئ ډیر لږ خلک ومومئ چې د STM32 بورډونو یا نورو مایکرو کنټرولرونو کې د دې کتابتون کارولو سره علاقه لري.
ډیری ویډیوګانې شتون لري چې د نوم په واسطه قضاوت کول باید وښیې چې څه ته اړتیا ده ، مګر معمولا (په ټولو ویډیوګانو کې چې ما ولیدل) په STM32 بورډ کې ، یوازې عکس د کیمرې څخه ترلاسه شوی او پایله یې په سکرین کې ښودل شوې ، او پخپله د عکس پروسس کول یا په منظم کمپیوټر کې ترسره شوي، یا په ډیرو پیاوړو بورډونو (د مثال په توګه، راسبیري پای).

ولې ستونزمن دی؟

د لټون پوښتنو شهرت د دې حقیقت لخوا توضیح شوی چې OpenCV د کمپیوټر لید خورا مشهور کتابتون دی ، پدې معنی چې ډیر پراختیا کونکي ورسره آشنا دي ، او په مایکرو کنټرولر کې د ډیسټاپ چمتو کوډ چلولو وړتیا د پراختیا پروسه خورا ساده کوي. مګر ولې لاهم د دې ستونزې د حل لپاره مشهور چمتو شوي ترکیبونه شتون نلري؟

په کوچنیو شالونو کې د OpenCV کارولو ستونزه په دوو ځانګړتیاو پورې اړه لري:

  • که تاسو کتابتون حتی د لږترلږه ماډلونو سره تالیف کړئ ، نو دا به د خورا لوی کوډ (د څو میګابایټ لارښوونو) له امله د ورته STM32F7Discovery (حتی د OS په پام کې نیولو پرته) په فلش حافظه کې مناسب نه وي.
  • کتابتون پخپله په C++ کې لیکل شوی، چې معنی لري
    • د مثبت چلولو لپاره ملاتړ ته اړتیا لري (استثنا، او نور)
    • د LibC/Posix لپاره لږ ملاتړ، کوم چې معمولا د ایمبیډ شوي سیسټمونو لپاره په OS کې موندل کیږي - تاسو یو معیاري پلس کتابتون او د معیاري STL ټیمپلیټ کتابتون (ویکٹر، او نور) ته اړتیا لرئ.

ایمبکس ته پورټ کول

د معمول په څیر، مخکې له دې چې عملیاتي سیسټم ته کوم پروګرامونه پورټ کړئ، دا ښه نظر دی چې هڅه وکړئ دا په هغه بڼه کې جوړ کړئ چې پراختیا کونکي یې اراده لري. زموږ په قضیه کې ، پدې کې کومه ستونزه شتون نلري - د سرچینې کوډ موندل کیدی شي githubکتابتون د GNU/Linux لاندې د معمول cmake سره جوړ شوی.

ښه خبر دا دی چې OpenCV د بکس څخه بهر د جامد کتابتون په توګه رامینځته کیدی شي ، کوم چې پورټینګ اسانه کوي. موږ یو کتابتون د معیاري ترتیب سره راټولوو او ګورو چې دوی څومره ځای نیسي. هر ماډل په جلا کتابتون کې راټول شوی.

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

لکه څنګه چې تاسو د وروستۍ کرښې څخه لیدلی شئ، .bss او .data ډیر ځای نه نیسي، مګر کوډ د 70 MiB څخه ډیر دی. دا روښانه ده چې که دا په ثابت ډول د یو ځانګړي غوښتنلیک سره تړلی وي، کوډ به کم شي.

راځئ هڅه وکړو چې د امکان تر حده ډیری ماډلونه وغورځوو ترڅو لږترلږه مثال راټول شي (کوم چې د مثال په توګه به په ساده ډول د OpenCV نسخه تولید کړي)، نو موږ ګورو cmake .. -LA او په اختیارونو کې هرڅه بند کړئ چې بندیږي.

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

له یوې خوا ، دا د کتابتون یوازې یو ماډل دی ، له بلې خوا ، دا د کوډ اندازې لپاره د تالیف کونکي اصلاح پرته دی (-Os). د کوډ ~ 3 MiB لاهم خورا ډیر دی ، مګر دمخه د بریا امید ورکوي.

په ایمولیټر کې چل کړئ

په ایمولیټر کې ډیبګ کول خورا اسانه دي ، نو لومړی ډاډ ترلاسه کړئ چې کتابتون په qemu کې کار کوي. د تقلید شوي پلیټ فارم په توګه ، ما انټیګریټر / CP غوره کړ ، ځکه لومړی، دا ARM هم دی، او دوهم، Embox د دې پلیټ فارم لپاره د ګرافیک محصول ملاتړ کوي.

ایمبکس د بهرني کتابتونونو جوړولو لپاره میکانیزم لري ، د دې په کارولو سره موږ OpenCV د ماډل په توګه اضافه کوو (د "لږترلږه" جوړونې لپاره ټول ورته اختیارونه د جامد کتابتونونو په شکل کې تیریږي) ، له هغې وروسته زه یو ساده غوښتنلیک اضافه کوم چې داسې ښکاري:

version.cpp:

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

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

    return 0;
}

موږ سیسټم راټولوو، دا چلوو - موږ متوقع محصول ترلاسه کوو.

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

بل ګام د ځینې مثالونو چلول دي ، په غوره توګه یو له معیاري څخه چې پخپله د پراختیا کونکو لخوا وړاندیز کیږي. ستاسو په سایټ کې. ما خوښ کړ د سرحد کشف کونکی کینی.

مثال باید یو څه بیا لیکل شوی وای ترڅو عکس په مستقیم ډول په چوکاټ بفر کې د پایلې سره ښودل شي. زه باید دا کار وکړم، ځکه. فعالیت imshow() کولی شي د QT، GTK او وینډوز انٹرفیسونو له لارې عکسونه رسم کړي، کوم چې یقینا به د STM32 لپاره په ترتیب کې نه وي. په حقیقت کې، QT په STM32F7Discovery کې هم چلیدلی شي، مګر دا به په بله مقاله کې بحث وشي 🙂

د لنډ وضاحت وروسته چې په کوم شکل کې د څنډه کشف کونکي پایله زیرمه شوې ، موږ یو عکس ترلاسه کوو.

OpenCV په STM32F7-Discovery کې

اصلي انځور

OpenCV په STM32F7-Discovery کې

نتيجه

په STM32F7Discovery چلول

په 32F746GDISCOVERY کې د هارډویر حافظې ډیری برخې شتون لري چې موږ یې په یوه یا بله لاره کارولی شو

  1. 320KiB RAM
  2. د عکس لپاره 1MiB فلش
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND فلش
  5. د مایکرو ایس ډی کارت سلاټ

یو SD کارت د عکسونو ذخیره کولو لپاره کارول کیدی شي ، مګر د لږترلږه مثال چلولو په شرایطو کې ، دا خورا ګټور ندي.
ډسپلې 480 × 272 ریزولوشن لري ، پدې معنی چې د فریم بفر حافظه به د 522 بټونو په ژوروالي کې 240 بایټ وي ، د بیلګې په توګه. دا د RAM له اندازې څخه ډیر دی، نو د چوکاټ بفر او ډنډ (کوم چې د OpenCV په شمول، د انځورونو او مرستندویه جوړښتونو لپاره ډاټا ذخیره کولو لپاره اړین وي) به په SDRAM کې موقعیت ولري، نور هر څه (د سټیکونو لپاره حافظه او نور سیسټم اړتیاوې) ) به رام ته لاړ شي.

که موږ د STM32F7Discovery لپاره لږترلږه ترتیب واخلو (ټول شبکه وغورځوئ، ټول کمانډونه، د امکان تر حده کوچني سټیکونه جوړ کړئ، او داسې نور) او هلته د مثالونو سره OpenCV اضافه کړئ، اړین حافظه به په لاندې ډول وي:

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

د هغو کسانو لپاره چې ډیر نه پوهیږي چې کومې برخې چیرته ځي، زه به تشریح کړم: په کې .text и .rodata لارښوونې او ثباتونه (نږدې خبرې کول، یوازې لوستل شوي ډاټا) په کې دي .data معلومات د بدلون وړ دي، .bss دلته "نول شوي" متغیرونه شتون لري، چې په هرصورت، یو ځای ته اړتیا لري (دا برخه به رام ته "لاړ" شي).

ښه خبر دا دی .data/.bss باید مناسب وي، مګر سره .text ستونزه دا ده چې د عکس لپاره یوازې 1MiB حافظه شتون لري. غورځول کیدی شي .text د مثال څخه انځور واخلئ او دا یې ولولئ، د بیلګې په توګه، د پیل په وخت کې د SD کارت څخه حافظې ته، مګر fruits.png شاوخوا 330KiB وزن لري، نو دا به ستونزه حل نکړي: ډیری .text د OpenCV کوډ څخه جوړ دی.

په لویه کچه، یوازې یو شی پاتې دی - د کوډ یوه برخه په QSPI فلش کې پورته کول (دا د سیسټم بس ته د حافظې نقشه کولو لپاره د عملیاتو ځانګړي حالت لري، نو پروسیسر کولی شي مستقیم دې ډاټا ته لاسرسی ومومي). پدې حالت کې ، یوه ستونزه رامینځته کیږي: لومړی ، د QSPI فلش ډرایو حافظه د وسیلې له ریبوټ کیدو سمدستي وروسته شتون نلري (تاسو اړتیا لرئ په جلا توګه د حافظې نقشه شوي حالت پیل کړئ) ، او دوهم ، تاسو نشئ کولی دا حافظه "فلش" کړئ. یو پیژندل شوی بوټلوډر.

د پایلې په توګه، پریکړه وشوه چې ټول کوډ په QSPI کې وصل کړئ، او دا د ځان لیکل شوي لوډر سره فلش کړئ چې د TFTP له لارې به اړین بائنری ترلاسه کړي.

نتيجه

ایمبکس ته د دې کتابتون د پورټ کولو نظر شاوخوا یو کال دمخه څرګند شو ، مګر دا په مکرر ډول د بیلابیلو دلایلو له امله وځنډول شو. یو یې د libstdc++ او د معیاري ټیمپلیټ کتابتون لپاره ملاتړ دی. په Embox کې د C++ ملاتړ ستونزه د دې مقالې له دائرې څخه بهر ده، نو زه به دلته یوازې ووایم چې موږ د دې کتابتون کار کولو لپاره په سم مقدار کې دا ملاتړ ترلاسه کړ 🙂

په پای کې، دا ستونزې له منځه یوړل شوې (لږترلږه د OpenCV مثال لپاره کار کولو لپاره کافي)، او بیلګه روانه شوه. دا د کینی فلټر په کارولو سره د حدودو لټون کولو لپاره د بورډ لپاره 40 اوږدې ثانیې وخت نیسي. دا، البته، ډیر اوږد دی (د دې مسلې د ښه کولو څرنګوالي په اړه نظرونه شتون لري، دا به ممکن وي چې د بریالیتوب په صورت کې په دې اړه جلا مقاله ولیکئ).

OpenCV په STM32F7-Discovery کې

په هرصورت، منځګړیتوب هدف دا و چې یو پروټوټایپ رامینځته کړي چې په ترتیب سره په STM32 کې د OpenCV چلولو بنسټیز امکان وښيي، دا هدف ترلاسه شو، هورې!

tl؛ dr: ګام په ګام لارښوونې

0: د ایمبکس سرچینې ډاونلوډ کړئ، لکه دا:

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

1: راځئ چې د بوټلوډر په راټولولو پیل وکړو چې د QSPI فلش ډرایو "فلش" کړي.

    make confload-arm/stm32f7cube

اوس تاسو اړتیا لرئ چې شبکه تنظیم کړئ، ځکه. موږ به عکس د TFTP له لارې اپلوډ کړو. د بورډ او کوربه IP پتې تنظیم کولو لپاره، تاسو اړتیا لرئ چې conf/rootfs/network ترمیم کړئ.

د ترتیب بیلګه:

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 - د کوربه پته له کوم ځای څخه چې عکس به پورته شي، address - د بورډ پته.

له هغې وروسته، موږ بوټلوډر راټولوو:

    make

2: په بورډ کې د بوټلوډر معمول بار بار کول (د سزا لپاره بخښنه) - دلته هیڅ ځانګړي ندي ، تاسو اړتیا لرئ دا د STM32F7Discovery لپاره د کوم بل غوښتنلیک په څیر ترسره کړئ. که تاسو نه پوهیږئ چې دا څنګه ترسره کړئ، تاسو کولی شئ د هغې په اړه ولولئ دلته.
3: د OpenCV لپاره د ترتیب سره د عکس تالیف کول.

    make confload-platform/opencv/stm32f7discovery
    make

4: د ELF برخو څخه استخراج QSPI ته 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

د conf لارښود کې یو سکریپټ شتون لري چې دا کار کوي، نو تاسو کولی شئ دا چل کړئ

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

5: د tftp په کارولو سره د QSPI فلش ډرایو ته qspi.bin.bin ډاونلوډ کړئ. په کوربه کې، د دې کولو لپاره، د tftp سرور روټ فولډر ته qspi.bin کاپي کړئ (عموما /srv/tftp/ یا /var/lib/tftpboot/؛ د اړوند سرور لپاره کڅوړې په ډیری مشهور توزیعونو کې شتون لري، معمولا ویل کیږي. tftpd یا tftp-hpa، ځینې وختونه تاسو باید وکړئ systemctl start tftpd.service پيلول).

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

په ایمبکس کې (لکه په بوټلوډر کې)، تاسو اړتیا لرئ لاندې کمانډ اجرا کړئ (موږ فرض کوو چې سرور 192.168.2.1 پته لري):

    embox> qspi_loader qspi.bin 192.168.2.1

۶: په امر سره goto تاسو اړتیا لرئ د QSPI حافظې ته "کود" وکړئ. ځانګړی ځای به د دې پورې اړه ولري چې عکس څنګه تړل شوی، تاسو کولی شئ دا پته د کمانډ سره وګورئ mem 0x90000000 (د پیل پته د عکس دویم 32-bit کلمې سره سمون لري)؛ تاسو به د سټیک بیرغ ته هم اړتیا ولرئ -s، د سټیک پته په 0x90000000 کې ده، مثال:

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

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

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

۷: پیلول

    embox> edges 20

او د 40-ثانوي سرحد لټون څخه خوند واخلئ 🙂

که یو څه غلط وي - یوه مسله په کې ولیکئ زموږ ذخیره، یا د بریښنالیک لیست ته [ایمیل خوندي شوی]، یا دلته په تبصره کې.

سرچینه: www.habr.com

Add a comment