STM32F7-ඩිස්කවරි මත OpenCV

STM32F7-ඩිස්කවරි මත OpenCV මම මෙහෙයුම් පද්ධතියේ සංවර්ධකයන්ගෙන් කෙනෙකි එම්බොක්ස් කරන්න, සහ මෙම ලිපියෙන් මම STM32746G පුවරුවේ OpenCV ධාවනය කිරීමට සමත් වූ ආකාරය ගැන කතා කරමි.

ඔබ සෙවුම් යන්ත්‍රයකට "OpenCV on STM32 පුවරුව" වැනි දෙයක් ටයිප් කරන්නේ නම්, STM32 පුවරු හෝ වෙනත් ක්ෂුද්‍ර පාලක මත මෙම පුස්තකාලය භාවිතා කිරීමට කැමති කිහිප දෙනෙකු ඔබට සොයා ගත හැක.
නම අනුව විනිශ්චය කිරීමෙන් අවශ්‍ය දේ නිරූපණය කළ යුතු වීඩියෝ කිහිපයක් තිබේ, නමුත් සාමාන්‍යයෙන් (මා දුටු සියලුම වීඩියෝවල) STM32 පුවරුවේ, කැමරාවෙන් රූපය පමණක් ලැබුණු අතර ප්‍රති result ලය තිරය මත දර්ශනය විය, රූප සැකසීම සාමාන්‍ය පරිගණකයක හෝ වඩාත් බලවත් පුවරු මත සිදු කරන ලදී (උදාහරණයක් ලෙස, Raspberry Pi).

එය අමාරු ඇයි?

සෙවුම් විමසුම්වල ජනප්‍රියතාවය පැහැදිලි වන්නේ OpenCV වඩාත් ජනප්‍රිය පරිගණක දර්ශන පුස්තකාලය වන අතර එයින් අදහස් කරන්නේ වැඩි සංවර්ධකයින් එය හුරුපුරුදු වන අතර ක්ෂුද්‍ර පාලකයක ඩෙස්ක්ටොප්-සුදානම් කේතය ක්‍රියාත්මක කිරීමේ හැකියාව සංවර්ධන ක්‍රියාවලිය බෙහෙවින් සරල කරයි. නමුත් මෙම ගැටළුව විසඳීම සඳහා තවමත් ජනප්‍රිය සූදානම් කළ වට්ටෝරු නොමැති ඇයි?

කුඩා සාලු මත OpenCV භාවිතා කිරීමේ ගැටළුව විශේෂාංග දෙකකට සම්බන්ධ වේ:

  • ඔබ අවම මොඩියුල කට්ටලයක් සමඟ වුවද පුස්තකාලය සම්පාදනය කරන්නේ නම්, එය ඉතා විශාල කේතයක් (මෙගාබයිට් කිහිපයක් උපදෙස්) හේතුවෙන් එම STM32F7Discovery (OS එක සැලකිල්ලට නොගෙන පවා) ෆ්ලෑෂ් මතකයට නොගැලපේ.
  • පුස්තකාලයම C++ වලින් ලියා ඇත, එනම්
    • ධනාත්මක ධාවන කාලය සඳහා සහාය අවශ්‍යයි (ව්‍යතිරේක, ආදිය)
    • Embedded පද්ධති සඳහා OS හි සාමාන්‍යයෙන් දක්නට ලැබෙන LibC/Posix සඳහා කුඩා සහය - ඔබට සම්මත ප්ලස් පුස්තකාලයක් සහ සම්මත STL අච්චු පුස්තකාලයක් (දෛශික, ආදිය) අවශ්‍ය වේ.

එම්බොක්ස් වෙත පෝට් කිරීම

සුපුරුදු පරිදි, ඕනෑම වැඩසටහනක් මෙහෙයුම් පද්ධතියට ගෙනයාමට පෙර, එය සංවර්ධකයින් අදහස් කළ ආකාරයෙන් එය ගොඩනඟා ගැනීමට උත්සාහ කිරීම හොඳ අදහසකි. අපගේ නඩුවේදී, මේ සම්බන්ධයෙන් කිසිදු ගැටළුවක් නොමැත - මූලාශ්ර කේතය සොයාගත හැකිය github, පුස්තකාලය සාමාන්‍ය cmake සමඟ GNU/Linux යටතේ ගොඩනගා ඇත.

ශුභාරංචිය නම් 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 මත ක්‍රියා කරන බවට වග බලා ගන්න. අනුකරණය කරන ලද වේදිකාවක් ලෙස, මම Integrator / CP තෝරා ගත්තෙමි, මන්ද පළමුව, එය ද ARM වන අතර, දෙවනුව, මෙම වේදිකාව සඳහා එම්බොක්ස් චිත්‍රක ප්‍රතිදානය සඳහා සහය දක්වයි.

එම්බොක්ස් හි බාහිර පුස්තකාල තැනීම සඳහා යාන්ත්‍රණයක් ඇත, එය භාවිතා කරමින් අපි 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 включены в сборку и т.п.>

මීලඟ පියවර වන්නේ සංවර්ධකයින් විසින්ම ඉදිරිපත් කරන ලද සම්මත ඒවායින් එකක් වඩාත් සුදුසුය. ඔබේ වෙබ් අඩවියේ. මම තෝරනවා මායිම් අනාවරක කැනී.

ප්‍රති result ලය සමඟ රූපය සෘජුවම රාමු බෆරය තුළ ප්‍රදර්ශනය කිරීම සඳහා උදාහරණය තරමක් නැවත ලිවීමට සිදු විය. මට මෙය කිරීමට සිදු විය, මන්ද. කාර්යය imshow() QT, GTK සහ Windows අතුරුමුහුණත් හරහා පින්තූර අඳින්න පුළුවන්, ඇත්ත වශයෙන්ම, STM32 සඳහා වින්යාසය තුළ නොතිබෙනු ඇත. ඇත්ත වශයෙන්ම, QT STM32F7Discovery මත ද ධාවනය කළ හැකිය, නමුත් මෙය වෙනත් ලිපියකින් සාකච්ඡා කරනු ඇත 🙂

දාර අනාවරකයේ ප්‍රති result ලය ගබඩා කර ඇති ආකෘතියේ කෙටි පැහැදිලි කිරීමකින් පසුව, අපට රූපයක් ලැබේ.

STM32F7-ඩිස්කවරි මත OpenCV

මුල් පින්තූරය

STM32F7-ඩිස්කවරි මත OpenCV

ප්රතිඵලය

STM32F7Discovery මත ධාවනය වේ

32F746GDISCOVERY හි අපට එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් භාවිතා කළ හැකි දෘඩාංග මතක කොටස් කිහිපයක් තිබේ.

  1. 320KiB RAM
  2. රූපය සඳහා 1MiB ෆ්ලෑෂ්
  3. 8MiB SDRAM
  4. 16MiB QSPI NAND ෆ්ලෑෂ්
  5. microSD කාඩ් පත

පින්තූර ගබඩා කිරීම සඳහා SD කාඩ්පතක් භාවිතා කළ හැක, නමුත් අවම උදාහරණයක් ක්රියාත්මක කිරීමේ සන්දර්භය තුළ, මෙය ඉතා ප්රයෝජනවත් නොවේ.
සංදර්ශකය 480 × 272 ක විභේදනයකින් යුක්ත වන අතර එයින් අදහස් වන්නේ රාමු බෆර මතකය බිටු 522 ක ගැඹුරකදී බයිට් 240 ක් වනු ඇති බවයි, එනම්. මෙය RAM ප්‍රමාණයට වඩා වැඩිය, එබැවින් රාමු බෆරය සහ ගොඩ (OpenCV ඇතුළුව, පින්තූර සහ සහායක ව්‍යුහයන් සඳහා දත්ත ගබඩා කිරීම සඳහා අවශ්‍ය වනු ඇත) SDRAM හි පිහිටා ඇත, අනෙක් සියල්ල (අට්ටි සහ අනෙකුත් පද්ධති අවශ්‍යතා සඳහා මතකය) ) RAM වෙත යයි.

අපි STM32F7Discovery සඳහා අවම වින්‍යාසය ගෙන (සම්පූර්ණ ජාලය, සියලුම විධානයන්, හැකි තරම් කුඩා අට්ටි සාදන්න, ආදිය) සහ උදාහරණ සමඟ OpenCV එකතු කළහොත්, අවශ්‍ය මතකය පහත පරිදි වේ:

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

කුමන අංශ යන්නේ කොතැනටද යන්න ගැන එතරම් හුරුපුරුදු නැති අය සඳහා, මම පැහැදිලි කරන්නම්: in .text и .rodata උපදෙස් සහ නියතයන් (දල වශයෙන් කථා කිරීම, කියවීමට පමණක් දත්ත) ඇත .data දත්ත විකෘති වේ, .bss "nulled" විචල්යයන් ඇත, කෙසේ වෙතත්, ස්ථානයක් අවශ්ය වේ (මෙම කොටස RAM වෙත "යනු ඇත").

ශුභාරංචිය එයයි .data/.bss සුදුසු විය යුතුය, නමුත් සමඟ .text ගැටලුව වන්නේ රූපය සඳහා 1MiB මතකයක් පමණක් තිබීමයි. ඉවතට විසි කළ හැකිය .text උදාහරණයෙන් පින්තූරය කියවා එය කියවන්න, උදාහරණයක් ලෙස, ආරම්භයේදී SD කාඩ්පතෙන් මතකයට, නමුත් fruits.png බර 330KiB පමණ වේ, එබැවින් මෙය ගැටළුව විසඳන්නේ නැත: බොහෝ .text OpenCV කේතයෙන් සමන්විත වේ.

විශාල වශයෙන්, ඉතිරිව ඇත්තේ එක් දෙයක් පමණි - කේතයේ කොටසක් QSPI ෆ්ලෑෂ් වෙත පැටවීම (පද්ධති බසයට මතකය සිතියම්ගත කිරීම සඳහා විශේෂ මෙහෙයුම් ආකාරයක් ඇත, එවිට ප්‍රොසෙසරයට මෙම දත්ත කෙලින්ම ප්‍රවේශ විය හැක). මෙම අවස්ථාවේදී, ගැටළුවක් පැන නගී: පළමුව, උපාංගය නැවත පණගැන්වීමෙන් පසු QSPI ෆ්ලෑෂ් ඩ්‍රයිව් එකක මතකය ලබා ගත නොහැක (ඔබට මතක සිතියම්ගත මාදිලිය වෙන වෙනම ආරම්භ කළ යුතුය), සහ දෙවනුව, ඔබට මෙම මතකය සමඟ “ෆ්ලෑෂ්” කළ නොහැක. හුරුපුරුදු bootloader එකක්.

එහි ප්රතිඵලයක් වශයෙන්, QSPI හි සියලුම කේතය සම්බන්ධ කිරීමට තීරණය කරන ලද අතර, TFTP හරහා අවශ්ය ද්විමය ලබා ගන්නා ස්වයං-ලිඛිත ලෝඩරයක් සමඟ එය ෆ්ලෑෂ් කරන්න.

ප්රතිඵලය

මෙම පුස්තකාලය Embox වෙත ගෙන යාමේ අදහස මීට වසරකට පමණ පෙර මතු වූ නමුත් විවිධ හේතු නිසා නැවත නැවතත් එය කල් දැමිණි. ඒවායින් එකක් වන්නේ libstdc++ සහ සම්මත සැකිලි පුස්තකාලය සඳහා වන සහායයි. Embox හි C++ සහය පිළිබඳ ගැටළුව මෙම ලිපියේ විෂය පථයට වඩා ඔබ්බට ය, එබැවින් මෙම පුස්තකාලය ක්‍රියාත්මක වීමට අවශ්‍ය ප්‍රමාණයෙන් මෙම සහය ලබා ගැනීමට අපට හැකි වූ බව පමණක් මම කියමි 🙂

අවසානයේදී, මෙම ගැටළු ජය ගන්නා ලදී (අවම වශයෙන් OpenCV උදාහරණය ක්‍රියා කිරීමට ප්‍රමාණවත්), සහ උදාහරණය ක්‍රියාත්මක විය. Canny ෆිල්ටරය භාවිතයෙන් මායිම් සෙවීමට පුවරුවට දිගු තත්පර 40ක් ගතවේ. මෙය ඇත්ත වශයෙන්ම දිගු වැඩි ය (මෙම කාරණය ප්‍රශස්ත කරන්නේ කෙසේද යන්න පිළිබඳ සලකා බැලීම් තිබේ, සාර්ථකත්වයේ දී මේ ගැන වෙනම ලිපියක් ලිවීමට හැකි වනු ඇත).

STM32F7-ඩිස්කවරි මත OpenCV

කෙසේ වෙතත්, අතරමැදි ඉලක්කය වූයේ පිළිවෙලින් 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: QSPI වෙත qspi.bin වෙත ලිවිය යුතු ELF කොටස් වලින් උපුටා ගැනීම

    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 බාගන්න. ධාරකයේදී, මෙය සිදු කිරීම සඳහා, qspi.bin tftp සේවාදායකයේ මූල ෆෝල්ඩරයට පිටපත් කරන්න (සාමාන්‍යයෙන් /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

6: විධානය සමඟ goto ඔබට QSPI මතකයට "පනින්න" අවශ්‍යයි. රූපය සම්බන්ධ කර ඇති ආකාරය අනුව නිශ්චිත ස්ථානය වෙනස් වේ, ඔබට මෙම ලිපිනය විධානය සමඟ දැකිය හැකිය mem 0x90000000 (ආරම්භක ලිපිනය රූපයේ දෙවන 32-bit වචනයට ගැලපේ); ඔබට තොගය සලකුණු කිරීමටද අවශ්‍ය වනු ඇත -s, තොග ලිපිනය 0x90000000 හි ඇත, උදාහරණයක්:

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

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

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

7: දියත් කරන්න

    embox> edges 20

සහ තත්පර 40ක මායිම් සෙවුම භුක්ති විඳින්න 🙂

යමක් වැරදුනහොත් - ගැටලුවක් ලියන්න අපගේ ගබඩාව, හෝ තැපැල් ලැයිස්තුවට [විද්‍යුත් ආරක්‍ෂිත], හෝ මෙහි අදහස් දැක්වීමක.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න