€cdocutils.nodes document q)q}q(U nametypesq}q(X unit testsqNX9single channel, 1920x1080. barcode roi detection use caseqNXenecessary steps to modify opencv framework to add more opencl host side and dsp c66 optimized kernelsqNXsupported platformsq NXopencv modules supported by tiq NXloading-standard-test-dataq ˆXBopencv opencl related framework details: how to add new dsp kernelq NXedma transfer frameworkq NX7additional information about c66 specific optimizationsqNX8single channel, 1200x709, barcode roi detection use caseqNXopencv opencl development setupqNXTopencl kernel dispatch from opencv application, using existing opencv-opencl classesqNXopencv opencl run-time setupqNXprocedure-to-get-the-test-dataqˆX introductionqNX5single channel, 720x576, gesture recognition use caseqNX!summary-of-getting-the-data-stepsqˆXopencvqNXopencl offloadqNX"loading-sdk-and-standard-test-dataqˆXunit-tests-prerequisitesqˆX/creating opencl c kernel optimized for c66 coreqNXqopencl kernel dispatch from opencv application, using standard opencl dispatch with access to opencv data objectsqNXreports-and-resultsqˆXexample-of-opencl-offloadqˆXUprofiling results of dsp optimized opencv opencl kernels (plsdk 3.1), am5728 platformqNXopencv performanceq NX?opencv opencl kernels implemented specifically for dsp c66 coreq!NXfrequently asked questionsq"NX prerequisitesq#ˆX%opencv profiling - standard procedureq$NXglist of currently (plsdk 3.1) dsp optimized opencv opencl kernels, using non-standard opencl extensionsq%NXJalternative approach to add new opencl kernels at opencv application levelq&NXopencl c c66 dsp kernelsq'NX&environment-settings-and-run-the-testsq(ˆuUsubstitution_defsq)}q*Uparse_messagesq+]q,Ucurrent_sourceq-NU decorationq.NUautofootnote_startq/KUnameidsq0}q1(hU unit-testsq2hU7single-channel-1920x1080-barcode-roi-detection-use-caseq3hUenecessary-steps-to-modify-opencv-framework-to-add-more-opencl-host-side-and-dsp-c66-optimized-kernelsq4h Usupported-platformsq5h Uopencv-modules-supported-by-tiq6h Uloading-standard-test-dataq7h UAopencv-opencl-related-framework-details-how-to-add-new-dsp-kernelq8h Uedma-transfer-frameworkq9hU7additional-information-about-c66-specific-optimizationsq:hU6single-channel-1200x709-barcode-roi-detection-use-caseq;hUopencv-opencl-development-setupqhUprocedure-to-get-the-test-dataq?hU introductionq@hU3single-channel-720x576-gesture-recognition-use-caseqAhU!summary-of-getting-the-data-stepsqBhUopencvqChUopencl-offloadqDhU"loading-sdk-and-standard-test-dataqEhUunit-tests-prerequisitesqFhU/creating-opencl-c-kernel-optimized-for-c66-coreqGhUpopencl-kernel-dispatch-from-opencv-application-using-standard-opencl-dispatch-with-access-to-opencv-data-objectsqHhUreports-and-resultsqIhUexample-of-opencl-offloadqJhURprofiling-results-of-dsp-optimized-opencv-opencl-kernels-plsdk-3-1-am5728-platformqKh Uopencv-performanceqLh!U?opencv-opencl-kernels-implemented-specifically-for-dsp-c66-coreqMh"Ufrequently-asked-questionsqNh#U prerequisitesqOh$U#opencv-profiling-standard-procedureqPh%Udlist-of-currently-plsdk-3-1-dsp-optimized-opencv-opencl-kernels-using-non-standard-opencl-extensionsqQh&UJalternative-approach-to-add-new-opencl-kernels-at-opencv-application-levelqRh'Uopencl-c-c66-dsp-kernelsqSh(U&environment-settings-and-run-the-testsqTuUchildrenqU]qV(cdocutils.nodes comment qW)qX}qY(U rawsourceqZX.http://processors.wiki.ti.com/index.php/OpenCVUparentq[hUsourceq\cdocutils.nodes reprunicode q]X3source/linux/Foundational_Components/OpenCV.rst.incq^…q_}q`bUtagnameqaUcommentqbU attributesqc}qd(U xml:spaceqeUpreserveqfUidsqg]Ubackrefsqh]Udupnamesqi]Uclassesqj]Unamesqk]uUlineqlKUdocumentqmhhU]qncdocutils.nodes Text qoX.http://processors.wiki.ti.com/index.php/OpenCVqp…qq}qr(hZUh[hXubaubcdocutils.nodes section qs)qt}qu(hZUh[hh\h_haUsectionqvhc}qw(hi]hj]hh]hg]qxhCahk]qyhauhlKhmhhU]qz(cdocutils.nodes title q{)q|}q}(hZXOpenCVq~h[hth\h_haUtitleqhc}q€(hi]hj]hh]hg]hk]uhlKhmhhU]qhoXOpenCVq‚…qƒ}q„(hZh~h[h|ubaubhs)q…}q†(hZUh[hth\h_hahvhc}q‡(hi]hj]hh]hg]qˆh@ahk]q‰hauhlK hmhhU]qŠ(h{)q‹}qŒ(hZX Introductionqh[h…h\h_hahhc}qŽ(hi]hj]hh]hg]hk]uhlK hmhhU]qhoX Introductionq…q‘}q’(hZhh[h‹ubaubcdocutils.nodes paragraph q“)q”}q•(hZX`OpenCV `__ (Open Source Computer Vision Library) is an open-source BSD-licensed library that includes several hundreds of computer vision algorithms. It is designed for computational efficiency with strong focus on real-time application.h[h…h\h_haU paragraphq–hc}q—(hi]hj]hh]hg]hk]uhlK hmhhU]q˜(cdocutils.nodes reference q™)qš}q›(hZX`OpenCV `__hc}qœ(UnameXOpenCVUrefuriqXhttp://opencv.org/hg]hh]hi]hj]hk]uh[h”hU]qžhoXOpenCVqŸ…q }q”(hZUh[hšubahaU referenceq¢ubhoXć (Open Source Computer Vision Library) is an open-source BSD-licensed library that includes several hundreds of computer vision algorithms. It is designed for computational efficiency with strong focus on real-time application.q£…q¤}q„(hZXć (Open Source Computer Vision Library) is an open-source BSD-licensed library that includes several hundreds of computer vision algorithms. It is designed for computational efficiency with strong focus on real-time application.h[h”ubeubh“)q¦}q§(hZX The OpenCV 3.1 release provides a transparent API that allows seamless offloads of OpenCL kernels when a supported accelerator is available. Documentation, tutorials and examples of how to use OpenCV 3.1 are available `here `__.h[h…h\h_hah–hc}qØ(hi]hj]hh]hg]hk]uhlKhmhhU]q©(hoXŚThe OpenCV 3.1 release provides a transparent API that allows seamless offloads of OpenCL kernels when a supported accelerator is available. Documentation, tutorials and examples of how to use OpenCV 3.1 are available qŖ…q«}q¬(hZXŚThe OpenCV 3.1 release provides a transparent API that allows seamless offloads of OpenCL kernels when a supported accelerator is available. Documentation, tutorials and examples of how to use OpenCV 3.1 are available h[h¦ubh™)q­}q®(hZX2`here `__hc}qÆ(UnameXherehX'http://docs.opencv.org/3.1.0/#gsc.tab=0hg]hh]hi]hj]hk]uh[h¦hU]q°hoXhereq±…q²}q³(hZUh[h­ubahah¢ubhoX.…q“}qµ(hZX.h[h¦ubeubh“)q¶}q·(hZXThis document outlines the specifics of how to test OpenCV that has been released within Processor SDK. This release is based off OpenCV 3.1.qøh[h…h\h_hah–hc}q¹(hi]hj]hh]hg]hk]uhlKhmhhU]qŗhoXThis document outlines the specifics of how to test OpenCV that has been released within Processor SDK. This release is based off OpenCV 3.1.q»…q¼}q½(hZhøh[h¶ubaubh“)q¾}qæ(hZX@OpenCV implementation is available for the following TI devices:qĄh[h…h\h_hah–hc}qĮ(hi]hj]hh]hg]hk]uhlKhmhhU]qĀhoX@OpenCV implementation is available for the following TI devices:qƅqÄ}qÅ(hZhĄh[h¾ubaubcdocutils.nodes bullet_list qĘ)qĒ}qČ(hZUh[h…h\h_haU bullet_listqÉhc}qŹ(UbulletqĖX-hg]hh]hi]hj]hk]uhlKhmhhU]qĢ(cdocutils.nodes list_item qĶ)qĪ}qĻ(hZXAM335XqŠh[hĒh\h_haU list_itemqŃhc}qŅ(hi]hj]hh]hg]hk]uhlNhmhhU]qÓh“)qŌ}qÕ(hZhŠh[hĪh\h_hah–hc}qÖ(hi]hj]hh]hg]hk]uhlKhU]q×hoXAM335XqŲ…qŁ}qŚ(hZhŠh[hŌubaubaubhĶ)qŪ}qÜ(hZXAM437XqŻh[hĒh\h_hahŃhc}qŽ(hi]hj]hh]hg]hk]uhlNhmhhU]qßh“)qą}qį(hZhŻh[hŪh\h_hah–hc}qā(hi]hj]hh]hg]hk]uhlKhU]qćhoXAM437Xq䅁qå}qę(hZhŻh[hąubaubaubhĶ)qē}qč(hZX AM57X/DRA7xxqéh[hĒh\h_hahŃhc}qź(hi]hj]hh]hg]hk]uhlNhmhhU]qėh“)qģ}qķ(hZhéh[hēh\h_hah–hc}qī(hi]hj]hh]hg]hk]uhlKhU]qļhoX AM57X/DRA7xxqš…qń}qņ(hZhéh[hģubaubaubhĶ)qó}qō(hZXK2Eqõh[hĒh\h_hahŃhc}qö(hi]hj]hh]hg]hk]uhlNhmhhU]q÷h“)qų}qł(hZhõh[hóh\h_hah–hc}qś(hi]hj]hh]hg]hk]uhlK hU]qūhoXK2Eqü…qż}qž(hZhõh[hųubaubaubhĶ)q’}r(hZXK2Hrh[hĒh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZjh[h’h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlK!hU]rhoXK2Hr…r }r (hZjh[jubaubaubhĶ)r }r (hZXK2Lr h[hĒh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZj h[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlK"hU]rhoXK2Lr…r}r(hZj h[jubaubaubhĶ)r}r(hZXK2G h[hĒh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZXK2Grh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlK#hU]rhoXK2Gr …r!}r"(hZjh[jubaubaubeubh“)r#}r$(hZXeTo meet the requirements of real-time processing of images and video OpenCV functions were optimized.r%h[h…h\h_hah–hc}r&(hi]hj]hh]hg]hk]uhlK%hmhhU]r'hoXeTo meet the requirements of real-time processing of images and video OpenCV functions were optimized.r(…r)}r*(hZj%h[j#ubaubh“)r+}r,(hZX More-ever, TI’s OpenCV implementation of hybrid ARM-DSP devices (AM57X, K2E, K2H, K2L, K2G) provides very efficient implementation of OpenCV function where signal-processing-rich algorithms are processed by DSP while the ARM processes all other algorithms, controls and manages the DSP.r-h[h…h\h_hah–hc}r.(hi]hj]hh]hg]hk]uhlK(hmhhU]r/hoX More-ever, TI’s OpenCV implementation of hybrid ARM-DSP devices (AM57X, K2E, K2H, K2L, K2G) provides very efficient implementation of OpenCV function where signal-processing-rich algorithms are processed by DSP while the ARM processes all other algorithms, controls and manages the DSP.r0…r1}r2(hZj-h[j+ubaubh“)r3}r4(hZX©TI implementation of OpenCV contains implementation of OpenCV functions as well as a set of unit tests to verify the performances and the accuracy of the implementation.r5h[h…h\h_hah–hc}r6(hi]hj]hh]hg]hk]uhlK.hmhhU]r7hoX©TI implementation of OpenCV contains implementation of OpenCV functions as well as a set of unit tests to verify the performances and the accuracy of the implementation.r8…r9}r:(hZj5h[j3ubaubh“)r;}r<(hZXhThis document provides instructions show how to load and run unit tests of TI’s OpenCV implementation.r=h[h…h\h_hah–hc}r>(hi]hj]hh]hg]hk]uhlK2hmhhU]r?hoXhThis document provides instructions show how to load and run unit tests of TI’s OpenCV implementation.r@…rA}rB(hZj=h[j;ubaubeubhs)rC}rD(hZUh[hth\h_hahvhc}rE(hi]hj]hh]hg]rFh6ahk]rGh auhlK7hmhhU]rH(h{)rI}rJ(hZXOpenCV Modules Supported By TIrKh[jCh\h_hahhc}rL(hi]hj]hh]hg]hk]uhlK7hmhhU]rMhoXOpenCV Modules Supported By TIrN…rO}rP(hZjKh[jIubaubh“)rQ}rR(hZXTable 1 lists the modules of OpenCV and indicates which modules are supported by Processor SDK for K2H family and AM57X family.rSh[jCh\h_hah–hc}rT(hi]hj]hh]hg]hk]uhlK:hmhhU]rUhoXTable 1 lists the modules of OpenCV and indicates which modules are supported by Processor SDK for K2H family and AM57X family.rV…rW}rX(hZjSh[jQubaubcdocutils.nodes table rY)rZ}r[(hZUh[jCh\h_haUtabler\hc}r](hi]hj]hh]hg]hk]uhlNhmhhU]r^cdocutils.nodes tgroup r_)r`}ra(hZUhc}rb(hg]hh]hi]hj]hk]UcolsKuh[jZhU]rc(cdocutils.nodes colspec rd)re}rf(hZUhc}rg(hg]hh]hi]hj]hk]UcolwidthKuh[j`hU]haUcolspecrhubjd)ri}rj(hZUhc}rk(hg]hh]hi]hj]hk]UcolwidthKuh[j`hU]hajhubjd)rl}rm(hZUhc}rn(hg]hh]hi]hj]hk]UcolwidthKuh[j`hU]hajhubjd)ro}rp(hZUhc}rq(hg]hh]hi]hj]hk]UcolwidthKuh[j`hU]hajhubcdocutils.nodes thead rr)rs}rt(hZUhc}ru(hi]hj]hh]hg]hk]uh[j`hU]rvcdocutils.nodes row rw)rx}ry(hZUhc}rz(hi]hj]hh]hg]hk]uh[jshU]r{(cdocutils.nodes entry r|)r}}r~(hZUhc}r(hi]hj]hh]hg]hk]uh[jxhU]r€h“)r}r‚(hZX Module Namerƒh[j}h\h_hah–hc}r„(hi]hj]hh]hg]hk]uhlK>hU]r…hoX Module Namer†…r‡}rˆ(hZjƒh[jubaubahaUentryr‰ubj|)rŠ}r‹(hZUhc}rŒ(hi]hj]hh]hg]hk]uh[jxhU]rh“)rŽ}r(hZXK2 Family Supportrh[jŠh\h_hah–hc}r‘(hi]hj]hh]hg]hk]uhlK>hU]r’hoXK2 Family Supportr“…r”}r•(hZjh[jŽubaubahaj‰ubj|)r–}r—(hZUhc}r˜(hi]hj]hh]hg]hk]uh[jxhU]r™h“)rš}r›(hZXAM57x Family Supportrœh[j–h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlK>hU]ržhoXAM57x Family SupportrŸ…r }r”(hZjœh[jšubaubahaj‰ubj|)r¢}r£(hZUhc}r¤(hi]hj]hh]hg]hk]uh[jxhU]r„h“)r¦}r§(hZXCommentsrØh[j¢h\h_hah–hc}r©(hi]hj]hh]hg]hk]uhlK>hU]rŖhoXCommentsr«…r¬}r­(hZjØh[j¦ubaubahaj‰ubehaUrowr®ubahaUtheadrÆubcdocutils.nodes tbody r°)r±}r²(hZUhc}r³(hi]hj]hh]hg]hk]uh[j`hU]r“(jw)rµ}r¶(hZUhc}r·(hi]hj]hh]hg]hk]uh[j±hU]rø(j|)r¹}rŗ(hZUhc}r»(hi]hj]hh]hg]hk]uh[jµhU]r¼h“)r½}r¾(hZXcalib3dræh[j¹h\h_hah–hc}rĄ(hi]hj]hh]hg]hk]uhlK@hU]rĮhoXcalib3drĀ…rĆ}rÄ(hZjæh[j½ubaubahaj‰ubj|)rÅ}rĘ(hZUhc}rĒ(hi]hj]hh]hg]hk]uh[jµhU]rČh“)rÉ}rŹ(hZXYesrĖh[jÅh\h_hah–hc}rĢ(hi]hj]hh]hg]hk]uhlK@hU]rĶhoXYesrĪ…rĻ}rŠ(hZjĖh[jÉubaubahaj‰ubj|)rŃ}rŅ(hZUhc}rÓ(hi]hj]hh]hg]hk]uh[jµhU]rŌh“)rÕ}rÖ(hZXYesr×h[jŃh\h_hah–hc}rŲ(hi]hj]hh]hg]hk]uhlK@hU]rŁhoXYesrŚ…rŪ}rÜ(hZj×h[jÕubaubahaj‰ubj|)rŻ}rŽ(hZUhc}rß(hi]hj]hh]hg]hk]uh[jµhU]haj‰ubehaj®ubjw)rą}rį(hZUhc}rā(hi]hj]hh]hg]hk]uh[j±hU]rć(j|)rä}rå(hZUhc}rę(hi]hj]hh]hg]hk]uh[jąhU]rēh“)rč}ré(hZXCorerźh[jäh\h_hah–hc}rė(hi]hj]hh]hg]hk]uhlKBhU]rģhoXCorer텁rī}rļ(hZjźh[jčubaubahaj‰ubj|)rš}rń(hZUhc}rņ(hi]hj]hh]hg]hk]uh[jąhU]róh“)rō}rõ(hZXYesröh[jšh\h_hah–hc}r÷(hi]hj]hh]hg]hk]uhlKBhU]rųhoXYesrł…rś}rū(hZjöh[jōubaubahaj‰ubj|)rü}rż(hZUhc}rž(hi]hj]hh]hg]hk]uh[jąhU]r’h“)r}r(hZXYesrh[jüh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKBhU]rhoXYesr…r}r(hZjh[jubaubahaj‰ubj|)r}r (hZUhc}r (hi]hj]hh]hg]hk]uh[jąhU]haj‰ubehaj®ubjw)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j±hU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]rh“)r}r(hZX features2drh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKDhU]rhoX features2dr…r}r(hZjh[jubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]rh“)r}r (hZXYesr!h[jh\h_hah–hc}r"(hi]hj]hh]hg]hk]uhlKDhU]r#hoXYesr$…r%}r&(hZj!h[jubaubahaj‰ubj|)r'}r((hZUhc}r)(hi]hj]hh]hg]hk]uh[j hU]r*h“)r+}r,(hZXYesr-h[j'h\h_hah–hc}r.(hi]hj]hh]hg]hk]uhlKDhU]r/hoXYesr0…r1}r2(hZj-h[j+ubaubahaj‰ubj|)r3}r4(hZUhc}r5(hi]hj]hh]hg]hk]uh[j hU]haj‰ubehaj®ubjw)r6}r7(hZUhc}r8(hi]hj]hh]hg]hk]uh[j±hU]r9(j|)r:}r;(hZUhc}r<(hi]hj]hh]hg]hk]uh[j6hU]r=h“)r>}r?(hZXflannr@h[j:h\h_hah–hc}rA(hi]hj]hh]hg]hk]uhlKFhU]rBhoXflannrC…rD}rE(hZj@h[j>ubaubahaj‰ubj|)rF}rG(hZUhc}rH(hi]hj]hh]hg]hk]uh[j6hU]rIh“)rJ}rK(hZXYesrLh[jFh\h_hah–hc}rM(hi]hj]hh]hg]hk]uhlKFhU]rNhoXYesrO…rP}rQ(hZjLh[jJubaubahaj‰ubj|)rR}rS(hZUhc}rT(hi]hj]hh]hg]hk]uh[j6hU]rUh“)rV}rW(hZXYesrXh[jRh\h_hah–hc}rY(hi]hj]hh]hg]hk]uhlKFhU]rZhoXYesr[…r\}r](hZjXh[jVubaubahaj‰ubj|)r^}r_(hZUhc}r`(hi]hj]hh]hg]hk]uh[j6hU]haj‰ubehaj®ubjw)ra}rb(hZUhc}rc(hi]hj]hh]hg]hk]uh[j±hU]rd(j|)re}rf(hZUhc}rg(hi]hj]hh]hg]hk]uh[jahU]rhh“)ri}rj(hZX imgcodecsrkh[jeh\h_hah–hc}rl(hi]hj]hh]hg]hk]uhlKHhU]rmhoX imgcodecsrn…ro}rp(hZjkh[jiubaubahaj‰ubj|)rq}rr(hZUhc}rs(hi]hj]hh]hg]hk]uh[jahU]rth“)ru}rv(hZXYesrwh[jqh\h_hah–hc}rx(hi]hj]hh]hg]hk]uhlKHhU]ryhoXYesrz…r{}r|(hZjwh[juubaubahaj‰ubj|)r}}r~(hZUhc}r(hi]hj]hh]hg]hk]uh[jahU]r€h“)r}r‚(hZXYesrƒh[j}h\h_hah–hc}r„(hi]hj]hh]hg]hk]uhlKHhU]r…hoXYesr†…r‡}rˆ(hZjƒh[jubaubahaj‰ubj|)r‰}rŠ(hZUhc}r‹(hi]hj]hh]hg]hk]uh[jahU]haj‰ubehaj®ubjw)rŒ}r(hZUhc}rŽ(hi]hj]hh]hg]hk]uh[j±hU]r(j|)r}r‘(hZUhc}r’(hi]hj]hh]hg]hk]uh[jŒhU]r“h“)r”}r•(hZXimgprocr–h[jh\h_hah–hc}r—(hi]hj]hh]hg]hk]uhlKJhU]r˜hoXimgprocr™…rš}r›(hZj–h[j”ubaubahaj‰ubj|)rœ}r(hZUhc}rž(hi]hj]hh]hg]hk]uh[jŒhU]rŸh“)r }r”(hZXYesr¢h[jœh\h_hah–hc}r£(hi]hj]hh]hg]hk]uhlKJhU]r¤hoXYesr„…r¦}r§(hZj¢h[j ubaubahaj‰ubj|)rØ}r©(hZUhc}rŖ(hi]hj]hh]hg]hk]uh[jŒhU]r«h“)r¬}r­(hZXYesr®h[jØh\h_hah–hc}rÆ(hi]hj]hh]hg]hk]uhlKJhU]r°hoXYesr±…r²}r³(hZj®h[j¬ubaubahaj‰ubj|)r“}rµ(hZUhc}r¶(hi]hj]hh]hg]hk]uh[jŒhU]haj‰ubehaj®ubjw)r·}rø(hZUhc}r¹(hi]hj]hh]hg]hk]uh[j±hU]rŗ(j|)r»}r¼(hZUhc}r½(hi]hj]hh]hg]hk]uh[j·hU]r¾h“)ræ}rĄ(hZXmlrĮh[j»h\h_hah–hc}rĀ(hi]hj]hh]hg]hk]uhlKLhU]rĆhoXmlrÄ…rÅ}rĘ(hZjĮh[jæubaubahaj‰ubj|)rĒ}rČ(hZUhc}rÉ(hi]hj]hh]hg]hk]uh[j·hU]rŹh“)rĖ}rĢ(hZXYesrĶh[jĒh\h_hah–hc}rĪ(hi]hj]hh]hg]hk]uhlKLhU]rĻhoXYesrŠ…rŃ}rŅ(hZjĶh[jĖubaubahaj‰ubj|)rÓ}rŌ(hZUhc}rÕ(hi]hj]hh]hg]hk]uh[j·hU]rÖh“)r×}rŲ(hZXYesrŁh[jÓh\h_hah–hc}rŚ(hi]hj]hh]hg]hk]uhlKLhU]rŪhoXYesrÜ…rŻ}rŽ(hZjŁh[j×ubaubahaj‰ubj|)rß}rą(hZUhc}rį(hi]hj]hh]hg]hk]uh[j·hU]haj‰ubehaj®ubjw)rā}rć(hZUhc}rä(hi]hj]hh]hg]hk]uh[j±hU]rå(j|)rę}rē(hZUhc}rč(hi]hj]hh]hg]hk]uh[jāhU]réh“)rź}rė(hZX objdetectrģh[jęh\h_hah–hc}rķ(hi]hj]hh]hg]hk]uhlKNhU]rīhoX objdetectrrš}rń(hZjģh[jźubaubahaj‰ubj|)rņ}ró(hZUhc}rō(hi]hj]hh]hg]hk]uh[jāhU]rõh“)rö}r÷(hZXYesrųh[jņh\h_hah–hc}rł(hi]hj]hh]hg]hk]uhlKNhU]rśhoXYesrū…rü}rż(hZjųh[jöubaubahaj‰ubj|)rž}r’(hZUhc}r(hi]hj]hh]hg]hk]uh[jāhU]rh“)r}r(hZXYesrh[jžh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKNhU]rhoXYesr…r}r (hZjh[jubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jāhU]haj‰ubehaj®ubjw)r }r(hZUhc}r(hi]hj]hh]hg]hk]uh[j±hU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]rh“)r}r(hZXphotorh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKPhU]rhoXphotor…r}r(hZjh[jubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]r h“)r!}r"(hZXYesr#h[jh\h_hah–hc}r$(hi]hj]hh]hg]hk]uhlKPhU]r%hoXYesr&…r'}r((hZj#h[j!ubaubahaj‰ubj|)r)}r*(hZUhc}r+(hi]hj]hh]hg]hk]uh[j hU]r,h“)r-}r.(hZXYesr/h[j)h\h_hah–hc}r0(hi]hj]hh]hg]hk]uhlKPhU]r1hoXYesr2…r3}r4(hZj/h[j-ubaubahaj‰ubj|)r5}r6(hZUhc}r7(hi]hj]hh]hg]hk]uh[j hU]haj‰ubehaj®ubjw)r8}r9(hZUhc}r:(hi]hj]hh]hg]hk]uh[j±hU]r;(j|)r<}r=(hZUhc}r>(hi]hj]hh]hg]hk]uh[j8hU]r?h“)r@}rA(hZXshaperBh[j<h\h_hah–hc}rC(hi]hj]hh]hg]hk]uhlKRhU]rDhoXshaperE…rF}rG(hZjBh[j@ubaubahaj‰ubj|)rH}rI(hZUhc}rJ(hi]hj]hh]hg]hk]uh[j8hU]rKh“)rL}rM(hZXYesrNh[jHh\h_hah–hc}rO(hi]hj]hh]hg]hk]uhlKRhU]rPhoXYesrQ…rR}rS(hZjNh[jLubaubahaj‰ubj|)rT}rU(hZUhc}rV(hi]hj]hh]hg]hk]uh[j8hU]rWh“)rX}rY(hZXYesrZh[jTh\h_hah–hc}r[(hi]hj]hh]hg]hk]uhlKRhU]r\hoXYesr]…r^}r_(hZjZh[jXubaubahaj‰ubj|)r`}ra(hZUhc}rb(hi]hj]hh]hg]hk]uh[j8hU]haj‰ubehaj®ubjw)rc}rd(hZUhc}re(hi]hj]hh]hg]hk]uh[j±hU]rf(j|)rg}rh(hZUhc}ri(hi]hj]hh]hg]hk]uh[jchU]rjh“)rk}rl(hZXstichingrmh[jgh\h_hah–hc}rn(hi]hj]hh]hg]hk]uhlKThU]rohoXstichingrp…rq}rr(hZjmh[jkubaubahaj‰ubj|)rs}rt(hZUhc}ru(hi]hj]hh]hg]hk]uh[jchU]rvh“)rw}rx(hZXYesryh[jsh\h_hah–hc}rz(hi]hj]hh]hg]hk]uhlKThU]r{hoXYesr|…r}}r~(hZjyh[jwubaubahaj‰ubj|)r}r€(hZUhc}r(hi]hj]hh]hg]hk]uh[jchU]r‚h“)rƒ}r„(hZXYesr…h[jh\h_hah–hc}r†(hi]hj]hh]hg]hk]uhlKThU]r‡hoXYesrˆ…r‰}rŠ(hZj…h[jƒubaubahaj‰ubj|)r‹}rŒ(hZUhc}r(hi]hj]hh]hg]hk]uh[jchU]haj‰ubehaj®ubjw)rŽ}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j±hU]r‘(j|)r’}r“(hZUhc}r”(hi]hj]hh]hg]hk]uh[jŽhU]r•h“)r–}r—(hZXsuperresr˜h[j’h\h_hah–hc}r™(hi]hj]hh]hg]hk]uhlKVhU]ršhoXsuperresr›…rœ}r(hZj˜h[j–ubaubahaj‰ubj|)rž}rŸ(hZUhc}r (hi]hj]hh]hg]hk]uh[jŽhU]r”h“)r¢}r£(hZXYesr¤h[jžh\h_hah–hc}r„(hi]hj]hh]hg]hk]uhlKVhU]r¦hoXYesr§…rØ}r©(hZj¤h[j¢ubaubahaj‰ubj|)rŖ}r«(hZUhc}r¬(hi]hj]hh]hg]hk]uh[jŽhU]r­h“)r®}rÆ(hZXYesr°h[jŖh\h_hah–hc}r±(hi]hj]hh]hg]hk]uhlKVhU]r²hoXYesr³…r“}rµ(hZj°h[j®ubaubahaj‰ubj|)r¶}r·(hZUhc}rø(hi]hj]hh]hg]hk]uh[jŽhU]haj‰ubehaj®ubjw)r¹}rŗ(hZUhc}r»(hi]hj]hh]hg]hk]uh[j±hU]r¼(j|)r½}r¾(hZUhc}ræ(hi]hj]hh]hg]hk]uh[j¹hU]rĄh“)rĮ}rĀ(hZXvideorĆh[j½h\h_hah–hc}rÄ(hi]hj]hh]hg]hk]uhlKXhU]rÅhoXvideorĘ…rĒ}rČ(hZjĆh[jĮubaubahaj‰ubj|)rÉ}rŹ(hZUhc}rĖ(hi]hj]hh]hg]hk]uh[j¹hU]rĢh“)rĶ}rĪ(hZXYesrĻh[jÉh\h_hah–hc}rŠ(hi]hj]hh]hg]hk]uhlKXhU]rŃhoXYesrŅ…rÓ}rŌ(hZjĻh[jĶubaubahaj‰ubj|)rÕ}rÖ(hZUhc}r×(hi]hj]hh]hg]hk]uh[j¹hU]rŲh“)rŁ}rŚ(hZXYesrŪh[jÕh\h_hah–hc}rÜ(hi]hj]hh]hg]hk]uhlKXhU]rŻhoXYesrŽ…rß}rą(hZjŪh[jŁubaubahaj‰ubj|)rį}rā(hZUhc}rć(hi]hj]hh]hg]hk]uh[j¹hU]haj‰ubehaj®ubjw)rä}rå(hZUhc}rę(hi]hj]hh]hg]hk]uh[j±hU]rē(j|)rč}ré(hZUhc}rź(hi]hj]hh]hg]hk]uh[jähU]rėh“)rģ}rķ(hZXvideoiorīh[jčh\h_hah–hc}rļ(hi]hj]hh]hg]hk]uhlKZhU]ršhoXvideoiorń…rņ}ró(hZjīh[jģubaubahaj‰ubj|)rō}rõ(hZUhc}rö(hi]hj]hh]hg]hk]uh[jähU]r÷h“)rų}rł(hZXYesrśh[jōh\h_hah–hc}rū(hi]hj]hh]hg]hk]uhlKZhU]rühoXYesrż…rž}r’(hZjśh[jųubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jähU]rh“)r}r(hZXYesrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKZhU]rhoXYesr …r }r (hZjh[jubaubahaj‰ubj|)r }r (hZUhc}r(hi]hj]hh]hg]hk]uh[jähU]haj‰ubehaj®ubjw)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j±hU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]rh“)r}r(hZX cudaarithmrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlK\hU]rhoX cudaarithmr…r}r(hZjh[jubaubahaj‰ubj|)r}r (hZUhc}r!(hi]hj]hh]hg]hk]uh[jhU]r"h“)r#}r$(hZXNor%h[jh\h_hah–hc}r&(hi]hj]hh]hg]hk]uhlK\hU]r'hoXNor(…r)}r*(hZj%h[j#ubaubahaj‰ubj|)r+}r,(hZUhc}r-(hi]hj]hh]hg]hk]uh[jhU]r.h“)r/}r0(hZXNor1h[j+h\h_hah–hc}r2(hi]hj]hh]hg]hk]uhlK\hU]r3hoXNor4…r5}r6(hZj1h[j/ubaubahaj‰ubj|)r7}r8(hZUhc}r9(hi]hj]hh]hg]hk]uh[jhU]r:h“)r;}r<(hZXNo cuda supportr=h[j7h\h_hah–hc}r>(hi]hj]hh]hg]hk]uhlK\hU]r?hoXNo cuda supportr@…rA}rB(hZj=h[j;ubaubahaj‰ubehaj®ubjw)rC}rD(hZUhc}rE(hi]hj]hh]hg]hk]uh[j±hU]rF(j|)rG}rH(hZUhc}rI(hi]hj]hh]hg]hk]uh[jChU]rJh“)rK}rL(hZX cudabgsegmrMh[jGh\h_hah–hc}rN(hi]hj]hh]hg]hk]uhlK^hU]rOhoX cudabgsegmrP…rQ}rR(hZjMh[jKubaubahaj‰ubj|)rS}rT(hZUhc}rU(hi]hj]hh]hg]hk]uh[jChU]rVh“)rW}rX(hZXNorYh[jSh\h_hah–hc}rZ(hi]hj]hh]hg]hk]uhlK^hU]r[hoXNor\…r]}r^(hZjYh[jWubaubahaj‰ubj|)r_}r`(hZUhc}ra(hi]hj]hh]hg]hk]uh[jChU]rbh“)rc}rd(hZXNoreh[j_h\h_hah–hc}rf(hi]hj]hh]hg]hk]uhlK^hU]rghoXNorh…ri}rj(hZjeh[jcubaubahaj‰ubj|)rk}rl(hZUhc}rm(hi]hj]hh]hg]hk]uh[jChU]rnh“)ro}rp(hZXNo cuda supportrqh[jkh\h_hah–hc}rr(hi]hj]hh]hg]hk]uhlK^hU]rshoXNo cuda supportrt…ru}rv(hZjqh[joubaubahaj‰ubehaj®ubjw)rw}rx(hZUhc}ry(hi]hj]hh]hg]hk]uh[j±hU]rz(j|)r{}r|(hZUhc}r}(hi]hj]hh]hg]hk]uh[jwhU]r~h“)r}r€(hZX cudacodecrh[j{h\h_hah–hc}r‚(hi]hj]hh]hg]hk]uhlK`hU]rƒhoX cudacodecr„…r…}r†(hZjh[jubaubahaj‰ubj|)r‡}rˆ(hZUhc}r‰(hi]hj]hh]hg]hk]uh[jwhU]rŠh“)r‹}rŒ(hZXNorh[j‡h\h_hah–hc}rŽ(hi]hj]hh]hg]hk]uhlK`hU]rhoXNor…r‘}r’(hZjh[j‹ubaubahaj‰ubj|)r“}r”(hZUhc}r•(hi]hj]hh]hg]hk]uh[jwhU]r–h“)r—}r˜(hZXNor™h[j“h\h_hah–hc}rš(hi]hj]hh]hg]hk]uhlK`hU]r›hoXNorœ…r}rž(hZj™h[j—ubaubahaj‰ubj|)rŸ}r (hZUhc}r”(hi]hj]hh]hg]hk]uh[jwhU]r¢h“)r£}r¤(hZXNo cuda supportr„h[jŸh\h_hah–hc}r¦(hi]hj]hh]hg]hk]uhlK`hU]r§hoXNo cuda supportrØ…r©}rŖ(hZj„h[j£ubaubahaj‰ubehaj®ubjw)r«}r¬(hZUhc}r­(hi]hj]hh]hg]hk]uh[j±hU]r®(j|)rÆ}r°(hZUhc}r±(hi]hj]hh]hg]hk]uh[j«hU]r²h“)r³}r“(hZXcudafeatures2drµh[jÆh\h_hah–hc}r¶(hi]hj]hh]hg]hk]uhlKbhU]r·hoXcudafeatures2drø…r¹}rŗ(hZjµh[j³ubaubahaj‰ubj|)r»}r¼(hZUhc}r½(hi]hj]hh]hg]hk]uh[j«hU]r¾h“)ræ}rĄ(hZXNorĮh[j»h\h_hah–hc}rĀ(hi]hj]hh]hg]hk]uhlKbhU]rĆhoXNorÄ…rÅ}rĘ(hZjĮh[jæubaubahaj‰ubj|)rĒ}rČ(hZUhc}rÉ(hi]hj]hh]hg]hk]uh[j«hU]rŹh“)rĖ}rĢ(hZXNorĶh[jĒh\h_hah–hc}rĪ(hi]hj]hh]hg]hk]uhlKbhU]rĻhoXNorŠ…rŃ}rŅ(hZjĶh[jĖubaubahaj‰ubj|)rÓ}rŌ(hZUhc}rÕ(hi]hj]hh]hg]hk]uh[j«hU]rÖh“)r×}rŲ(hZXNo cuda supportrŁh[jÓh\h_hah–hc}rŚ(hi]hj]hh]hg]hk]uhlKbhU]rŪhoXNo cuda supportrÜ…rŻ}rŽ(hZjŁh[j×ubaubahaj‰ubehaj®ubjw)rß}rą(hZUhc}rį(hi]hj]hh]hg]hk]uh[j±hU]rā(j|)rć}rä(hZUhc}rå(hi]hj]hh]hg]hk]uh[jßhU]ręh“)rē}rč(hZX cudafiltersréh[jćh\h_hah–hc}rź(hi]hj]hh]hg]hk]uhlKdhU]rėhoX cudafiltersr셁rķ}rī(hZjéh[jēubaubahaj‰ubj|)rļ}rš(hZUhc}rń(hi]hj]hh]hg]hk]uh[jßhU]rņh“)ró}rō(hZXNorõh[jļh\h_hah–hc}rö(hi]hj]hh]hg]hk]uhlKdhU]r÷hoXNorų…rł}rś(hZjõh[jóubaubahaj‰ubj|)rū}rü(hZUhc}rż(hi]hj]hh]hg]hk]uh[jßhU]ržh“)r’}r(hZXNorh[jūh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKdhU]rhoXNor…r}r(hZjh[j’ubaubahaj‰ubj|)r}r(hZUhc}r (hi]hj]hh]hg]hk]uh[jßhU]r h“)r }r (hZXNo cuda supportr h[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKdhU]rhoXNo cuda supportr…r}r(hZj h[j ubaubahaj‰ubehaj®ubjw)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j±hU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]rh“)r}r(hZX cudaimgprocrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKfhU]rhoX cudaimgprocr …r!}r"(hZjh[jubaubahaj‰ubj|)r#}r$(hZUhc}r%(hi]hj]hh]hg]hk]uh[jhU]r&h“)r'}r((hZXNor)h[j#h\h_hah–hc}r*(hi]hj]hh]hg]hk]uhlKfhU]r+hoXNor,…r-}r.(hZj)h[j'ubaubahaj‰ubj|)r/}r0(hZUhc}r1(hi]hj]hh]hg]hk]uh[jhU]r2h“)r3}r4(hZXNor5h[j/h\h_hah–hc}r6(hi]hj]hh]hg]hk]uhlKfhU]r7hoXNor8…r9}r:(hZj5h[j3ubaubahaj‰ubj|)r;}r<(hZUhc}r=(hi]hj]hh]hg]hk]uh[jhU]r>h“)r?}r@(hZXNo cuda supportrAh[j;h\h_hah–hc}rB(hi]hj]hh]hg]hk]uhlKfhU]rChoXNo cuda supportrD…rE}rF(hZjAh[j?ubaubahaj‰ubehaj®ubjw)rG}rH(hZUhc}rI(hi]hj]hh]hg]hk]uh[j±hU]rJ(j|)rK}rL(hZUhc}rM(hi]hj]hh]hg]hk]uh[jGhU]rNh“)rO}rP(hZX cudalegacyrQh[jKh\h_hah–hc}rR(hi]hj]hh]hg]hk]uhlKhhU]rShoX cudalegacyrT…rU}rV(hZjQh[jOubaubahaj‰ubj|)rW}rX(hZUhc}rY(hi]hj]hh]hg]hk]uh[jGhU]rZh“)r[}r\(hZXNor]h[jWh\h_hah–hc}r^(hi]hj]hh]hg]hk]uhlKhhU]r_hoXNor`…ra}rb(hZj]h[j[ubaubahaj‰ubj|)rc}rd(hZUhc}re(hi]hj]hh]hg]hk]uh[jGhU]rfh“)rg}rh(hZXNorih[jch\h_hah–hc}rj(hi]hj]hh]hg]hk]uhlKhhU]rkhoXNorl…rm}rn(hZjih[jgubaubahaj‰ubj|)ro}rp(hZUhc}rq(hi]hj]hh]hg]hk]uh[jGhU]rrh“)rs}rt(hZXNo cuda supportruh[joh\h_hah–hc}rv(hi]hj]hh]hg]hk]uhlKhhU]rwhoXNo cuda supportrx…ry}rz(hZjuh[jsubaubahaj‰ubehaj®ubjw)r{}r|(hZUhc}r}(hi]hj]hh]hg]hk]uh[j±hU]r~(j|)r}r€(hZUhc}r(hi]hj]hh]hg]hk]uh[j{hU]r‚h“)rƒ}r„(hZX cudaobjdetectr…h[jh\h_hah–hc}r†(hi]hj]hh]hg]hk]uhlKjhU]r‡hoX cudaobjdetectrˆ…r‰}rŠ(hZj…h[jƒubaubahaj‰ubj|)r‹}rŒ(hZUhc}r(hi]hj]hh]hg]hk]uh[j{hU]rŽh“)r}r(hZXNor‘h[j‹h\h_hah–hc}r’(hi]hj]hh]hg]hk]uhlKjhU]r“hoXNor”…r•}r–(hZj‘h[jubaubahaj‰ubj|)r—}r˜(hZUhc}r™(hi]hj]hh]hg]hk]uh[j{hU]ršh“)r›}rœ(hZXNorh[j—h\h_hah–hc}rž(hi]hj]hh]hg]hk]uhlKjhU]rŸhoXNor …r”}r¢(hZjh[j›ubaubahaj‰ubj|)r£}r¤(hZUhc}r„(hi]hj]hh]hg]hk]uh[j{hU]r¦h“)r§}rØ(hZXNo cuda supportr©h[j£h\h_hah–hc}rŖ(hi]hj]hh]hg]hk]uhlKjhU]r«hoXNo cuda supportr¬…r­}r®(hZj©h[j§ubaubahaj‰ubehaj®ubehaUtbodyrÆubehaUtgroupr°ubaubcdocutils.nodes line_block r±)r²}r³(hZUh[jCh\h_haU line_blockr“hc}rµ(hi]hj]hh]hg]hk]uhlKmhmhhU]r¶cdocutils.nodes line r·)rø}r¹(hZUUindentrŗKh[j²h\h_hahlhc}r»(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubhs)r¼}r½(hZUh[hth\h_hahvhc}r¾(hi]hj]hh]hg]ræhDahk]rĄhauhlKqhmhhU]rĮ(h{)rĀ}rĆ(hZXOpenCL offloadrÄh[j¼h\h_hahhc}rÅ(hi]hj]hh]hg]hk]uhlKqhmhhU]rĘhoXOpenCL offloadrĒ…rČ}rÉ(hZjÄh[jĀubaubh“)rŹ}rĖ(hZXīOpenCV 3.1 provides a transparent API that allows seamless offloads of OpenCL kernels when a supported hardware accelerator is available. OpenCV 3.1 available with Processor SDK allows these OpenCL kernels to be offloaded to the C66x DSP.rĢh[j¼h\h_hah–hc}rĶ(hi]hj]hh]hg]hk]uhlKshmhhU]rĪhoXīOpenCV 3.1 provides a transparent API that allows seamless offloads of OpenCL kernels when a supported hardware accelerator is available. OpenCV 3.1 available with Processor SDK allows these OpenCL kernels to be offloaded to the C66x DSP.rĻ…rŠ}rŃ(hZjĢh[jŹubaubh“)rŅ}rÓ(hZXOpenCV 3.1 supports approximately 200+ OpenCL kernels that optimize key functionalities in the different modules. The OpenCL kernel offload through the transparent API is enabled by the UMat data structure that replaces the legacy Mat data structure. UMat uses the OpenCL memory allocation procedure whenever possible, but maintains backward compatibility with Mat data structure. Additional explanation can be found on OpenCV site: https://opencv.org/platforms/opencl.html (or others URL if you search for "OpenCV transparent API").h[j¼h\h_hah–hc}rŌ(hi]hj]hh]hg]hk]uhlKxhmhhU]rÕ(hoX±OpenCV 3.1 supports approximately 200+ OpenCL kernels that optimize key functionalities in the different modules. The OpenCL kernel offload through the transparent API is enabled by the UMat data structure that replaces the legacy Mat data structure. UMat uses the OpenCL memory allocation procedure whenever possible, but maintains backward compatibility with Mat data structure. Additional explanation can be found on OpenCV site: rÖ…r×}rŲ(hZX±OpenCV 3.1 supports approximately 200+ OpenCL kernels that optimize key functionalities in the different modules. The OpenCL kernel offload through the transparent API is enabled by the UMat data structure that replaces the legacy Mat data structure. UMat uses the OpenCL memory allocation procedure whenever possible, but maintains backward compatibility with Mat data structure. Additional explanation can be found on OpenCV site: h[jŅubh™)rŁ}rŚ(hZX(https://opencv.org/platforms/opencl.htmlrŪhc}rÜ(UrefurijŪhg]hh]hi]hj]hk]uh[jŅhU]rŻhoX(https://opencv.org/platforms/opencl.htmlrŽ…rß}rą(hZUh[jŁubahah¢ubhoX< (or others URL if you search for "OpenCV transparent API").rᅁrā}rć(hZX< (or others URL if you search for "OpenCV transparent API").h[jŅubeubh“)rä}rå(hZX©Within the context of Processor SDK, to enable the offload of OpenCL kernels in OpenCV 3.1, the environment variable OPENCV\_OPENCL\_DEVICE should be defined as follows:h[j¼h\h_hah–hc}rę(hi]hj]hh]hg]hk]uhlKhmhhU]rēhoX§Within the context of Processor SDK, to enable the offload of OpenCL kernels in OpenCV 3.1, the environment variable OPENCV_OPENCL_DEVICE should be defined as follows:r腁ré}rź(hZX©Within the context of Processor SDK, to enable the offload of OpenCL kernels in OpenCV 3.1, the environment variable OPENCV\_OPENCL\_DEVICE should be defined as follows:h[jäubaubh“)rė}rģ(hZX`For K2 Platforms export OPENCV\_OPENCL\_DEVICE='TI KeyStone II:ACCELERATOR:TI Multicore C66 DSP'h[j¼h\h_hah–hc}rķ(hi]hj]hh]hg]hk]uhlK…hmhhU]rīhoX^For K2 Platforms export OPENCV_OPENCL_DEVICE='TI KeyStone II:ACCELERATOR:TI Multicore C66 DSP'rrš}rń(hZX`For K2 Platforms export OPENCV\_OPENCL\_DEVICE='TI KeyStone II:ACCELERATOR:TI Multicore C66 DSP'h[jėubaubh“)rņ}ró(hZX\For AM57x Platforms export OPENCV\_OPENCL\_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'h[j¼h\h_hah–hc}rō(hi]hj]hh]hg]hk]uhlKˆhmhhU]rõhoXZFor AM57x Platforms export OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'rö…r÷}rų(hZX\For AM57x Platforms export OPENCV\_OPENCL\_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'h[jņubaubh“)rł}rś(hZXIf this environment variable is not defined properly then OpenCV will not initialize OpenCL and the OpenCL support is disabled.rūh[j¼h\h_hah–hc}rü(hi]hj]hh]hg]hk]uhlK‹hmhhU]rżhoXIf this environment variable is not defined properly then OpenCV will not initialize OpenCL and the OpenCL support is disabled.rž…r’}r(hZjūh[jłubaubh“)r}r(hZXŃFurther, the library user can enable/disable OpenCL at runtime (at higher granularity, e.g. to let only part of program to do OpenCL offload) using ocl::setUseOpenCL(true) or ocl::setUseOpenCL(false) routines.rh[j¼h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKŽhmhhU]rhoXŃFurther, the library user can enable/disable OpenCL at runtime (at higher granularity, e.g. to let only part of program to do OpenCL offload) using ocl::setUseOpenCL(true) or ocl::setUseOpenCL(false) routines.r…r}r(hZjh[jubaubh“)r }r (hZXŸMore OpenCL specific environment variables can affect the behavior. Please refer to: http://downloads.ti.com/mctools/esd/docs/opencl/environment_variables.htmlh[j¼h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlK“hmhhU]r (hoXUMore OpenCL specific environment variables can affect the behavior. Please refer to: r …r}r(hZXUMore OpenCL specific environment variables can affect the behavior. Please refer to: h[j ubh™)r}r(hZXJhttp://downloads.ti.com/mctools/esd/docs/opencl/environment_variables.htmlrhc}r(Urefurijhg]hh]hi]hj]hk]uh[j hU]rhoXJhttp://downloads.ti.com/mctools/esd/docs/opencl/environment_variables.htmlr…r}r(hZUh[jubahah¢ubeubcdocutils.nodes note r)r}r(hZXåThe script setupEnv.sh, part of the SDK release (in /usr/share/OpenCV/titestsuite), defines the appropriate environment variables OPENCV\_OPENCL\_DEVICE as well as other environment variables that are needed for the unit tests.**h[j¼h\h_haUnoterhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZXåThe script setupEnv.sh, part of the SDK release (in /usr/share/OpenCV/titestsuite), defines the appropriate environment variables OPENCV\_OPENCL\_DEVICE as well as other environment variables that are needed for the unit tests.**h[jh\h_hah–hc}r (hi]hj]hh]hg]hk]uhlK˜hU]r!hoXćThe script setupEnv.sh, part of the SDK release (in /usr/share/OpenCV/titestsuite), defines the appropriate environment variables OPENCV_OPENCL_DEVICE as well as other environment variables that are needed for the unit tests.**r"…r#}r$(hZXåThe script setupEnv.sh, part of the SDK release (in /usr/share/OpenCV/titestsuite), defines the appropriate environment variables OPENCV\_OPENCL\_DEVICE as well as other environment variables that are needed for the unit tests.**h[jubaubaubh“)r%}r&(hZX—Figure 1 shows the decision tree the transparent API executes to determine if the computations will be offloaded to the accelerator through OpenCL. The boxes that are shaded gray are specific to TI’s implementation of OpenCV. The prohibited list allows us to prevent certain OpenCL kernels from executing on the DSP. The kernels are prevented to execute on the DSP if they did not pass the accuracy tests.r'h[j¼h\h_hah–hc}r((hi]hj]hh]hg]hk]uhlKhmhhU]r)hoX—Figure 1 shows the decision tree the transparent API executes to determine if the computations will be offloaded to the accelerator through OpenCL. The boxes that are shaded gray are specific to TI’s implementation of OpenCV. The prohibited list allows us to prevent certain OpenCL kernels from executing on the DSP. The kernels are prevented to execute on the DSP if they did not pass the accuracy tests.r*…r+}r,(hZj'h[j%ubaubcdocutils.nodes image r-)r.}r/(hZX$.. Image:: ../images/FlowChart3.jpg h[j¼h\h_haUimager0hc}r1(UuriXlinux/../images/FlowChart3.jpgr2hg]hh]hi]hj]U candidatesr3}r4U*j2shk]uhlK¦hmhhU]ubcdocutils.nodes rubric r5)r6}r7(hZXExample of OpenCL offloadr8h[j¼h\h_haUrubricr9hc}r:(hg]r;hJahh]hi]hj]hk]r<hauhlNhmhhU]r=hoXExample of OpenCL offloadr>…r?}r@(hZj8h[j6ubaubh“)rA}rB(hZX†Here is a simple image processing example, using OpenCL dispatch via Transparent API (Color-to-Gray, Gaussian Blur and Canny kernels).rCh[j¼h\h_hah–hc}rD(hi]hj]hh]hg]hk]uhlKŖhmhhU]rEhoX†Here is a simple image processing example, using OpenCL dispatch via Transparent API (Color-to-Gray, Gaussian Blur and Canny kernels).rF…rG}rH(hZjCh[jAubaubcdocutils.nodes literal_block rI)rJ}rK(hZX#include #include #include #include #include /* Time difference calculation, in ms units */ double tdiff_calc(struct timespec &tp_start, struct timespec &tp_end) { return (double)(tp_end.tv_nsec -tp_start.tv_nsec) * 0.000001 + (double)(tp_end.tv_sec - tp_start.tv_sec) * 1000.0; } using namespace cv; int main(int argc, char** argv) { struct timespec tp0, tp1, tp2, tp3; UMat img, gray; imread("lena.png", 1).copyTo(img); clock_gettime(CLOCK_MONOTONIC, &tp0); cvtColor(img, gray, COLOR_BGR2GRAY); clock_gettime(CLOCK_MONOTONIC, &tp1); GaussianBlur(gray, gray, Size(5, 5), 1.25); clock_gettime(CLOCK_MONOTONIC, &tp2); Canny(gray, gray, 0, 30); clock_gettime(CLOCK_MONOTONIC, &tp3); printf ("BGR2GRAY tdiff=%lf ms \n", tdiff_calc(tp0, tp1)); printf ("GaussBlur tdiff=%lf ms \n", tdiff_calc(tp1, tp2)); printf ("Canny tdiff=%lf ms \n", tdiff_calc(tp2, tp3)); imwrite("canny_proc.jpg", gray); return 0; }h[j¼h\h_haU literal_blockrLhc}rM(hehfhg]hh]hi]hj]hk]uhlK±hmhhU]rNhoX#include #include #include #include #include /* Time difference calculation, in ms units */ double tdiff_calc(struct timespec &tp_start, struct timespec &tp_end) { return (double)(tp_end.tv_nsec -tp_start.tv_nsec) * 0.000001 + (double)(tp_end.tv_sec - tp_start.tv_sec) * 1000.0; } using namespace cv; int main(int argc, char** argv) { struct timespec tp0, tp1, tp2, tp3; UMat img, gray; imread("lena.png", 1).copyTo(img); clock_gettime(CLOCK_MONOTONIC, &tp0); cvtColor(img, gray, COLOR_BGR2GRAY); clock_gettime(CLOCK_MONOTONIC, &tp1); GaussianBlur(gray, gray, Size(5, 5), 1.25); clock_gettime(CLOCK_MONOTONIC, &tp2); Canny(gray, gray, 0, 30); clock_gettime(CLOCK_MONOTONIC, &tp3); printf ("BGR2GRAY tdiff=%lf ms \n", tdiff_calc(tp0, tp1)); printf ("GaussBlur tdiff=%lf ms \n", tdiff_calc(tp1, tp2)); printf ("Canny tdiff=%lf ms \n", tdiff_calc(tp2, tp3)); imwrite("canny_proc.jpg", gray); return 0; }rO…rP}rQ(hZUh[jJubaubh“)rR}rS(hZX?It can be compiled on target (AM57xx), using following command:rTh[j¼h\h_hah–hc}rU(hi]hj]hh]hg]hk]uhlKĶhmhhU]rVhoX?It can be compiled on target (AM57xx), using following command:rW…rX}rY(hZjTh[jRubaubjI)rZ}r[(hZXĘg++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o canny_ex1 canny_ex1.cpp -lrt -lopencv_core -lopencv_imgproc -lopencv_video -lopencv_features2d -lopencv_imgcodecsh[j¼h\h_hajLhc}r\(hehfhg]hh]hi]hj]hk]uhlKÓhmhhU]r]hoXĘg++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o canny_ex1 canny_ex1.cpp -lrt -lopencv_core -lopencv_imgproc -lopencv_video -lopencv_features2d -lopencv_imgcodecsr^…r_}r`(hZUh[jZubaubh“)ra}rb(hZX€Execution can be launched using following script, showing execution time with OpenCL dispatch respectively enabled and disabled:rch[j¼h\h_hah–hc}rd(hi]hj]hh]hg]hk]uhlKÓhmhhU]rehoX€Execution can be launched using following script, showing execution time with OpenCL dispatch respectively enabled and disabled:rf…rg}rh(hZjch[jaubaubjI)ri}rj(hZX÷export TI_OCL_LOAD_KERNELS_ONCHIP=Y export TI_OCL_CACHE_KERNELS=Y export OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP' echo "OpenCL on, canny" ./canny_ex1 export OPENCV_OPENCL_DEVICE='disabled' echo "OpenCL off, canny" ./canny_exh[j¼h\h_hajLhc}rk(hehfhg]hh]hi]hj]hk]uhlKŚhmhhU]rlhoX÷export TI_OCL_LOAD_KERNELS_ONCHIP=Y export TI_OCL_CACHE_KERNELS=Y export OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP' echo "OpenCL on, canny" ./canny_ex1 export OPENCV_OPENCL_DEVICE='disabled' echo "OpenCL off, canny" ./canny_exrm…rn}ro(hZUh[jiubaubh“)rp}rq(hZX1Please note that the first run, with OpenCL on, has additional delay of ~1min, due to kernel compilation on AM57xx. This is constrained to first run only, if "TI\_OCL\_CACHE\_KERNELS" environemnt variable is set. Profiling shows different execution time for DSP (OpenCL on) and A15 (OpenCL off) platforms.h[j¼h\h_hah–hc}rr(hi]hj]hh]hg]hk]uhlKįhmhhU]rshoX.Please note that the first run, with OpenCL on, has additional delay of ~1min, due to kernel compilation on AM57xx. This is constrained to first run only, if "TI_OCL_CACHE_KERNELS" environemnt variable is set. Profiling shows different execution time for DSP (OpenCL on) and A15 (OpenCL off) platforms.rt…ru}rv(hZX1Please note that the first run, with OpenCL on, has additional delay of ~1min, due to kernel compilation on AM57xx. This is constrained to first run only, if "TI\_OCL\_CACHE\_KERNELS" environemnt variable is set. Profiling shows different execution time for DSP (OpenCL on) and A15 (OpenCL off) platforms.h[jpubaubjI)rw}rx(hZXĖOpenCL on, canny BGR2GRAY tdiff=12.064661 ms GaussBlur tdiff=5.948558 ms Canny tdiff=5.788493 ms OpenCL off, canny BGR2GRAY tdiff=4.158085 ms GaussBlur tdiff=2.989813 ms Canny tdiff=9.780171 msh[j¼h\h_hajLhc}ry(hehfhg]hh]hi]hj]hk]uhlKėhmhhU]rzhoXĖOpenCL on, canny BGR2GRAY tdiff=12.064661 ms GaussBlur tdiff=5.948558 ms Canny tdiff=5.788493 ms OpenCL off, canny BGR2GRAY tdiff=4.158085 ms GaussBlur tdiff=2.989813 ms Canny tdiff=9.780171 msr{…r|}r}(hZUh[jwubaubh“)r~}r(hZXėA15 loading (measured with 'top') during repeated execution with 'OpenCL on', is in 50-60% range (single CPU load). A15 loading (measured with 'top') during repeated execution with 'OpenCL off', is in 150-170% range (both CPUs loaded).r€h[j¼h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKņhmhhU]r‚hoXėA15 loading (measured with 'top') during repeated execution with 'OpenCL on', is in 50-60% range (single CPU load). A15 loading (measured with 'top') during repeated execution with 'OpenCL off', is in 150-170% range (both CPUs loaded).rƒ…r„}r…(hZj€h[j~ubaubh“)r†}r‡(hZXšIt is possible to make finer grained mapping of individual kernel execution (some kernels could be mapped to DSP, others to A15 only). Here is an example:rˆh[j¼h\h_hah–hc}r‰(hi]hj]hh]hg]hk]uhlK÷hmhhU]rŠhoXšIt is possible to make finer grained mapping of individual kernel execution (some kernels could be mapped to DSP, others to A15 only). Here is an example:r‹…rŒ}r(hZjˆh[j†ubaubjI)rŽ}r(hZX¢#include #include #include #include #include using namespace cv; /* Time difference calculation, in ms units */ double tdiff_calc(struct timespec &tp_start, struct timespec &tp_end) { return (double)(tp_end.tv_nsec -tp_start.tv_nsec) * 0.000001 + (double)(tp_end.tv_sec - tp_start.tv_sec) * 1000.0; } int main(int argc, char** argv) { struct timespec tp0, tp1, tp2, tp3, tp4; Mat img_mat; UMat img, gray; imread("lena.png", 1).copyTo(img_mat); cv::ocl::setUseOpenCL(false); /* suspend dispatch to DSP - from now on kernels are executed on A15 only! */ clock_gettime(CLOCK_MONOTONIC, &tp0); cvtColor(img_mat, img_mat, COLOR_BGR2GRAY); clock_gettime(CLOCK_MONOTONIC, &tp1); cv::ocl::setUseOpenCL(true); /* resume DSP dispatch - from now on kernels, based on above decision tree, can be dispatched to DSP */ img_mat.copyTo(gray); clock_gettime(CLOCK_MONOTONIC, &tp2); GaussianBlur(gray, gray,Size(5, 5), 1.25); clock_gettime(CLOCK_MONOTONIC, &tp3); Canny(gray, gray, 0, 30); clock_gettime(CLOCK_MONOTONIC, &tp4); printf ("BGR2GRAY tdiff=%lf ms \n", tdiff_calc(tp0, tp1)); printf ("Copy2UMat tdiff=%lf ms \n", tdiff_calc(tp1, tp2)); printf ("GaussBlur tdiff=%lf ms \n", tdiff_calc(tp2, tp3)); printf ("Canny tdiff=%lf ms \n", tdiff_calc(tp3, tp4)); imwrite("canny_proc.jpg", gray); return 0; }h[j¼h\h_hajLhc}r(Ulinenosr‘‰Ulanguager’Xcpphehfhg]hh]hi]Uhighlight_argsr“}hj]hk]uhlKūhmhhU]r”hoX¢#include #include #include #include #include using namespace cv; /* Time difference calculation, in ms units */ double tdiff_calc(struct timespec &tp_start, struct timespec &tp_end) { return (double)(tp_end.tv_nsec -tp_start.tv_nsec) * 0.000001 + (double)(tp_end.tv_sec - tp_start.tv_sec) * 1000.0; } int main(int argc, char** argv) { struct timespec tp0, tp1, tp2, tp3, tp4; Mat img_mat; UMat img, gray; imread("lena.png", 1).copyTo(img_mat); cv::ocl::setUseOpenCL(false); /* suspend dispatch to DSP - from now on kernels are executed on A15 only! */ clock_gettime(CLOCK_MONOTONIC, &tp0); cvtColor(img_mat, img_mat, COLOR_BGR2GRAY); clock_gettime(CLOCK_MONOTONIC, &tp1); cv::ocl::setUseOpenCL(true); /* resume DSP dispatch - from now on kernels, based on above decision tree, can be dispatched to DSP */ img_mat.copyTo(gray); clock_gettime(CLOCK_MONOTONIC, &tp2); GaussianBlur(gray, gray,Size(5, 5), 1.25); clock_gettime(CLOCK_MONOTONIC, &tp3); Canny(gray, gray, 0, 30); clock_gettime(CLOCK_MONOTONIC, &tp4); printf ("BGR2GRAY tdiff=%lf ms \n", tdiff_calc(tp0, tp1)); printf ("Copy2UMat tdiff=%lf ms \n", tdiff_calc(tp1, tp2)); printf ("GaussBlur tdiff=%lf ms \n", tdiff_calc(tp2, tp3)); printf ("Canny tdiff=%lf ms \n", tdiff_calc(tp3, tp4)); imwrite("canny_proc.jpg", gray); return 0; }r•…r–}r—(hZUh[jŽubaubeubhs)r˜}r™(hZUh[hth\h_hahvhc}rš(hi]hj]hh]hg]r›h2ahk]rœhauhlM#hmhhU]r(h{)rž}rŸ(hZX Unit Testsr h[j˜h\h_hahhc}r”(hi]hj]hh]hg]hk]uhlM#hmhhU]r¢hoX Unit Testsr£…r¤}r„(hZj h[jžubaubh“)r¦}r§(hZX‚Each function in the OpenCV implementation has a unit test associate with the function. The following instructions show how to load and run unit tests of TI’s OpenCV implementation. The screen shots and device dependent instructions in this document are from AM57X build and run and can be used as a reference for build and run OpenCV test for any other TI devices from the above listrØh[j˜h\h_hah–hc}r©(hi]hj]hh]hg]hk]uhlM%hmhhU]rŖhoX‚Each function in the OpenCV implementation has a unit test associate with the function. The following instructions show how to load and run unit tests of TI’s OpenCV implementation. The screen shots and device dependent instructions in this document are from AM57X build and run and can be used as a reference for build and run OpenCV test for any other TI devices from the above listr«…r¬}r­(hZjØh[j¦ubaubj5)r®}rÆ(hZXUnit Tests Prerequisitesr°h[j˜h\h_haj9hc}r±(hg]r²hFahh]hi]hj]hk]r³hauhlNhmhhU]r“hoXUnit Tests Prerequisitesrµ…r¶}r·(hZj°h[j®ubaubh“)rø}r¹(hZXėOpenCV function unit test can run on any of TI devices that were mentioned above. This document describes how to run the unit test on AM57X family of TI devices. The screen shots were taken from a Tera-terminal connected to AM5728 EVM.rŗh[j˜h\h_hah–hc}r»(hi]hj]hh]hg]hk]uhlM0hmhhU]r¼hoXėOpenCV function unit test can run on any of TI devices that were mentioned above. This document describes how to run the unit test on AM57X family of TI devices. The screen shots were taken from a Tera-terminal connected to AM5728 EVM.r½…r¾}ræ(hZjŗh[jøubaubj5)rĄ}rĮ(hZX PrerequisitesrĀh[j˜h\h_haj9hc}rĆ(hg]rÄhOahh]hi]hj]hk]rÅh#auhlNhmhhU]rĘhoX PrerequisitesrĒ…rČ}rÉ(hZjĀh[jĄubaubcdocutils.nodes enumerated_list rŹ)rĖ}rĢ(hZUh[j˜h\h_haUenumerated_listrĶhc}rĪ(UsuffixrĻU.hg]hh]hi]UprefixrŠUhj]hk]UenumtyperŃUarabicrŅuhlM8hmhhU]rÓ(hĶ)rŌ}rÕ(hZX»AM572 EVM (or other AM57X based system) with connection to the network. See `here `__ for information on AM57X EVM. For other devices use a similar EVMh[jĖh\h_hahŃhc}rÖ(hi]hj]hh]hg]hk]uhlNhmhhU]r×h“)rŲ}rŁ(hZX»AM572 EVM (or other AM57X based system) with connection to the network. See `here `__ for information on AM57X EVM. For other devices use a similar EVMh[jŌh\h_hah–hc}rŚ(hi]hj]hh]hg]hk]uhlM8hU]rŪ(hoXLAM572 EVM (or other AM57X based system) with connection to the network. See rÜ…rŻ}rŽ(hZXLAM572 EVM (or other AM57X based system) with connection to the network. See h[jŲubh™)rß}rą(hZX-`here `__hc}rį(UnameXherehX"http://www.ti.com/tool/TMDXEVM5728hg]hh]hi]hj]hk]uh[jŲhU]rāhoXherer慁rä}rå(hZUh[jßubahah¢ubhoXB for information on AM57X EVM. For other devices use a similar EVMrꅁrē}rč(hZXB for information on AM57X EVM. For other devices use a similar EVMh[jŲubeubaubhĶ)ré}rź(hZXtTI Processor SDK Linux prospective LINUX operating system. URL to download Processor SDK Linux prospective is below.h[jĖh\h_hahŃhc}rė(hi]hj]hh]hg]hk]uhlNhmhhU]rģh“)rķ}rī(hZXtTI Processor SDK Linux prospective LINUX operating system. URL to download Processor SDK Linux prospective is below.rļh[jéh\h_hah–hc}rš(hi]hj]hh]hg]hk]uhlM;hU]rńhoXtTI Processor SDK Linux prospective LINUX operating system. URL to download Processor SDK Linux prospective is below.rņ…ró}rō(hZjļh[jķubaubaubhĶ)rõ}rö(hZX±File system either on a SD card (for devices with SD card interface), or mount to external server. If the file system resides on SD card, the card size should be at least 32GB. h[jĖh\h_hahŃhc}r÷(hi]hj]hh]hg]hk]uhlNhmhhU]rųh“)rł}rś(hZX°File system either on a SD card (for devices with SD card interface), or mount to external server. If the file system resides on SD card, the card size should be at least 32GB.rūh[jõh\h_hah–hc}rü(hi]hj]hh]hg]hk]uhlM=hU]rżhoX°File system either on a SD card (for devices with SD card interface), or mount to external server. If the file system resides on SD card, the card size should be at least 32GB.rž…r’}r(hZjūh[jłubaubaubeubj±)r}r(hZUh[j˜h\h_haj“hc}r(hi]hj]hh]hg]hk]uhlMAhmhhU]rj·)r}r(hZUjŗKh[jh\h_hahlhc}r(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubj5)r}r (hZX"Loading SDK and Standard Test Datar h[j˜h\h_haj9hc}r (hg]r hEahh]hi]hj]hk]r hauhlNhmhhU]rhoX"Loading SDK and Standard Test Datar…r}r(hZj h[jubaubh“)r}r(hZX7Processor SDK is available from the following locationsrh[j˜h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMGhmhhU]rhoX7Processor SDK is available from the following locationsr…r}r(hZjh[jubaubjI)r}r(hZX“For AM335X -> http://www.ti.com/tool/PROCESSOR-SDK-AM335X For AM437X -> http://www.ti.com/tool/PROCESSOR-SDK-AM437X For AM57X -> http://www.ti.com/tool/PROCESSOR-SDK-AM57X For DRA7XX -> http://www.ti.com/tool/processor-sdk-dra7x For K2E -> http://www.ti.com/tool/PROCESSOR-SDK-K2E For K2H -> http://www.ti.com/tool/PROCESSOR-SDK-K2H For K2L -> http://www.ti.com/tool/PROCESSOR-SDK-K2L For K2G -> http://www.ti.com/tool/PROCESSOR-SDK-K2Gh[j˜h\h_hajLhc}r(hehfhg]hh]hi]hj]hk]uhlMMhmhhU]rhoX“For AM335X -> http://www.ti.com/tool/PROCESSOR-SDK-AM335X For AM437X -> http://www.ti.com/tool/PROCESSOR-SDK-AM437X For AM57X -> http://www.ti.com/tool/PROCESSOR-SDK-AM57X For DRA7XX -> http://www.ti.com/tool/processor-sdk-dra7x For K2E -> http://www.ti.com/tool/PROCESSOR-SDK-K2E For K2H -> http://www.ti.com/tool/PROCESSOR-SDK-K2H For K2L -> http://www.ti.com/tool/PROCESSOR-SDK-K2L For K2G -> http://www.ti.com/tool/PROCESSOR-SDK-K2Gr…r}r (hZUh[jubaubj±)r!}r"(hZUh[j˜h\h_haj“hc}r#(hi]hj]hh]hg]hk]uhlMThmhhU]r$j·)r%}r&(hZUjŗKh[j!h\h_hahlhc}r'(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubj5)r(}r)(hZXLoading Standard Test Datar*h[j˜h\h_haj9hc}r+(hg]r,h7ahh]hi]hj]hk]r-h auhlNhmhhU]r.hoXLoading Standard Test Datar/…r0}r1(hZj*h[j(ubaubh“)r2}r3(hZXThe standard test code data opencv\_extra-master.zip can be downloaded from `here `__h[j˜h\h_hah–hc}r4(hi]hj]hh]hg]hk]uhlMYhmhhU]r5(hoXKThe standard test code data opencv_extra-master.zip can be downloaded from r6…r7}r8(hZXLThe standard test code data opencv\_extra-master.zip can be downloaded from h[j2ubh™)r9}r:(hZXD`here `__hc}r;(UnameXherehX9https://github.com/Itseez/opencv_extra/archive/master.ziphg]hh]hi]hj]hk]uh[j2hU]r<hoXherer=…r>}r?(hZUh[j9ubahah¢ubeubj5)r@}rA(hZXProcedure to Get the Test DatarBh[j˜h\h_haj9hc}rC(hg]rDh?ahh]hi]hj]hk]rEhauhlNhmhhU]rFhoXProcedure to Get the Test DatarG…rH}rI(hZjBh[j@ubaubh“)rJ}rK(hZX9There are multiple ways to download the data into the EVMrLh[j˜h\h_hah–hc}rM(hi]hj]hh]hg]hk]uhlM`hmhhU]rNhoX9There are multiple ways to download the data into the EVMrO…rP}rQ(hZjLh[jJubaubjI)rR}rS(hZXIf the EVM has display and keyboard the user can downloaded the data compressed file directly to the EVM and then unzip it Otherwise download the data compressed file to a PC on the network and use SCP or tftp or USB memory stick to move the data compressed file into the EVM.h[j˜h\h_hajLhc}rT(hehfhg]hh]hi]hj]hk]uhlMfhmhhU]rUhoXIf the EVM has display and keyboard the user can downloaded the data compressed file directly to the EVM and then unzip it Otherwise download the data compressed file to a PC on the network and use SCP or tftp or USB memory stick to move the data compressed file into the EVM.rV…rW}rX(hZUh[jRubaubh“)rY}rZ(hZXŲThe following screen shots show how to download the standard data compressed file into the EVM and unzip it. It assumes that there is a TFTP master server, for example Solarwinds or similar, and that the file opencv\_extra-master.zip was downloaded from https://github.com/Itseez/opencv_extra/archive/master.zip and resides in the root directory of the TFTP server. The beginning of the unzip process and the end of the unzip process are shown in the screen shots as well.h[j˜h\h_hah–hc}r[(hi]hj]hh]hg]hk]uhlMjhmhhU]r\(hoXżThe following screen shots show how to download the standard data compressed file into the EVM and unzip it. It assumes that there is a TFTP master server, for example Solarwinds or similar, and that the file opencv_extra-master.zip was downloaded from r]…r^}r_(hZXžThe following screen shots show how to download the standard data compressed file into the EVM and unzip it. It assumes that there is a TFTP master server, for example Solarwinds or similar, and that the file opencv\_extra-master.zip was downloaded from h[jYubh™)r`}ra(hZX9https://github.com/Itseez/opencv_extra/archive/master.ziprbhc}rc(Urefurijbhg]hh]hi]hj]hk]uh[jYhU]rdhoX9https://github.com/Itseez/opencv_extra/archive/master.zipre…rf}rg(hZUh[j`ubahah¢ubhoX” and resides in the root directory of the TFTP server. The beginning of the unzip process and the end of the unzip process are shown in the screen shots as well.rh…ri}rj(hZX” and resides in the root directory of the TFTP server. The beginning of the unzip process and the end of the unzip process are shown in the screen shots as well.h[jYubeubh“)rk}rl(hZXåThe TFTP command is tftp -g -r opencv\_extra-master.zip xxx.xxx.xxx.xxx where xxx.xxx.xxx.xxx stands for the IP address of the TFTP server. Note that the process takes few minutes because the file is very large. (More than 600MB)h[j˜h\h_hah–hc}rm(hi]hj]hh]hg]hk]uhlMshmhhU]rnhoXäThe TFTP command is tftp -g -r opencv_extra-master.zip xxx.xxx.xxx.xxx where xxx.xxx.xxx.xxx stands for the IP address of the TFTP server. Note that the process takes few minutes because the file is very large. (More than 600MB)ro…rp}rq(hZXåThe TFTP command is tftp -g -r opencv\_extra-master.zip xxx.xxx.xxx.xxx where xxx.xxx.xxx.xxx stands for the IP address of the TFTP server. Note that the process takes few minutes because the file is very large. (More than 600MB)h[jkubaubj-)rr}rs(hZX&.. Image:: ../images/UnzipMaster3.jpg h[j˜h\h_haj0hc}rt(UuriX linux/../images/UnzipMaster3.jpgruhg]hh]hi]hj]j3}rvU*jushk]uhlMyhmhhU]ubj±)rw}rx(hZUh[j˜h\h_haj“hc}ry(hi]hj]hh]hg]hk]uhlMzhmhhU]rzj·)r{}r|(hZUjŗKh[jwh\h_hahlhc}r}(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubj-)r~}r(hZX&.. Image:: ../images/UnzipMaster4.jpg h[j˜h\h_haj0hc}r€(UuriX linux/../images/UnzipMaster4.jpgrhg]hh]hi]hj]j3}r‚U*jshk]uhlM}hmhhU]ubj-)rƒ}r„(hZX%.. Image:: ../images/InflatedZip.jpg h[j˜h\h_haj0hc}r…(UuriXlinux/../images/InflatedZip.jpgr†hg]hh]hi]hj]j3}r‡U*j†shk]uhlMhmhhU]ubj±)rˆ}r‰(hZUh[j˜h\h_haj“hc}rŠ(hi]hj]hh]hg]hk]uhlM€hmhhU]r‹j·)rŒ}r(hZUjŗKh[jˆh\h_hahlhc}rŽ(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubj5)r}r(hZX!Summary of Getting the Data Stepsr‘h[j˜h\h_haj9hc}r’(hg]r“hBahh]hi]hj]hk]r”hauhlNhmhhU]r•hoX!Summary of Getting the Data Stepsr–…r—}r˜(hZj‘h[jubaubj±)r™}rš(hZUh[j˜h\h_haj“hc}r›(hi]hj]hh]hg]hk]uhlM…hmhhU]rœj·)r}rž(hZUjŗKh[j™h\h_hahlhc}rŸ(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubjŹ)r }r”(hZUh[j˜h\h_hajĶhc}r¢(jĻU.hg]hh]hi]jŠUhj]hk]jŃjŅuhlM‡hmhhU]r£(hĶ)r¤}r„(hZXBoot the EVM and login as root.r¦h[j h\h_hahŃhc}r§(hi]hj]hh]hg]hk]uhlNhmhhU]rØh“)r©}rŖ(hZj¦h[j¤h\h_hah–hc}r«(hi]hj]hh]hg]hk]uhlM‡hU]r¬hoXBoot the EVM and login as root.r­…r®}rÆ(hZj¦h[j©ubaubaubhĶ)r°}r±(hZX%Change directory to /usr/share/OpenCVr²h[j h\h_hahŃhc}r³(hi]hj]hh]hg]hk]uhlNhmhhU]r“h“)rµ}r¶(hZj²h[j°h\h_hah–hc}r·(hi]hj]hh]hg]hk]uhlMˆhU]røhoX%Change directory to /usr/share/OpenCVr¹…rŗ}r»(hZj²h[jµubaubaubhĶ)r¼}r½(hZXFGet the opencv\_extra-master.zip file from a server as described aboveh[j h\h_hahŃhc}r¾(hi]hj]hh]hg]hk]uhlNhmhhU]ræh“)rĄ}rĮ(hZXFGet the opencv\_extra-master.zip file from a server as described aboveh[j¼h\h_hah–hc}rĀ(hi]hj]hh]hg]hk]uhlM‰hU]rĆhoXEGet the opencv_extra-master.zip file from a server as described aboverÄ…rÅ}rĘ(hZXFGet the opencv\_extra-master.zip file from a server as described aboveh[jĄubaubaubhĶ)rĒ}rČ(hZX'unzip the opencv\_extra-master.zip filerÉh[j h\h_hahŃhc}rŹ(hi]hj]hh]hg]hk]uhlNhmhhU]rĖh“)rĢ}rĶ(hZjÉh[jĒh\h_hah–hc}rĪ(hi]hj]hh]hg]hk]uhlM‹hU]rĻhoX&unzip the opencv_extra-master.zip filerŠ…rŃ}rŅ(hZX'unzip the opencv\_extra-master.zip fileh[jĢubaubaubhĶ)rÓ}rŌ(hZX)Delete the opencv\_extra-master.zip file h[j h\h_hahŃhc}rÕ(hi]hj]hh]hg]hk]uhlNhmhhU]rÖh“)r×}rŲ(hZX(Delete the opencv\_extra-master.zip fileh[jÓh\h_hah–hc}rŁ(hi]hj]hh]hg]hk]uhlMŒhU]rŚhoX'Delete the opencv_extra-master.zip filerŪ…rÜ}rŻ(hZX(Delete the opencv\_extra-master.zip fileh[j×ubaubaubeubj±)rŽ}rß(hZUh[j˜h\h_haj“hc}rą(hi]hj]hh]hg]hk]uhlMŽhmhhU]rįj·)rā}rć(hZUjŗKh[jŽh\h_hahlhc}rä(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubh“)rå}rę(hZXŠAfter unzip the file a new directory ***opencv\_extra-master*** is generated. A sub-directory ***testdata*** should be moved up one level.h[j˜h\h_hah–hc}rē(hi]hj]hh]hg]hk]uhlMhmhhU]rč(hoX%After unzip the file a new directory r酁rź}rė(hZX%After unzip the file a new directory h[jåubcdocutils.nodes strong rģ)rķ}rī(hZX***opencv\_extra-master***hc}rļ(hi]hj]hh]hg]hk]uh[jåhU]ršhoX*opencv_extra-master*rń…rņ}ró(hZUh[jķubahaUstrongrōubhoX is generated. A sub-directory rõ…rö}r÷(hZX is generated. A sub-directory h[jåubjģ)rų}rł(hZX***testdata***hc}rś(hi]hj]hh]hg]hk]uh[jåhU]rūhoX *testdata*rü…rż}rž(hZUh[jųubahajōubhoX should be moved up one level.r’…r}r(hZX should be moved up one level.h[jåubeubh“)r}r(hZXqFrom the OpenCV directory do the following: ***mv opencv\_extra-master/testdata .*** . See the screen shot below.h[j˜h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlM”hmhhU]r(hoX,From the OpenCV directory do the following: r…r}r(hZX,From the OpenCV directory do the following: h[jubjģ)r }r (hZX(***mv opencv\_extra-master/testdata .***hc}r (hi]hj]hh]hg]hk]uh[jhU]r hoX#*mv opencv_extra-master/testdata .*r …r}r(hZUh[j ubahajōubhoX . See the screen shot below.r…r}r(hZX . See the screen shot below.h[jubeubj-)r}r(hZX&.. Image:: ../images/MoveTestdata.jpg h[j˜h\h_haj0hc}r(UuriX linux/../images/MoveTestdata.jpgrhg]hh]hi]hj]j3}rU*jshk]uhlM˜hmhhU]ubj5)r}r(hZX&Environment Settings and Run the Testsrh[j˜h\h_haj9hc}r(hg]rhTahh]hi]hj]hk]rh(auhlNhmhhU]rhoX&Environment Settings and Run the Testsr…r }r!(hZjh[jubaubh“)r"}r#(hZX„The script setupEnv.sh in directory /usr/share/OpenCV/titestsuite sets the environment variables that are needed for the unit tests.r$h[j˜h\h_hah–hc}r%(hi]hj]hh]hg]hk]uhlMhmhhU]r&hoX„The script setupEnv.sh in directory /usr/share/OpenCV/titestsuite sets the environment variables that are needed for the unit tests.r'…r(}r)(hZj$h[j"ubaubh“)r*}r+(hZX€From the OpenCV directory do the following: ***cd titestsuit*** and then ***source ./setupEnv.sh*** . See the screen shot below.h[j˜h\h_hah–hc}r,(hi]hj]hh]hg]hk]uhlM hmhhU]r-(hoX,From the OpenCV directory do the following: r.…r/}r0(hZX,From the OpenCV directory do the following: h[j*ubjģ)r1}r2(hZX***cd titestsuit***hc}r3(hi]hj]hh]hg]hk]uh[j*hU]r4hoX*cd titestsuit*r5…r6}r7(hZUh[j1ubahajōubhoX and then r8…r9}r:(hZX and then h[j*ubjģ)r;}r<(hZX***source ./setupEnv.sh***hc}r=(hi]hj]hh]hg]hk]uh[j*hU]r>hoX*source ./setupEnv.sh*r?…r@}rA(hZUh[j;ubahajōubhoX . See the screen shot below.rB…rC}rD(hZX . See the screen shot below.h[j*ubeubj-)rE}rF(hZX&.. Image:: ../images/Environment1.jpg h[j˜h\h_haj0hc}rG(UuriX linux/../images/Environment1.jpgrHhg]hh]hi]hj]j3}rIU*jHshk]uhlM¤hmhhU]ubh“)rJ}rK(hZX¤The script runtests run all the unit tests. From the titestsuit directory do ***./runtests*** . The unit tests starts executing. The screen will show the following:h[j˜h\h_hah–hc}rL(hi]hj]hh]hg]hk]uhlM„hmhhU]rM(hoXMThe script runtests run all the unit tests. From the titestsuit directory do rN…rO}rP(hZXMThe script runtests run all the unit tests. From the titestsuit directory do h[jJubjģ)rQ}rR(hZX***./runtests***hc}rS(hi]hj]hh]hg]hk]uh[jJhU]rThoX *./runtests*rU…rV}rW(hZUh[jQubahajōubhoXG . The unit tests starts executing. The screen will show the following:rX…rY}rZ(hZXG . The unit tests starts executing. The screen will show the following:h[jJubeubj-)r[}r\(hZX#.. Image:: ../images/RunTests1.jpg h[j˜h\h_haj0hc}r](UuriXlinux/../images/RunTests1.jpgr^hg]hh]hi]hj]j3}r_U*j^shk]uhlMŖhmhhU]ubjŹ)r`}ra(hZUh[j˜h\h_hajĶhc}rb(jĻU.hg]hh]hi]jŠUhj]hk]jŃjŅuhlM«hmhhU]rc(hĶ)rd}re(hZXĆCurrently the last three tests in the script (videoio) do not run on AM57X. The script will stuck after about 90 minutes. The user can stop the script ("control C") or eliminate the videoio testsh[j`h\h_hahŃhc}rf(hi]hj]hh]hg]hk]uhlNhmhhU]rgh“)rh}ri(hZXĆCurrently the last three tests in the script (videoio) do not run on AM57X. The script will stuck after about 90 minutes. The user can stop the script ("control C") or eliminate the videoio testsrjh[jdh\h_hah–hc}rk(hi]hj]hh]hg]hk]uhlM«hU]rlhoXĆCurrently the last three tests in the script (videoio) do not run on AM57X. The script will stuck after about 90 minutes. The user can stop the script ("control C") or eliminate the videoio testsrm…rn}ro(hZjjh[jhubaubaubhĶ)rp}rq(hZX–An output log file opencv\_test\_log.out is generated in directory /usr/share/OpenCV/titestsuite. The start of the log file looks like the following: h[j`h\h_hahŃhc}rr(hi]hj]hh]hg]hk]uhlNhmhhU]rsh“)rt}ru(hZX•An output log file opencv\_test\_log.out is generated in directory /usr/share/OpenCV/titestsuite. The start of the log file looks like the following:h[jph\h_hah–hc}rv(hi]hj]hh]hg]hk]uhlM®hU]rwhoX“An output log file opencv_test_log.out is generated in directory /usr/share/OpenCV/titestsuite. The start of the log file looks like the following:rx…ry}rz(hZX•An output log file opencv\_test\_log.out is generated in directory /usr/share/OpenCV/titestsuite. The start of the log file looks like the following:h[jtubaubaubeubj-)r{}r|(hZX!.. Image:: ../images/Logfile.jpg h[j˜h\h_haj0hc}r}(UuriXlinux/../images/Logfile.jpgr~hg]hh]hi]hj]j3}rU*j~shk]uhlM³hmhhU]ubj5)r€}r(hZXReports and Resultsr‚h[j˜h\h_haj9hc}rƒ(hg]r„hIahh]hi]hj]hk]r…hauhlNhmhhU]r†hoXReports and Resultsr‡…rˆ}r‰(hZj‚h[j€ubaubh“)rŠ}r‹(hZX@Summary of accuracy test results on 66AK2H12 and AM57x platformsrŒh[j˜h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlM·hmhhU]rŽhoX@Summary of accuracy test results on 66AK2H12 and AM57x platformsr…r}r‘(hZjŒh[jŠubaubjY)r’}r“(hZUh[j˜h\h_haj\hc}r”(hi]hj]hh]hg]hk]uhlNhmhhU]r•j_)r–}r—(hZUhc}r˜(hg]hh]hi]hj]hk]UcolsKuh[j’hU]r™(jd)rš}r›(hZUhc}rœ(hg]hh]hi]hj]hk]UcolwidthKuh[j–hU]hajhubjd)r}rž(hZUhc}rŸ(hg]hh]hi]hj]hk]UcolwidthKuh[j–hU]hajhubjd)r }r”(hZUhc}r¢(hg]hh]hi]hj]hk]UcolwidthK#uh[j–hU]hajhubjd)r£}r¤(hZUhc}r„(hg]hh]hi]hj]hk]UcolwidthKuh[j–hU]hajhubjd)r¦}r§(hZUhc}rØ(hg]hh]hi]hj]hk]UcolwidthKuh[j–hU]hajhubjr)r©}rŖ(hZUhc}r«(hi]hj]hh]hg]hk]uh[j–hU]r¬jw)r­}r®(hZUhc}rÆ(hi]hj]hh]hg]hk]uh[j©hU]r°(j|)r±}r²(hZUhc}r³(hi]hj]hh]hg]hk]uh[j­hU]r“h“)rµ}r¶(hZX Module Namer·h[j±h\h_hah–hc}rø(hi]hj]hh]hg]hk]uhlMŗhU]r¹hoX Module Namerŗ…r»}r¼(hZj·h[jµubaubahaj‰ubj|)r½}r¾(hZUhc}ræ(hi]hj]hh]hg]hk]uh[j­hU]rĄh“)rĮ}rĀ(hZX # Of TestsrĆh[j½h\h_hah–hc}rÄ(hi]hj]hh]hg]hk]uhlMŗhU]rÅhoX # Of TestsrĘ…rĒ}rČ(hZjĆh[jĮubaubahaj‰ubj|)rÉ}rŹ(hZUhc}rĖ(hi]hj]hh]hg]hk]uh[j­hU]rĢh“)rĶ}rĪ(hZX#66AK2H12 FailuresrĻh[jÉh\h_hah–hc}rŠ(hi]hj]hh]hg]hk]uhlMŗhU]rŃhoX#66AK2H12 FailuresrŅ…rÓ}rŌ(hZjĻh[jĶubaubahaj‰ubj|)rÕ}rÖ(hZUhc}r×(hi]hj]hh]hg]hk]uh[j­hU]rŲh“)rŁ}rŚ(hZX# AM57X FailuresrŪh[jÕh\h_hah–hc}rÜ(hi]hj]hh]hg]hk]uhlMŗhU]rŻhoX# AM57X FailuresrŽ…rß}rą(hZjŪh[jŁubaubahaj‰ubj|)rį}rā(hZUhc}rć(hi]hj]hh]hg]hk]uh[j­hU]haj‰ubehaj®ubahajÆubj°)rä}rå(hZUhc}rę(hi]hj]hh]hg]hk]uh[j–hU]rē(jw)rč}ré(hZUhc}rź(hi]hj]hh]hg]hk]uh[jähU]rė(j|)rģ}rķ(hZUhc}rī(hi]hj]hh]hg]hk]uh[jčhU]rļh“)rš}rń(hZXcalib3drņh[jģh\h_hah–hc}ró(hi]hj]hh]hg]hk]uhlM¼hU]rōhoXcalib3drõ…rö}r÷(hZjņh[jšubaubahaj‰ubj|)rų}rł(hZUhc}rś(hi]hj]hh]hg]hk]uh[jčhU]rūh“)rü}rż(hZX70ržh[jųh\h_hah–hc}r’(hi]hj]hh]hg]hk]uhlM¼hU]r hoX70r …r }r (hZjžh[jüubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jčhU]r h“)r }r (hZX1h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlM¼hU]r hoX1…r }r (hZX1h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jčhU]r h“)r }r (hZX1h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlM¼hU]r hoX1…r }r (hZX1h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jčhU]haj‰ubehaj®ubjw)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jähU]r (j|)r }r (hZUhc}r! (hi]hj]hh]hg]hk]uh[j hU]r" h“)r# }r$ (hZXCorer% h[j h\h_hah–hc}r& (hi]hj]hh]hg]hk]uhlM¾hU]r' hoXCorer( …r) }r* (hZj% h[j# ubaubahaj‰ubj|)r+ }r, (hZUhc}r- (hi]hj]hh]hg]hk]uh[j hU]r. h“)r/ }r0 (hZX10299r1 h[j+ h\h_hah–hc}r2 (hi]hj]hh]hg]hk]uhlM¾hU]r3 hoX10299r4 …r5 }r6 (hZj1 h[j/ ubaubahaj‰ubj|)r7 }r8 (hZUhc}r9 (hi]hj]hh]hg]hk]uh[j hU]r: h“)r; }r< (hZX9h[j7 h\h_hah–hc}r= (hi]hj]hh]hg]hk]uhlM¾hU]r> hoX9…r? }r@ (hZX9h[j; ubaubahaj‰ubj|)rA }rB (hZUhc}rC (hi]hj]hh]hg]hk]uh[j hU]rD h“)rE }rF (hZX11rG h[jA h\h_hah–hc}rH (hi]hj]hh]hg]hk]uhlM¾hU]rI hoX11rJ …rK }rL (hZjG h[jE ubaubahaj‰ubj|)rM }rN (hZUhc}rO (hi]hj]hh]hg]hk]uh[j hU]haj‰ubehaj®ubjw)rP }rQ (hZUhc}rR (hi]hj]hh]hg]hk]uh[jähU]rS (j|)rT }rU (hZUhc}rV (hi]hj]hh]hg]hk]uh[jP hU]rW h“)rX }rY (hZX features2drZ h[jT h\h_hah–hc}r[ (hi]hj]hh]hg]hk]uhlMĄhU]r\ hoX features2dr] …r^ }r_ (hZjZ h[jX ubaubahaj‰ubj|)r` }ra (hZUhc}rb (hi]hj]hh]hg]hk]uh[jP hU]rc h“)rd }re (hZX86rf h[j` h\h_hah–hc}rg (hi]hj]hh]hg]hk]uhlMĄhU]rh hoX86ri …rj }rk (hZjf h[jd ubaubahaj‰ubj|)rl }rm (hZUhc}rn (hi]hj]hh]hg]hk]uh[jP hU]ro h“)rp }rq (hZX0h[jl h\h_hah–hc}rr (hi]hj]hh]hg]hk]uhlMĄhU]rs hoX0…rt }ru (hZX0h[jp ubaubahaj‰ubj|)rv }rw (hZUhc}rx (hi]hj]hh]hg]hk]uh[jP hU]ry h“)rz }r{ (hZX0h[jv h\h_hah–hc}r| (hi]hj]hh]hg]hk]uhlMĄhU]r} hoX0…r~ }r (hZX0h[jz ubaubahaj‰ubj|)r€ }r (hZUhc}r‚ (hi]hj]hh]hg]hk]uh[jP hU]haj‰ubehaj®ubjw)rƒ }r„ (hZUhc}r… (hi]hj]hh]hg]hk]uh[jähU]r† (j|)r‡ }rˆ (hZUhc}r‰ (hi]hj]hh]hg]hk]uh[jƒ hU]rŠ h“)r‹ }rŒ (hZXflannr h[j‡ h\h_hah–hc}rŽ (hi]hj]hh]hg]hk]uhlMĀhU]r hoXflannr …r‘ }r’ (hZj h[j‹ ubaubahaj‰ubj|)r“ }r” (hZUhc}r• (hi]hj]hh]hg]hk]uh[jƒ hU]r– h“)r— }r˜ (hZX1h[j“ h\h_hah–hc}r™ (hi]hj]hh]hg]hk]uhlMĀhU]rš hoX1…r› }rœ (hZX1h[j— ubaubahaj‰ubj|)r }rž (hZUhc}rŸ (hi]hj]hh]hg]hk]uh[jƒ hU]r  h“)r” }r¢ (hZX0h[j h\h_hah–hc}r£ (hi]hj]hh]hg]hk]uhlMĀhU]r¤ hoX0…r„ }r¦ (hZX0h[j” ubaubahaj‰ubj|)r§ }rØ (hZUhc}r© (hi]hj]hh]hg]hk]uh[jƒ hU]rŖ h“)r« }r¬ (hZX0h[j§ h\h_hah–hc}r­ (hi]hj]hh]hg]hk]uhlMĀhU]r® hoX0…rÆ }r° (hZX0h[j« ubaubahaj‰ubj|)r± }r² (hZUhc}r³ (hi]hj]hh]hg]hk]uh[jƒ hU]haj‰ubehaj®ubjw)r“ }rµ (hZUhc}r¶ (hi]hj]hh]hg]hk]uh[jähU]r· (j|)rø }r¹ (hZUhc}rŗ (hi]hj]hh]hg]hk]uh[j“ hU]r» h“)r¼ }r½ (hZX imgcodecsr¾ h[jø h\h_hah–hc}ræ (hi]hj]hh]hg]hk]uhlMÄhU]rĄ hoX imgcodecsrĮ …rĀ }rĆ (hZj¾ h[j¼ ubaubahaj‰ubj|)rÄ }rÅ (hZUhc}rĘ (hi]hj]hh]hg]hk]uh[j“ hU]rĒ h“)rČ }rÉ (hZX15rŹ h[jÄ h\h_hah–hc}rĖ (hi]hj]hh]hg]hk]uhlMÄhU]rĢ hoX15rĶ …rĪ }rĻ (hZjŹ h[jČ ubaubahaj‰ubj|)rŠ }rŃ (hZUhc}rŅ (hi]hj]hh]hg]hk]uh[j“ hU]rÓ h“)rŌ }rÕ (hZX0h[jŠ h\h_hah–hc}rÖ (hi]hj]hh]hg]hk]uhlMÄhU]r× hoX0…rŲ }rŁ (hZX0h[jŌ ubaubahaj‰ubj|)rŚ }rŪ (hZUhc}rÜ (hi]hj]hh]hg]hk]uh[j“ hU]rŻ h“)rŽ }rß (hZX0h[jŚ h\h_hah–hc}rą (hi]hj]hh]hg]hk]uhlMÄhU]rį hoX0…rā }rć (hZX0h[jŽ ubaubahaj‰ubj|)rä }rå (hZUhc}rę (hi]hj]hh]hg]hk]uh[j“ hU]haj‰ubehaj®ubjw)rē }rč (hZUhc}ré (hi]hj]hh]hg]hk]uh[jähU]rź (j|)rė }rģ (hZUhc}rķ (hi]hj]hh]hg]hk]uh[jē hU]rī h“)rļ }rš (hZXimgprocrń h[jė h\h_hah–hc}rņ (hi]hj]hh]hg]hk]uhlMĘhU]ró hoXimgprocrō …rõ }rö (hZjń h[jļ ubaubahaj‰ubj|)r÷ }rų (hZUhc}rł (hi]hj]hh]hg]hk]uh[jē hU]rś h“)rū }rü (hZX8699rż h[j÷ h\h_hah–hc}rž (hi]hj]hh]hg]hk]uhlMĘhU]r’ hoX8699r …r }r (hZjż h[jū ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jē hU]r h“)r }r (hZX3h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMĘhU]r hoX3…r }r (hZX3h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jē hU]r h“)r }r (hZX6h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMĘhU]r hoX6…r }r (hZX6h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jē hU]haj‰ubehaj®ubjw)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jähU]r (j|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j hU]r! h“)r" }r# (hZXmlr$ h[j h\h_hah–hc}r% (hi]hj]hh]hg]hk]uhlMČhU]r& hoXmlr' …r( }r) (hZj$ h[j" ubaubahaj‰ubj|)r* }r+ (hZUhc}r, (hi]hj]hh]hg]hk]uh[j hU]r- h“)r. }r/ (hZX26r0 h[j* h\h_hah–hc}r1 (hi]hj]hh]hg]hk]uhlMČhU]r2 hoX26r3 …r4 }r5 (hZj0 h[j. ubaubahaj‰ubj|)r6 }r7 (hZUhc}r8 (hi]hj]hh]hg]hk]uh[j hU]r9 h“)r: }r; (hZX0h[j6 h\h_hah–hc}r< (hi]hj]hh]hg]hk]uhlMČhU]r= hoX0…r> }r? (hZX0h[j: ubaubahaj‰ubj|)r@ }rA (hZUhc}rB (hi]hj]hh]hg]hk]uh[j hU]rC h“)rD }rE (hZX0h[j@ h\h_hah–hc}rF (hi]hj]hh]hg]hk]uhlMČhU]rG hoX0…rH }rI (hZX0h[jD ubaubahaj‰ubj|)rJ }rK (hZUhc}rL (hi]hj]hh]hg]hk]uh[j hU]haj‰ubehaj®ubjw)rM }rN (hZUhc}rO (hi]hj]hh]hg]hk]uh[jähU]rP (j|)rQ }rR (hZUhc}rS (hi]hj]hh]hg]hk]uh[jM hU]rT h“)rU }rV (hZX objdetectrW h[jQ h\h_hah–hc}rX (hi]hj]hh]hg]hk]uhlMŹhU]rY hoX objdetectrZ …r[ }r\ (hZjW h[jU ubaubahaj‰ubj|)r] }r^ (hZUhc}r_ (hi]hj]hh]hg]hk]uh[jM hU]r` h“)ra }rb (hZX9h[j] h\h_hah–hc}rc (hi]hj]hh]hg]hk]uhlMŹhU]rd hoX9…re }rf (hZX9h[ja ubaubahaj‰ubj|)rg }rh (hZUhc}ri (hi]hj]hh]hg]hk]uh[jM hU]rj h“)rk }rl (hZX0h[jg h\h_hah–hc}rm (hi]hj]hh]hg]hk]uhlMŹhU]rn hoX0…ro }rp (hZX0h[jk ubaubahaj‰ubj|)rq }rr (hZUhc}rs (hi]hj]hh]hg]hk]uh[jM hU]rt h“)ru }rv (hZX0h[jq h\h_hah–hc}rw (hi]hj]hh]hg]hk]uhlMŹhU]rx hoX0…ry }rz (hZX0h[ju ubaubahaj‰ubj|)r{ }r| (hZUhc}r} (hi]hj]hh]hg]hk]uh[jM hU]haj‰ubehaj®ubjw)r~ }r (hZUhc}r€ (hi]hj]hh]hg]hk]uh[jähU]r (j|)r‚ }rƒ (hZUhc}r„ (hi]hj]hh]hg]hk]uh[j~ hU]r… h“)r† }r‡ (hZXphotorˆ h[j‚ h\h_hah–hc}r‰ (hi]hj]hh]hg]hk]uhlMĢhU]rŠ hoXphotor‹ …rŒ }r (hZjˆ h[j† ubaubahaj‰ubj|)rŽ }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j~ hU]r‘ h“)r’ }r“ (hZX63r” h[jŽ h\h_hah–hc}r• (hi]hj]hh]hg]hk]uhlMĢhU]r– hoX63r— …r˜ }r™ (hZj” h[j’ ubaubahaj‰ubj|)rš }r› (hZUhc}rœ (hi]hj]hh]hg]hk]uh[j~ hU]r h“)rž }rŸ (hZX0h[jš h\h_hah–hc}r  (hi]hj]hh]hg]hk]uhlMĢhU]r” hoX0…r¢ }r£ (hZX0h[jž ubaubahaj‰ubj|)r¤ }r„ (hZUhc}r¦ (hi]hj]hh]hg]hk]uh[j~ hU]r§ h“)rØ }r© (hZX0h[j¤ h\h_hah–hc}rŖ (hi]hj]hh]hg]hk]uhlMĢhU]r« hoX0…r¬ }r­ (hZX0h[jØ ubaubahaj‰ubj|)r® }rÆ (hZUhc}r° (hi]hj]hh]hg]hk]uh[j~ hU]haj‰ubehaj®ubjw)r± }r² (hZUhc}r³ (hi]hj]hh]hg]hk]uh[jähU]r“ (j|)rµ }r¶ (hZUhc}r· (hi]hj]hh]hg]hk]uh[j± hU]rø h“)r¹ }rŗ (hZXshaper» h[jµ h\h_hah–hc}r¼ (hi]hj]hh]hg]hk]uhlMĪhU]r½ hoXshaper¾ …ræ }rĄ (hZj» h[j¹ ubaubahaj‰ubj|)rĮ }rĀ (hZUhc}rĆ (hi]hj]hh]hg]hk]uh[j± hU]rÄ h“)rÅ }rĘ (hZX3h[jĮ h\h_hah–hc}rĒ (hi]hj]hh]hg]hk]uhlMĪhU]rČ hoX3…rÉ }rŹ (hZX3h[jÅ ubaubahaj‰ubj|)rĖ }rĢ (hZUhc}rĶ (hi]hj]hh]hg]hk]uh[j± hU]rĪ h“)rĻ }rŠ (hZX0h[jĖ h\h_hah–hc}rŃ (hi]hj]hh]hg]hk]uhlMĪhU]rŅ hoX0…rÓ }rŌ (hZX0h[jĻ ubaubahaj‰ubj|)rÕ }rÖ (hZUhc}r× (hi]hj]hh]hg]hk]uh[j± hU]rŲ h“)rŁ }rŚ (hZX0h[jÕ h\h_hah–hc}rŪ (hi]hj]hh]hg]hk]uhlMĪhU]rÜ hoX0…rŻ }rŽ (hZX0h[jŁ ubaubahaj‰ubj|)rß }rą (hZUhc}rį (hi]hj]hh]hg]hk]uh[j± hU]haj‰ubehaj®ubjw)rā }rć (hZUhc}rä (hi]hj]hh]hg]hk]uh[jähU]rå (j|)rę }rē (hZUhc}rč (hi]hj]hh]hg]hk]uh[jā hU]ré h“)rź }rė (hZXstichingrģ h[ję h\h_hah–hc}rķ (hi]hj]hh]hg]hk]uhlMŠhU]rī hoXstichingrļ …rš }rń (hZjģ h[jź ubaubahaj‰ubj|)rņ }ró (hZUhc}rō (hi]hj]hh]hg]hk]uh[jā hU]rõ h“)rö }r÷ (hZX4h[jņ h\h_hah–hc}rų (hi]hj]hh]hg]hk]uhlMŠhU]rł hoX4…rś }rū (hZX4h[jö ubaubahaj‰ubj|)rü }rż (hZUhc}rž (hi]hj]hh]hg]hk]uh[jā hU]r’ h“)r }r (hZX0h[jü h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMŠhU]r hoX0…r }r (hZX0h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jā hU]r h“)r }r (hZX0h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMŠhU]r hoX0…r }r (hZX0h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jā hU]haj‰ubehaj®ubjw)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jähU]r (j|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j hU]r h“)r }r (hZXsuperresr h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMŅhU]r hoXsuperresr …r! }r" (hZj h[j ubaubahaj‰ubj|)r# }r$ (hZUhc}r% (hi]hj]hh]hg]hk]uh[j hU]r& h“)r' }r( (hZX3h[j# h\h_hah–hc}r) (hi]hj]hh]hg]hk]uhlMŅhU]r* hoX3…r+ }r, (hZX3h[j' ubaubahaj‰ubj|)r- }r. (hZUhc}r/ (hi]hj]hh]hg]hk]uh[j hU]r0 h“)r1 }r2 (hZX0h[j- h\h_hah–hc}r3 (hi]hj]hh]hg]hk]uhlMŅhU]r4 hoX0…r5 }r6 (hZX0h[j1 ubaubahaj‰ubj|)r7 }r8 (hZUhc}r9 (hi]hj]hh]hg]hk]uh[j hU]r: h“)r; }r< (hZX0h[j7 h\h_hah–hc}r= (hi]hj]hh]hg]hk]uhlMŅhU]r> hoX0…r? }r@ (hZX0h[j; ubaubahaj‰ubj|)rA }rB (hZUhc}rC (hi]hj]hh]hg]hk]uh[j hU]haj‰ubehaj®ubjw)rD }rE (hZUhc}rF (hi]hj]hh]hg]hk]uh[jähU]rG (j|)rH }rI (hZUhc}rJ (hi]hj]hh]hg]hk]uh[jD hU]rK h“)rL }rM (hZXvideorN h[jH h\h_hah–hc}rO (hi]hj]hh]hg]hk]uhlMŌhU]rP hoXvideorQ …rR }rS (hZjN h[jL ubaubahaj‰ubj|)rT }rU (hZUhc}rV (hi]hj]hh]hg]hk]uh[jD hU]rW h“)rX }rY (hZX58rZ h[jT h\h_hah–hc}r[ (hi]hj]hh]hg]hk]uhlMŌhU]r\ hoX58r] …r^ }r_ (hZjZ h[jX ubaubahaj‰ubj|)r` }ra (hZUhc}rb (hi]hj]hh]hg]hk]uh[jD hU]rc h“)rd }re (hZX0h[j` h\h_hah–hc}rf (hi]hj]hh]hg]hk]uhlMŌhU]rg hoX0…rh }ri (hZX0h[jd ubaubahaj‰ubj|)rj }rk (hZUhc}rl (hi]hj]hh]hg]hk]uh[jD hU]rm h“)rn }ro (hZX0h[jj h\h_hah–hc}rp (hi]hj]hh]hg]hk]uhlMŌhU]rq hoX0…rr }rs (hZX0h[jn ubaubahaj‰ubj|)rt }ru (hZUhc}rv (hi]hj]hh]hg]hk]uh[jD hU]haj‰ubehaj®ubjw)rw }rx (hZUhc}ry (hi]hj]hh]hg]hk]uh[jähU]rz (j|)r{ }r| (hZUhc}r} (hi]hj]hh]hg]hk]uh[jw hU]r~ h“)r }r€ (hZXvideoior h[j{ h\h_hah–hc}r‚ (hi]hj]hh]hg]hk]uhlMÖhU]rƒ hoXvideoior„ …r… }r† (hZj h[j ubaubahaj‰ubj|)r‡ }rˆ (hZUhc}r‰ (hi]hj]hh]hg]hk]uh[jw hU]rŠ h“)r‹ }rŒ (hZX70r h[j‡ h\h_hah–hc}rŽ (hi]hj]hh]hg]hk]uhlMÖhU]r hoX70r …r‘ }r’ (hZj h[j‹ ubaubahaj‰ubj|)r“ }r” (hZUhc}r• (hi]hj]hh]hg]hk]uh[jw hU]r– h“)r— }r˜ (hZX0/3 (Not built with FFMPEG/GST)r™ h[j“ h\h_hah–hc}rš (hi]hj]hh]hg]hk]uhlMÖhU]r› hoX0/3 (Not built with FFMPEG/GST)rœ …r }rž (hZj™ h[j— ubaubahaj‰ubj|)rŸ }r  (hZUhc}r” (hi]hj]hh]hg]hk]uh[jw hU]r¢ h“)r£ }r¤ (hZX1h[jŸ h\h_hah–hc}r„ (hi]hj]hh]hg]hk]uhlMÖhU]r¦ hoX1…r§ }rØ (hZX1h[j£ ubaubahaj‰ubj|)r© }rŖ (hZUhc}r« (hi]hj]hh]hg]hk]uh[jw hU]haj‰ubehaj®ubehajÆubehaj°ubaubh“)r¬ }r­ (hZXIDetails of accuracy test failures results on 66AK2H12 and AM57x platformsr® h[j˜h\h_hah–hc}rÆ (hi]hj]hh]hg]hk]uhlMŁhmhhU]r° hoXIDetails of accuracy test failures results on 66AK2H12 and AM57x platformsr± …r² }r³ (hZj® h[j¬ ubaubjY)r“ }rµ (hZUh[j˜h\h_haj\hc}r¶ (hi]hj]hh]hg]hk]uhlNhmhhU]r· j_)rø }r¹ (hZUhc}rŗ (hg]hh]hi]hj]hk]UcolsKuh[j“ hU]r» (jd)r¼ }r½ (hZUhc}r¾ (hg]hh]hi]hj]hk]UcolwidthKuh[jø hU]hajhubjd)ræ }rĄ (hZUhc}rĮ (hg]hh]hi]hj]hk]UcolwidthK uh[jø hU]hajhubjd)rĀ }rĆ (hZUhc}rÄ (hg]hh]hi]hj]hk]UcolwidthK@uh[jø hU]hajhubjd)rÅ }rĘ (hZUhc}rĒ (hg]hh]hi]hj]hk]UcolwidthK uh[jø hU]hajhubjd)rČ }rÉ (hZUhc}rŹ (hg]hh]hi]hj]hk]UcolwidthK (hi]hj]hh]hg]hk]uhlMŽhU]r? hoX1…r@ }rA (hZX1h[j< ubaubahaj‰ubj|)rB }rC (hZUhc}rD (hi]hj]hh]hg]hk]uh[j hU]rE h“)rF }rG (hZXFisheyeTest.RectifyrH h[jB h\h_hah–hc}rI (hi]hj]hh]hg]hk]uhlMŽhU]rJ hoXFisheyeTest.RectifyrK …rL }rM (hZjH h[jF ubaubahaj‰ubehaj®ubjw)rN }rO (hZUhc}rP (hi]hj]hh]hg]hk]uh[j hU]rQ (j|)rR }rS (hZUhc}rT (hi]hj]hh]hg]hk]uh[jN hU]rU h“)rV }rW (hZXcorerX h[jR h\h_hah–hc}rY (hi]hj]hh]hg]hk]uhlMąhU]rZ hoXcorer[ …r\ }r] (hZjX h[jV ubaubahaj‰ubj|)r^ }r_ (hZUhc}r` (hi]hj]hh]hg]hk]uh[jN hU]ra h“)rb }rc (hZX1h[j^ h\h_hah–hc}rd (hi]hj]hh]hg]hk]uhlMąhU]re hoX1…rf }rg (hZX1h[jb ubaubahaj‰ubj|)rh }ri (hZUhc}rj (hi]hj]hh]hg]hk]uh[jN hU]rk h“)rl }rm (hZX8turnOffOpenCL::Image2D (No Image2d support in TI OpenCL)rn h[jh h\h_hah–hc}ro (hi]hj]hh]hg]hk]uhlMąhU]rp hoX8turnOffOpenCL::Image2D (No Image2d support in TI OpenCL)rq …rr }rs (hZjn h[jl ubaubahaj‰ubj|)rt }ru (hZUhc}rv (hi]hj]hh]hg]hk]uh[jN hU]rw h“)rx }ry (hZX1h[jt h\h_hah–hc}rz (hi]hj]hh]hg]hk]uhlMąhU]r{ hoX1…r| }r} (hZX1h[jx ubaubahaj‰ubj|)r~ }r (hZUhc}r€ (hi]hj]hh]hg]hk]uh[jN hU]r h“)r‚ }rƒ (hZX8turnOffOpenCL::Image2D (No Image2d support in TI OpenCL)r„ h[j~ h\h_hah–hc}r… (hi]hj]hh]hg]hk]uhlMąhU]r† hoX8turnOffOpenCL::Image2D (No Image2d support in TI OpenCL)r‡ …rˆ }r‰ (hZj„ h[j‚ ubaubahaj‰ubehaj®ubjw)rŠ }r‹ (hZUhc}rŒ (hi]hj]hh]hg]hk]uh[j hU]r (j|)rŽ }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jŠ hU]r‘ h“)r’ }r“ (hZXcorer” h[jŽ h\h_hah–hc}r• (hi]hj]hh]hg]hk]uhlMāhU]r– hoXcorer— …r˜ }r™ (hZj” h[j’ ubaubahaj‰ubj|)rš }r› (hZUhc}rœ (hi]hj]hh]hg]hk]uh[jŠ hU]r h“)rž }rŸ (hZX8h[jš h\h_hah–hc}r  (hi]hj]hh]hg]hk]uhlMāhU]r” hoX8…r¢ }r£ (hZX8h[jž ubaubahaj‰ubj|)r¤ }r„ (hZUhc}r¦ (hi]hj]hh]hg]hk]uh[jŠ hU]r§ h“)rØ }r© (hZX Mul (Neon)rŖ h[j¤ h\h_hah–hc}r« (hi]hj]hh]hg]hk]uhlMāhU]r¬ hoX Mul (Neon)r­ …r® }rÆ (hZjŖ h[jØ ubaubahaj‰ubj|)r° }r± (hZUhc}r² (hi]hj]hh]hg]hk]uh[jŠ hU]r³ h“)r“ }rµ (hZX8h[j° h\h_hah–hc}r¶ (hi]hj]hh]hg]hk]uhlMāhU]r· hoX8…rø }r¹ (hZX8h[j“ ubaubahaj‰ubj|)rŗ }r» (hZUhc}r¼ (hi]hj]hh]hg]hk]uh[jŠ hU]r½ h“)r¾ }ræ (hZX Mul (Neon)rĄ h[jŗ h\h_hah–hc}rĮ (hi]hj]hh]hg]hk]uhlMāhU]rĀ hoX Mul (Neon)rĆ …rÄ }rÅ (hZjĄ h[j¾ ubaubahaj‰ubehaj®ubjw)rĘ }rĒ (hZUhc}rČ (hi]hj]hh]hg]hk]uh[j hU]rÉ (j|)rŹ }rĖ (hZUhc}rĢ (hi]hj]hh]hg]hk]uh[jĘ hU]rĶ h“)rĪ }rĻ (hZXcorerŠ h[jŹ h\h_hah–hc}rŃ (hi]hj]hh]hg]hk]uhlMähU]rŅ hoXcorerÓ …rŌ }rÕ (hZjŠ h[jĪ ubaubahaj‰ubj|)rÖ }r× (hZUhc}rŲ (hi]hj]hh]hg]hk]uh[jĘ hU]haj‰ubj|)rŁ }rŚ (hZUhc}rŪ (hi]hj]hh]hg]hk]uh[jĘ hU]rÜ hĘ)rŻ }rŽ (hZUhc}rß (hĖX-hg]hh]hi]hj]hk]uh[jŁ hU]rą hĶ)rį }rā (hZUhc}rć (hi]hj]hh]hg]hk]uh[jŻ hU]hahŃubahahÉubahaj‰ubj|)rä }rå (hZUhc}rę (hi]hj]hh]hg]hk]uh[jĘ hU]rē h“)rč }ré (hZX1h[jä h\h_hah–hc}rź (hi]hj]hh]hg]hk]uhlMähU]rė hoX1…rģ }rķ (hZX1h[jč ubaubahaj‰ubj|)rī }rļ (hZUhc}rš (hi]hj]hh]hg]hk]uh[jĘ hU]rń h“)rņ }ró (hZX(Add (doesn't fail when run individually)rō h[jī h\h_hah–hc}rõ (hi]hj]hh]hg]hk]uhlMähU]rö hoX(Add (doesn't fail when run individually)r÷ …rų }rł (hZjō h[jņ ubaubahaj‰ubehaj®ubjw)rś }rū (hZUhc}rü (hi]hj]hh]hg]hk]uh[j hU]rż (j|)rž }r’ (hZUhc}r (hi]hj]hh]hg]hk]uh[jś hU]r h“)r }r (hZXcorer h[jž h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMęhU]r hoXcorer …r }r (hZj h[j ubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jś hU]haj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jś hU]r hĘ)r }r (hZUhc}r (hĖX-hg]hh]hi]hj]hk]uh[j hU]r hĶ)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j hU]hahŃubahahÉubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jś hU]r h“)r }r (hZX1h[j h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMęhU]r hoX1…r }r! (hZX1h[j ubaubahaj‰ubj|)r" }r# (hZUhc}r$ (hi]hj]hh]hg]hk]uh[jś hU]r% h“)r& }r' (hZX1Bitwise\_and (doesn't fail when run individually)h[j" h\h_hah–hc}r( (hi]hj]hh]hg]hk]uhlMęhU]r) hoX0Bitwise_and (doesn't fail when run individually)r* …r+ }r, (hZX1Bitwise\_and (doesn't fail when run individually)h[j& ubaubahaj‰ubehaj®ubjw)r- }r. (hZUhc}r/ (hi]hj]hh]hg]hk]uh[j hU]r0 (j|)r1 }r2 (hZUhc}r3 (hi]hj]hh]hg]hk]uh[j- hU]r4 h“)r5 }r6 (hZXimgprocr7 h[j1 h\h_hah–hc}r8 (hi]hj]hh]hg]hk]uhlMčhU]r9 hoXimgprocr: …r; }r< (hZj7 h[j5 ubaubahaj‰ubj|)r= }r> (hZUhc}r? (hi]hj]hh]hg]hk]uh[j- hU]r@ h“)rA }rB (hZX1h[j= h\h_hah–hc}rC (hi]hj]hh]hg]hk]uhlMčhU]rD hoX1…rE }rF (hZX1h[jA ubaubahaj‰ubj|)rG }rH (hZUhc}rI (hi]hj]hh]hg]hk]uh[j- hU]rJ h“)rK }rL (hZXImgproc\_momentsh[jG h\h_hah–hc}rM (hi]hj]hh]hg]hk]uhlMčhU]rN hoXImgproc_momentsrO …rP }rQ (hZXImgproc\_momentsh[jK ubaubahaj‰ubj|)rR }rS (hZUhc}rT (hi]hj]hh]hg]hk]uh[j- hU]rU h“)rV }rW (hZX1h[jR h\h_hah–hc}rX (hi]hj]hh]hg]hk]uhlMčhU]rY hoX1…rZ }r[ (hZX1h[jV ubaubahaj‰ubj|)r\ }r] (hZUhc}r^ (hi]hj]hh]hg]hk]uh[j- hU]r_ h“)r` }ra (hZXImgproc\_momentsh[j\ h\h_hah–hc}rb (hi]hj]hh]hg]hk]uhlMčhU]rc hoXImgproc_momentsrd …re }rf (hZXImgproc\_momentsh[j` ubaubahaj‰ubehaj®ubjw)rg }rh (hZUhc}ri (hi]hj]hh]hg]hk]uh[j hU]rj (j|)rk }rl (hZUhc}rm (hi]hj]hh]hg]hk]uh[jg hU]rn h“)ro }rp (hZXimgprocrq h[jk h\h_hah–hc}rr (hi]hj]hh]hg]hk]uhlMźhU]rs hoXimgprocrt …ru }rv (hZjq h[jo ubaubahaj‰ubj|)rw }rx (hZUhc}ry (hi]hj]hh]hg]hk]uh[jg hU]rz h“)r{ }r| (hZX1h[jw h\h_hah–hc}r} (hi]hj]hh]hg]hk]uhlMźhU]r~ hoX1…r }r€ (hZX1h[j{ ubaubahaj‰ubj|)r }r‚ (hZUhc}rƒ (hi]hj]hh]hg]hk]uh[jg hU]r„ h“)r… }r† (hZX8Filter 2D (one test does not fail when run individually)r‡ h[j h\h_hah–hc}rˆ (hi]hj]hh]hg]hk]uhlMźhU]r‰ hoX8Filter 2D (one test does not fail when run individually)rŠ …r‹ }rŒ (hZj‡ h[j… ubaubahaj‰ubj|)r }rŽ (hZUhc}r (hi]hj]hh]hg]hk]uh[jg hU]r h“)r‘ }r’ (hZX1h[j h\h_hah–hc}r“ (hi]hj]hh]hg]hk]uhlMźhU]r” hoX1…r• }r– (hZX1h[j‘ ubaubahaj‰ubj|)r— }r˜ (hZUhc}r™ (hi]hj]hh]hg]hk]uh[jg hU]rš h“)r› }rœ (hZX+Erode (does not fail when run individually)r h[j— h\h_hah–hc}rž (hi]hj]hh]hg]hk]uhlMźhU]rŸ hoX+Erode (does not fail when run individually)r  …r” }r¢ (hZj h[j› ubaubahaj‰ubehaj®ubjw)r£ }r¤ (hZUhc}r„ (hi]hj]hh]hg]hk]uh[j hU]r¦ (j|)r§ }rØ (hZUhc}r© (hi]hj]hh]hg]hk]uh[j£ hU]rŖ h“)r« }r¬ (hZXimgprocr­ h[j§ h\h_hah–hc}r® (hi]hj]hh]hg]hk]uhlMģhU]rÆ hoXimgprocr° …r± }r² (hZj­ h[j« ubaubahaj‰ubj|)r³ }r“ (hZUhc}rµ (hi]hj]hh]hg]hk]uh[j£ hU]haj‰ubj|)r¶ }r· (hZUhc}rø (hi]hj]hh]hg]hk]uh[j£ hU]haj‰ubj|)r¹ }rŗ (hZUhc}r» (hi]hj]hh]hg]hk]uh[j£ hU]r¼ h“)r½ }r¾ (hZX1h[j¹ h\h_hah–hc}ræ (hi]hj]hh]hg]hk]uhlMģhU]rĄ hoX1…rĮ }rĀ (hZX1h[j½ ubaubahaj‰ubj|)rĆ }rÄ (hZUhc}rÅ (hi]hj]hh]hg]hk]uh[j£ hU]rĘ h“)rĒ }rČ (hZX8Filter 2D (one test does not fail when run individually)rÉ h[jĆ h\h_hah–hc}rŹ (hi]hj]hh]hg]hk]uhlMģhU]rĖ hoX8Filter 2D (one test does not fail when run individually)rĢ …rĶ }rĪ (hZjÉ h[jĒ ubaubahaj‰ubehaj®ubjw)rĻ }rŠ (hZUhc}rŃ (hi]hj]hh]hg]hk]uh[j hU]rŅ (j|)rÓ }rŌ (hZUhc}rÕ (hi]hj]hh]hg]hk]uh[jĻ hU]rÖ h“)r× }rŲ (hZXimgprocrŁ h[jÓ h\h_hah–hc}rŚ (hi]hj]hh]hg]hk]uhlMīhU]rŪ hoXimgprocrÜ …rŻ }rŽ (hZjŁ h[j× ubaubahaj‰ubj|)rß }rą (hZUhc}rį (hi]hj]hh]hg]hk]uh[jĻ hU]rā h“)rć }rä (hZX1h[jß h\h_hah–hc}rå (hi]hj]hh]hg]hk]uhlMīhU]rę hoX1…rē }rč (hZX1h[jć ubaubahaj‰ubj|)ré }rź (hZUhc}rė (hi]hj]hh]hg]hk]uh[jĻ hU]rģ h“)rķ }rī (hZX<Corner Harris (Not the same tests fail when run individuallyrļ h[jé h\h_hah–hc}rš (hi]hj]hh]hg]hk]uhlMīhU]rń hoX<Corner Harris (Not the same tests fail when run individuallyrņ …ró }rō (hZjļ h[jķ ubaubahaj‰ubj|)rõ }rö (hZUhc}r÷ (hi]hj]hh]hg]hk]uh[jĻ hU]rų h“)rł }rś (hZX1h[jõ h\h_hah–hc}rū (hi]hj]hh]hg]hk]uhlMīhU]rü hoX1…rż }rž (hZX1h[jł ubaubahaj‰ubj|)r’ }r(hZUhc}r(hi]hj]hh]hg]hk]uh[jĻ hU]rh“)r}r(hZX3Corner Harris (does not fail when run individually)rh[j’ h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMīhU]rhoX3Corner Harris (does not fail when run individually)r…r }r (hZjh[jubaubahaj‰ubehaj®ubjw)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[j hU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]rh“)r}r(hZXimgprocrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMšhU]rhoXimgprocr…r}r(hZjh[jubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j hU]haj‰ubj|)r}r(hZUhc}r (hi]hj]hh]hg]hk]uh[j hU]r!hĘ)r"}r#(hZUhc}r$(hĖX-hg]hh]hi]hj]hk]uh[jhU]r%hĶ)r&}r'(hZUhc}r((hi]hj]hh]hg]hk]uh[j"hU]hahŃubahahÉubahaj‰ubj|)r)}r*(hZUhc}r+(hi]hj]hh]hg]hk]uh[j hU]r,h“)r-}r.(hZX2h[j)h\h_hah–hc}r/(hi]hj]hh]hg]hk]uhlMšhU]r0hoX2…r1}r2(hZX2h[j-ubaubahaj‰ubj|)r3}r4(hZUhc}r5(hi]hj]hh]hg]hk]uh[j hU]r6h“)r7}r8(hZX7CornerMinEigenVal (does not fail when run individually)r9h[j3h\h_hah–hc}r:(hi]hj]hh]hg]hk]uhlMšhU]r;hoX7CornerMinEigenVal (does not fail when run individually)r<…r=}r>(hZj9h[j7ubaubahaj‰ubehaj®ubjw)r?}r@(hZUhc}rA(hi]hj]hh]hg]hk]uh[j hU]rB(j|)rC}rD(hZUhc}rE(hi]hj]hh]hg]hk]uh[j?hU]rFh“)rG}rH(hZXvideoiorIh[jCh\h_hah–hc}rJ(hi]hj]hh]hg]hk]uhlMņhU]rKhoXvideoiorL…rM}rN(hZjIh[jGubaubahaj‰ubj|)rO}rP(hZUhc}rQ(hi]hj]hh]hg]hk]uh[j?hU]rRh“)rS}rT(hZX0h[jOh\h_hah–hc}rU(hi]hj]hh]hg]hk]uhlMņhU]rVhoX0…rW}rX(hZX0h[jSubaubahaj‰ubj|)rY}rZ(hZUhc}r[(hi]hj]hh]hg]hk]uh[j?hU]r\h“)r]}r^(hZX&videoio.Regression (GST Library Issue)r_h[jYh\h_hah–hc}r`(hi]hj]hh]hg]hk]uhlMņhU]rahoX&videoio.Regression (GST Library Issue)rb…rc}rd(hZj_h[j]ubaubahaj‰ubj|)re}rf(hZUhc}rg(hi]hj]hh]hg]hk]uh[j?hU]rhh“)ri}rj(hZX1h[jeh\h_hah–hc}rk(hi]hj]hh]hg]hk]uhlMņhU]rlhoX1…rm}rn(hZX1h[jiubaubahaj‰ubj|)ro}rp(hZUhc}rq(hi]hj]hh]hg]hk]uh[j?hU]rrh“)rs}rt(hZXGST library issue?ruh[joh\h_hah–hc}rv(hi]hj]hh]hg]hk]uhlMņhU]rwhoXGST library issue?rx…ry}rz(hZjuh[jsubaubahaj‰ubehaj®ubehajÆubehaj°ubaubeubhs)r{}r|(hZUh[hth\h_hahvhc}r}(hi]hj]hh]hg]r~h4ahk]rhauhlM÷hmhhU]r€(h{)r}r‚(hZXeNecessary steps to modify OpenCV framework to add more OpenCL Host side and DSP C66 optimized kernelsrƒh[j{h\h_hahhc}r„(hi]hj]hh]hg]hk]uhlM÷hmhhU]r…hoXeNecessary steps to modify OpenCV framework to add more OpenCL Host side and DSP C66 optimized kernelsr†…r‡}rˆ(hZjƒh[jubaubh“)r‰}rŠ(hZX(Primary purpose of this tutorial is to show how one can add TI DSP C66 optimized kernels to existing OpenCV framework. Necessary steps are described in below paragraphs, describing several already optimized kernels, and also how to add new and then recompile and deploy updated OpenCV in PLSDK 3.1. TI DSP specific OpenCL implementation is additional to few existing accelerators: Intel x86: SSE2/SSE4/AVX/AVX2 extensions; ARM: NEON; nVIDIA: CUDA; Generic OpenCL. Range of accelerated kernels via OpenCL is wide, e.g. OpenCV 3.10 baseline includes ~200 kernels encoded in OpenCL C. TI OpenCL (C66 core) follows 1.2 version of standard, and can execute baseline OpenCV OpenCL kernels (as-is!). But additional performance improvements can be achieved by using TI DSP OpenCL extensions (intrinsics and EDMAmgr).r‹h[j{h\h_hah–hc}rŒ(hi]hj]hh]hg]hk]uhlMłhmhhU]rhoX(Primary purpose of this tutorial is to show how one can add TI DSP C66 optimized kernels to existing OpenCV framework. Necessary steps are described in below paragraphs, describing several already optimized kernels, and also how to add new and then recompile and deploy updated OpenCV in PLSDK 3.1. TI DSP specific OpenCL implementation is additional to few existing accelerators: Intel x86: SSE2/SSE4/AVX/AVX2 extensions; ARM: NEON; nVIDIA: CUDA; Generic OpenCL. Range of accelerated kernels via OpenCL is wide, e.g. OpenCV 3.10 baseline includes ~200 kernels encoded in OpenCL C. TI OpenCL (C66 core) follows 1.2 version of standard, and can execute baseline OpenCV OpenCL kernels (as-is!). But additional performance improvements can be achieved by using TI DSP OpenCL extensions (intrinsics and EDMAmgr).rŽ…r}r(hZj‹h[j‰ubaubhs)r‘}r’(hZUh[j{h\h_hahvhc}r“(hi]hj]hh]hg]r”h5ahk]r•h auhlMhmhhU]r–(h{)r—}r˜(hZXSupported Platformsr™h[j‘h\h_hahhc}rš(hi]hj]hh]hg]hk]uhlMhmhhU]r›hoXSupported Platformsrœ…r}rž(hZj™h[j—ubaubh“)rŸ}r (hZXćSee `here `__ for a list of supported platforms and links to more information. OpenCL dispatch is available only on platforms with DSP C66 core, like AM5728 (2 C66 cores).h[j‘h\h_hah–hc}r”(hi]hj]hh]hg]hk]uhlM hmhhU]r¢(hoXSee r£…r¤}r„(hZXSee h[jŸubh™)r¦}r§(hZXA`here `__hc}rØ(UnameXherehX6Release_Specific_Supported_Platforms_and_Versions.htmlhg]hh]hi]hj]hk]uh[jŸhU]r©hoXhererŖ…r«}r¬(hZUh[j¦ubahah¢ubhoXž for a list of supported platforms and links to more information. OpenCL dispatch is available only on platforms with DSP C66 core, like AM5728 (2 C66 cores).r­…r®}rÆ(hZXž for a list of supported platforms and links to more information. OpenCL dispatch is available only on platforms with DSP C66 core, like AM5728 (2 C66 cores).h[jŸubeubeubhs)r°}r±(hZUh[j{h\h_hahvhc}r²(hi]hj]hh]hg]r³h>ahk]r“hauhlMhmhhU]rµ(h{)r¶}r·(hZXOpenCV OpenCL run-time setuprøh[j°h\h_hahhc}r¹(hi]hj]hh]hg]hk]uhlMhmhhU]rŗhoXOpenCV OpenCL run-time setupr»…r¼}r½(hZjøh[j¶ubaubh“)r¾}ræ(hZXūOpenCV and OpenCL are already included in PLSDK 3.10. OpenCV uses run-time compilation of OpenCL kernels, so first time kernel execution is dominated by kernel compilation (later they are cached either in memory or tmp filesystem) - please note that it may take several dozens of seconds on AM5728EVM. In order to enable OpenCL acceleration inside OpenCV, following environment variable need to be set (example applies to AM57xx): **export OPENCV\_OPENCL\_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'**h[j°h\h_hah–hc}rĄ(hi]hj]hh]hg]hk]uhlMhmhhU]rĮ(hoXÆOpenCV and OpenCL are already included in PLSDK 3.10. OpenCV uses run-time compilation of OpenCL kernels, so first time kernel execution is dominated by kernel compilation (later they are cached either in memory or tmp filesystem) - please note that it may take several dozens of seconds on AM5728EVM. In order to enable OpenCL acceleration inside OpenCV, following environment variable need to be set (example applies to AM57xx): rĀ…rĆ}rÄ(hZXÆOpenCV and OpenCL are already included in PLSDK 3.10. OpenCV uses run-time compilation of OpenCL kernels, so first time kernel execution is dominated by kernel compilation (later they are cached either in memory or tmp filesystem) - please note that it may take several dozens of seconds on AM5728EVM. In order to enable OpenCL acceleration inside OpenCV, following environment variable need to be set (example applies to AM57xx): h[j¾ubjģ)rÅ}rĘ(hZXL**export OPENCV\_OPENCL\_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'**hc}rĒ(hi]hj]hh]hg]hk]uh[j¾hU]rČhoXFexport OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP'rÉ…rŹ}rĖ(hZUh[jÅubahajōubeubhĘ)rĢ}rĶ(hZUh[j°h\h_hahÉhc}rĪ(hĖX-hg]hh]hi]hj]hk]uhlMhmhhU]rĻhĶ)rŠ}rŃ(hZXiFor additional information, please refer to: `OpenCL User Guide `__ h[jĢh\h_hahŃhc}rŅ(hi]hj]hh]hg]hk]uhlNhmhhU]rÓh“)rŌ}rÕ(hZXhFor additional information, please refer to: `OpenCL User Guide `__h[jŠh\h_hah–hc}rÖ(hi]hj]hh]hg]hk]uhlMhU]r×(hoX-For additional information, please refer to: rŲ…rŁ}rŚ(hZX-For additional information, please refer to: h[jŌubh™)rŪ}rÜ(hZX;`OpenCL User Guide `__hc}rŻ(UnameXOpenCL User GuidehX#Foundational_Components_OpenCL.htmlhg]hh]hi]hj]hk]uh[jŌhU]rŽhoXOpenCL User Guiderß…rą}rį(hZUh[jŪubahah¢ubeubaubaubeubhs)rā}rć(hZUh[j{h\h_hahvhc}rä(hi]hj]hh]hg]råh`__h[jųh\h_hahŃhc}rž(hi]hj]hh]hg]hk]uhlNhmhhU]r’h“)r}r(hZXnDevelopment setup need to be prepared based on `Building the Processor SDK `__h[jüh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlM%hU]r(hoX/Development setup need to be prepared based on r…r}r(hZX/Development setup need to be prepared based on h[jubh™)r}r(hZX?`Building the Processor SDK `__hc}r (UnameXBuilding the Processor SDKhXOverview_Building_the_SDK.htmlhg]hh]hi]hj]hk]uh[jhU]r hoXBuilding the Processor SDKr …r }r (hZUh[jubahah¢ubeubaubhĶ)r}r(hZXŠWhen needed, source code under the work directory (e.g., arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv/git) can be modified.h[jųh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZXŠWhen needed, source code under the work directory (e.g., arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv/git) can be modified.h[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlM'hU]rhoX‰When needed, source code under the work directory (e.g., arago-tmp-[toolchain]/work/am57xx_evm-linux-gnueabi/opencv/git) can be modified.r…r}r(hZXŠWhen needed, source code under the work directory (e.g., arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv/git) can be modified.h[jubaubaubhĶ)r}r(hZX<Forced compilation can be started, after code modification: h[jųh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r}r(hZX;Forced compilation can be started, after code modification:rh[jh\h_hah–hc}r (hi]hj]hh]hg]hk]uhlM*hU]r!hoX;Forced compilation can be started, after code modification:r"…r#}r$(hZjh[jubaubaubeubjI)r%}r&(hZX‹ ARAGO_BRAND=processor-sdk MACHINE=am57xx-evm bitbake opencv --force -c compile ARAGO_BRAND=processor-sdk MACHINE=am57xx-evm bitbake opencvh[jāh\h_hajLhc}r'(hehfhg]hh]hi]hj]hk]uhlM0hmhhU]r(hoX‹ ARAGO_BRAND=processor-sdk MACHINE=am57xx-evm bitbake opencv --force -c compile ARAGO_BRAND=processor-sdk MACHINE=am57xx-evm bitbake opencvr)…r*}r+(hZUh[j%ubaubhĘ)r,}r-(hZUh[jāh\h_hahÉhc}r.(hĖX-hg]hh]hi]hj]hk]uhlM1hmhhU]r/hĶ)r0}r1(hZXČTo install modified package (not all OpenCV ipk-s are changed), select updated packages in arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv//am57xx\_evm and install on target system using: h[j,h\h_hahŃhc}r2(hi]hj]hh]hg]hk]uhlNhmhhU]r3h“)r4}r5(hZXĒTo install modified package (not all OpenCV ipk-s are changed), select updated packages in arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv//am57xx\_evm and install on target system using:h[j0h\h_hah–hc}r6(hi]hj]hh]hg]hk]uhlM1hU]r7hoXÅTo install modified package (not all OpenCV ipk-s are changed), select updated packages in arago-tmp-[toolchain]/work/am57xx_evm-linux-gnueabi/opencv//am57xx_evm and install on target system using:r8…r9}r:(hZXĒTo install modified package (not all OpenCV ipk-s are changed), select updated packages in arago-tmp-[toolchain]/work/am57xx\_evm-linux-gnueabi/opencv//am57xx\_evm and install on target system using:h[j4ubaubaubaubjI)r;}r<(hZXKopkg install libopencv--r0.tisdk4_am57xx_evm.ipkh[jāh\h_hajLhc}r=(hehfhg]hh]hi]hj]hk]uhlM:hmhhU]r>hoXKopkg install libopencv--r0.tisdk4_am57xx_evm.ipkr?…r@}rA(hZUh[j;ubaubeubhs)rB}rC(hZUh[j{h\h_hahvhc}rD(hi]hj]hh]hg]rEh8ahk]rFh auhlM<hmhhU]rG(h{)rH}rI(hZXBOpenCV OpenCL related framework details: how to add new DSP kernelrJh[jBh\h_hahhc}rK(hi]hj]hh]hg]hk]uhlM<hmhhU]rLhoXBOpenCV OpenCL related framework details: how to add new DSP kernelrM…rN}rO(hZjJh[jHubaubh“)rP}rQ(hZXŒAddition of a new kernel includes two steps: addition of Host (A15) side modification, and new DSP kernel (to be described in next chapter).rRh[jBh\h_hah–hc}rS(hi]hj]hh]hg]hk]uhlM>hmhhU]rThoXŒAddition of a new kernel includes two steps: addition of Host (A15) side modification, and new DSP kernel (to be described in next chapter).rU…rV}rW(hZjRh[jPubaubhĘ)rX}rY(hZUh[jBh\h_hahÉhc}rZ(hĖX-hg]hh]hi]hj]hk]uhlMAhmhhU]r[(hĶ)r\}r](hZXßOpenCL dispatch is attempted with macro **CV\_OCL\_RUN\_()**, from top level function of specific OpenCV kernel. If OpenCV OpenCL dispatch fails, or some preconditions are not met, it falls back to Native C implementation).h[jXh\h_hahŃhc}r^(hi]hj]hh]hg]hk]uhlNhmhhU]r_h“)r`}ra(hZXßOpenCL dispatch is attempted with macro **CV\_OCL\_RUN\_()**, from top level function of specific OpenCV kernel. If OpenCV OpenCL dispatch fails, or some preconditions are not met, it falls back to Native C implementation).h[j\h\h_hah–hc}rb(hi]hj]hh]hg]hk]uhlMAhU]rc(hoX(OpenCL dispatch is attempted with macro rd…re}rf(hZX(OpenCL dispatch is attempted with macro h[j`ubjģ)rg}rh(hZX**CV\_OCL\_RUN\_()**hc}ri(hi]hj]hh]hg]hk]uh[j`hU]rjhoX CV_OCL_RUN_()rk…rl}rm(hZUh[jgubahajōubhoX£, from top level function of specific OpenCV kernel. If OpenCV OpenCL dispatch fails, or some preconditions are not met, it falls back to Native C implementation).rn…ro}rp(hZX£, from top level function of specific OpenCV kernel. If OpenCV OpenCL dispatch fails, or some preconditions are not met, it falls back to Native C implementation).h[j`ubeubaubhĶ)rq}rr(hZXņHost side OpenCL wrapper function are placed in modules/XYZ folder, in same file along with implementation for other architectures (e.g. Native C, SSE/AVX or Neon). Function can be identified with "ocl\_" prefix, e.g. ocl\_threshold() (modules/imgproc/src/threshold.cpp) or ocl\_apply (modules/video/src/bgfg\_gaussmix2.cpp). Inside this wrapper function, conditions for successful execution on DSP need to be met. This typically includes checking data types, number of channels, and/or image size.h[jXh\h_hahŃhc}rs(hi]hj]hh]hg]hk]uhlNhmhhU]rth“)ru}rv(hZXņHost side OpenCL wrapper function are placed in modules/XYZ folder, in same file along with implementation for other architectures (e.g. Native C, SSE/AVX or Neon). Function can be identified with "ocl\_" prefix, e.g. ocl\_threshold() (modules/imgproc/src/threshold.cpp) or ocl\_apply (modules/video/src/bgfg\_gaussmix2.cpp). Inside this wrapper function, conditions for successful execution on DSP need to be met. This typically includes checking data types, number of channels, and/or image size.h[jqh\h_hah–hc}rw(hi]hj]hh]hg]hk]uhlMEhU]rxhoXīHost side OpenCL wrapper function are placed in modules/XYZ folder, in same file along with implementation for other architectures (e.g. Native C, SSE/AVX or Neon). Function can be identified with "ocl_" prefix, e.g. ocl_threshold() (modules/imgproc/src/threshold.cpp) or ocl_apply (modules/video/src/bgfg_gaussmix2.cpp). Inside this wrapper function, conditions for successful execution on DSP need to be met. This typically includes checking data types, number of channels, and/or image size.ry…rz}r{(hZXņHost side OpenCL wrapper function are placed in modules/XYZ folder, in same file along with implementation for other architectures (e.g. Native C, SSE/AVX or Neon). Function can be identified with "ocl\_" prefix, e.g. ocl\_threshold() (modules/imgproc/src/threshold.cpp) or ocl\_apply (modules/video/src/bgfg\_gaussmix2.cpp). Inside this wrapper function, conditions for successful execution on DSP need to be met. This typically includes checking data types, number of channels, and/or image size.h[juubaubaubhĶ)r|}r}(hZX.At this point kernel build options can be set in run-time (compilation is always done before first kernel dispatch). They are provided as string in Kernel class member variable kdefs. In this way additional optimizations can be applied (e.g. skipping parts of code, or setting parameters as constants).h[jXh\h_hahŃhc}r~(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r€}r(hZX.At this point kernel build options can be set in run-time (compilation is always done before first kernel dispatch). They are provided as string in Kernel class member variable kdefs. In this way additional optimizations can be applied (e.g. skipping parts of code, or setting parameters as constants).r‚h[j|h\h_hah–hc}rƒ(hi]hj]hh]hg]hk]uhlMMhU]r„hoX.At this point kernel build options can be set in run-time (compilation is always done before first kernel dispatch). They are provided as string in Kernel class member variable kdefs. In this way additional optimizations can be applied (e.g. skipping parts of code, or setting parameters as constants).r……r†}r‡(hZj‚h[j€ubaubaubhĶ)rˆ}r‰(hZX,Kernel file name (where kernel is defined) is set in 2nd argument of kernel constructor, with "\_oclsrc" postfix: e.g. **ocl::imgproc::threshold\_oclsrc** - this means that kernel body is defined in "./opencl/threshold.cl" file. This operation is performed during configuration stage of OpenCV build.h[jXh\h_hahŃhc}rŠ(hi]hj]hh]hg]hk]uhlNhmhhU]r‹h“)rŒ}r(hZX,Kernel file name (where kernel is defined) is set in 2nd argument of kernel constructor, with "\_oclsrc" postfix: e.g. **ocl::imgproc::threshold\_oclsrc** - this means that kernel body is defined in "./opencl/threshold.cl" file. This operation is performed during configuration stage of OpenCV build.h[jˆh\h_hah–hc}rŽ(hi]hj]hh]hg]hk]uhlMRhU]r(hoXvKernel file name (where kernel is defined) is set in 2nd argument of kernel constructor, with "_oclsrc" postfix: e.g. r…r‘}r’(hZXwKernel file name (where kernel is defined) is set in 2nd argument of kernel constructor, with "\_oclsrc" postfix: e.g. h[jŒubjģ)r“}r”(hZX#**ocl::imgproc::threshold\_oclsrc**hc}r•(hi]hj]hh]hg]hk]uh[jŒhU]r–hoXocl::imgproc::threshold_oclsrcr—…r˜}r™(hZUh[j“ubahajōubhoX’ - this means that kernel body is defined in "./opencl/threshold.cl" file. This operation is performed during configuration stage of OpenCV build.rš…r›}rœ(hZX’ - this means that kernel body is defined in "./opencl/threshold.cl" file. This operation is performed during configuration stage of OpenCV build.h[jŒubeubaubhĶ)r}rž(hZX“Kernel execution is invoked via run() method (of Kernel class). All kernel arguments need to be passed before this method is invoked. This typically includes source and destination buffers, and any additional argument affecting kernel execution (scalars, temporary buffers allocated on the host side, etc.). Arguments (order, data types, etc) need to match kernel implementation. Global and local sizes used in invocation of kernel, are almost always vectors with 2 elements indicating 2D operation. Global size vector indicate total number of items to be processed, whereas local size vector indicate size of work group, i.e. number of elements (across both dimensions) in single task. In below examples, we set global size to {2,1} and local size to {1,1}, forcing creation of only two DSP tasks by OpenCL framework. In this way complete control is passed to the developer to kernel, and only ensuring that two tasks can be launched in parallel. h[jXh\h_hahŃhc}rŸ(hi]hj]hh]hg]hk]uhlNhmhhU]r h“)r”}r¢(hZX³Kernel execution is invoked via run() method (of Kernel class). All kernel arguments need to be passed before this method is invoked. This typically includes source and destination buffers, and any additional argument affecting kernel execution (scalars, temporary buffers allocated on the host side, etc.). Arguments (order, data types, etc) need to match kernel implementation. Global and local sizes used in invocation of kernel, are almost always vectors with 2 elements indicating 2D operation. Global size vector indicate total number of items to be processed, whereas local size vector indicate size of work group, i.e. number of elements (across both dimensions) in single task. In below examples, we set global size to {2,1} and local size to {1,1}, forcing creation of only two DSP tasks by OpenCL framework. In this way complete control is passed to the developer to kernel, and only ensuring that two tasks can be launched in parallel.r£h[jh\h_hah–hc}r¤(hi]hj]hh]hg]hk]uhlMWhU]r„hoX³Kernel execution is invoked via run() method (of Kernel class). All kernel arguments need to be passed before this method is invoked. This typically includes source and destination buffers, and any additional argument affecting kernel execution (scalars, temporary buffers allocated on the host side, etc.). Arguments (order, data types, etc) need to match kernel implementation. Global and local sizes used in invocation of kernel, are almost always vectors with 2 elements indicating 2D operation. Global size vector indicate total number of items to be processed, whereas local size vector indicate size of work group, i.e. number of elements (across both dimensions) in single task. In below examples, we set global size to {2,1} and local size to {1,1}, forcing creation of only two DSP tasks by OpenCL framework. In this way complete control is passed to the developer to kernel, and only ensuring that two tasks can be launched in parallel.r¦…r§}rØ(hZj£h[j”ubaubaubeubh“)r©}rŖ(hZX€As a reference you can look for ocl\_XYZ functions including preprocessor conditional #ifdef TIOPENCL (in modules/\*/src files).h[jBh\h_hah–hc}r«(hi]hj]hh]hg]hk]uhlMfhmhhU]r¬hoX~As a reference you can look for ocl_XYZ functions including preprocessor conditional #ifdef TIOPENCL (in modules/*/src files).r­…r®}rÆ(hZX€As a reference you can look for ocl\_XYZ functions including preprocessor conditional #ifdef TIOPENCL (in modules/\*/src files).h[j©ubaubeubhs)r°}r±(hZUh[j{h\h_hahvhc}r²(hi]hj]hh]hg]r³hGahk]r“hauhlMkhmhhU]rµ(h{)r¶}r·(hZX/Creating OpenCL C kernel optimized for C66 corerøh[j°h\h_hahhc}r¹(hi]hj]hh]hg]hk]uhlMkhmhhU]rŗhoX/Creating OpenCL C kernel optimized for C66 corer»…r¼}r½(hZjøh[j¶ubaubh“)r¾}ræ(hZXSDSP specific implementation of kernel body can be placed in existing XXX.cl or new YYY.cl file - both have to be placed in modules/ZZZ/src/opencl folder. No modification of top level CMake files are required (all .cl files present in ./opencl folder are included in compilaton). There are three options in adding new kernel implementation:rĄh[j°h\h_hah–hc}rĮ(hi]hj]hh]hg]hk]uhlMmhmhhU]rĀhoXSDSP specific implementation of kernel body can be placed in existing XXX.cl or new YYY.cl file - both have to be placed in modules/ZZZ/src/opencl folder. No modification of top level CMake files are required (all .cl files present in ./opencl folder are included in compilaton). There are three options in adding new kernel implementation:rĆ…rÄ}rÅ(hZjĄh[j¾ubaubhĘ)rĘ}rĒ(hZUh[j°h\h_hahÉhc}rČ(hĖX-hg]hh]hi]hj]hk]uhlMthmhhU]rÉhĶ)rŹ}rĖ(hZX³If we decide to use existing file and kernel name, we can use macro set in kernel build options (refer to previous paragraph) - example in: modules/video/src/bgfg\_gaussmix2.cpp: h[jĘh\h_hahŃhc}rĢ(hi]hj]hh]hg]hk]uhlNhmhhU]rĶh“)rĪ}rĻ(hZX²If we decide to use existing file and kernel name, we can use macro set in kernel build options (refer to previous paragraph) - example in: modules/video/src/bgfg\_gaussmix2.cpp:h[jŹh\h_hah–hc}rŠ(hi]hj]hh]hg]hk]uhlMthU]rŃhoX±If we decide to use existing file and kernel name, we can use macro set in kernel build options (refer to previous paragraph) - example in: modules/video/src/bgfg_gaussmix2.cpp:rŅ…rÓ}rŌ(hZX²If we decide to use existing file and kernel name, we can use macro set in kernel build options (refer to previous paragraph) - example in: modules/video/src/bgfg\_gaussmix2.cpp:h[jĪubaubaubaubjI)rÕ}rÖ(hZX ... String opts = format("-D CN=%d -D NMIXTURES=%d%s -DTIDSP_MOG2 -D SUBLINE_CACHE=%d", nchannels, nmixtures, bShadowDetectionĀ ? " -DSHADOW_DETECT"Ā : "", subline_cache); kernel_apply.create("mog2_kernel", ocl::video::bgfg_mog2_oclsrc, opts); ...h[j°h\h_hajLhc}r×(hehfhg]hh]hi]hj]hk]uhlM|hmhhU]rŲhoX ... String opts = format("-D CN=%d -D NMIXTURES=%d%s -DTIDSP_MOG2 -D SUBLINE_CACHE=%d", nchannels, nmixtures, bShadowDetectionĀ ? " -DSHADOW_DETECT"Ā : "", subline_cache); kernel_apply.create("mog2_kernel", ocl::video::bgfg_mog2_oclsrc, opts); ...rŁ…rŚ}rŪ(hZUh[jÕubaubh“)rÜ}rŻ(hZXgto select baseline or DSP specific implementation - example in: modules/video/src/opencl/bgfg\_mog2.cl:h[j°h\h_hah–hc}rŽ(hi]hj]hh]hg]hk]uhlMhmhhU]rßhoXfto select baseline or DSP specific implementation - example in: modules/video/src/opencl/bgfg_mog2.cl:rą…rį}rā(hZXgto select baseline or DSP specific implementation - example in: modules/video/src/opencl/bgfg\_mog2.cl:h[jÜubaubjI)rć}rä(hZX #ifdef TIDSP_MOG2 TI DSP specific implementation ... __kernel void mog2_kernel(__global const uchar* frame, int frame_step, int frame_offset, int frame_row, int frame_col, //uchar || uchar3 __global uchar* modesUsed, //uchar __global uchar* weight, //float __global uchar* mean, //T_MEAN=float || float4 __global uchar* variance, //float __global uchar* fgmask, const int fgmask_step, const int fgmask_offset, //uchar const float alphaT, const float alpha1, const float prune, const float c_Tb, const float c_TB, float c_Tg, const float c_varMin, //constants const float c_varMax, const float c_varInit, const float c_tau #ifdef SHADOW_DETECT , const uchar c_shadowVal #endif ) ... #else OPENCL generic implementation: ... __kernel void mog2_kernel(__global const uchar* frame, int frame_step, int frame_offset, int frame_row, int frame_col, //uchar || uchar3 __global uchar* modesUsed, //uchar __global uchar* weight, //float __global uchar* mean, //T_MEAN=float || float4 __global uchar* variance, //float __global uchar* fgmask, int fgmask_step, int fgmask_offset, //uchar float alphaT, float alpha1, float prune, float c_Tb, float c_TB, float c_Tg, float c_varMin, //constants float c_varMax, float c_varInit, float c_tau #ifdef SHADOW_DETECT , uchar c_shadowVal #endif ) ... #endifh[j°h\h_hajLhc}rå(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlM‚hmhhU]ręhoX #ifdef TIDSP_MOG2 TI DSP specific implementation ... __kernel void mog2_kernel(__global const uchar* frame, int frame_step, int frame_offset, int frame_row, int frame_col, //uchar || uchar3 __global uchar* modesUsed, //uchar __global uchar* weight, //float __global uchar* mean, //T_MEAN=float || float4 __global uchar* variance, //float __global uchar* fgmask, const int fgmask_step, const int fgmask_offset, //uchar const float alphaT, const float alpha1, const float prune, const float c_Tb, const float c_TB, float c_Tg, const float c_varMin, //constants const float c_varMax, const float c_varInit, const float c_tau #ifdef SHADOW_DETECT , const uchar c_shadowVal #endif ) ... #else OPENCL generic implementation: ... __kernel void mog2_kernel(__global const uchar* frame, int frame_step, int frame_offset, int frame_row, int frame_col, //uchar || uchar3 __global uchar* modesUsed, //uchar __global uchar* weight, //float __global uchar* mean, //T_MEAN=float || float4 __global uchar* variance, //float __global uchar* fgmask, int fgmask_step, int fgmask_offset, //uchar float alphaT, float alpha1, float prune, float c_Tb, float c_TB, float c_Tg, float c_varMin, //constants float c_varMax, float c_varInit, float c_tau #ifdef SHADOW_DETECT , uchar c_shadowVal #endif ) ... #endifr煁rč}ré(hZUh[jćubaubhĘ)rź}rė(hZUh[j°h\h_hahÉhc}rģ(hĖX-hg]hh]hi]hj]hk]uhlMØhmhhU]rķhĶ)rī}rļ(hZXmAnother option is to use different kernel name, and use it appropriately as mentioned in previous paragraph. h[jźh\h_hahŃhc}rš(hi]hj]hh]hg]hk]uhlNhmhhU]rńh“)rņ}ró(hZXlAnother option is to use different kernel name, and use it appropriately as mentioned in previous paragraph.rōh[jīh\h_hah–hc}rõ(hi]hj]hh]hg]hk]uhlMØhU]röhoXlAnother option is to use different kernel name, and use it appropriately as mentioned in previous paragraph.r÷…rų}rł(hZjōh[jņubaubaubaubjI)rś}rū(hZXy TI DSP specific implementation __attribute__((reqd_work_group_size(1,1,1))) __kernel void tidsp_morph_erode (__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows)h[j°h\h_hajLhc}rü(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlM«hmhhU]rżhoXy TI DSP specific implementation __attribute__((reqd_work_group_size(1,1,1))) __kernel void tidsp_morph_erode (__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows)rž…r’}r(hZUh[jśubaubjI)r}r(hZX] ... __attribute__((reqd_work_group_size(1,1,1))) __kernel void tidsp_morph_dilate (__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows)h[j°h\h_hajLhc}r(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlM³hmhhU]rhoX] ... __attribute__((reqd_work_group_size(1,1,1))) __kernel void tidsp_morph_dilate (__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows)r…r}r(hZUh[jubaubj±)r}r (hZUh[j°h\h_haj“hc}r (hi]hj]hh]hg]hk]uhlM»hmhhU]r j·)r }r (hZUjŗKh[jh\h_hahlhc}r(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubjI)r}r(hZXK OpenCL generic implementation __kernel void morph(__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows EXTRA_PARAMS)h[j°h\h_hajLhc}r(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlM½hmhhU]rhoXK OpenCL generic implementation __kernel void morph(__global const uchar * srcptr, int src_step, int src_offset, __global uchar * dstptr, int dst_step, int dst_offset, int src_offset_x, int src_offset_y, int cols, int rows, int src_whole_cols, int src_whole_rows EXTRA_PARAMS)r…r}r(hZUh[jubaubj±)r}r(hZUh[j°h\h_haj“hc}r(hi]hj]hh]hg]hk]uhlMÅhmhhU]rj·)r}r(hZUjŗKh[jh\h_hahlhc}r(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubhĘ)r}r(hZUh[j°h\h_hahÉhc}r(hĖX-hg]hh]hi]hj]hk]uhlMĒhmhhU]r hĶ)r!}r"(hZX­Third option is to create new file and use it in kernel constructor, with \_oclsrc postfix (as mentioned in previous paragraph), like used in modules/imgproc/src/smooth.cpp h[jh\h_hahŃhc}r#(hi]hj]hh]hg]hk]uhlNhmhhU]r$h“)r%}r&(hZX¬Third option is to create new file and use it in kernel constructor, with \_oclsrc postfix (as mentioned in previous paragraph), like used in modules/imgproc/src/smooth.cpph[j!h\h_hah–hc}r'(hi]hj]hh]hg]hk]uhlMĒhU]r(hoX«Third option is to create new file and use it in kernel constructor, with _oclsrc postfix (as mentioned in previous paragraph), like used in modules/imgproc/src/smooth.cppr)…r*}r+(hZX¬Third option is to create new file and use it in kernel constructor, with \_oclsrc postfix (as mentioned in previous paragraph), like used in modules/imgproc/src/smooth.cpph[j%ubaubaubaubjI)r,}r-(hZX TI DSP specific OpenCL implementation ... cv::String kname = format( "tidsp_gaussian" )Ā ; cv::String kdefs = format("-D T=%s -D T1=%s -D cn=%d", ocl::typeToStr(type), ocl::typeToStr(depth), cn)Ā ; ocl::Kernel k(kname.c_str(), ocl::imgproc::gauss_oclsrc, kdefs.c_str() ); ...h[j°h\h_hajLhc}r.(hehfhg]hh]hi]hj]hk]uhlMĻhmhhU]r/hoX TI DSP specific OpenCL implementation ... cv::String kname = format( "tidsp_gaussian" )Ā ; cv::String kdefs = format("-D T=%s -D T1=%s -D cn=%d", ocl::typeToStr(type), ocl::typeToStr(depth), cn)Ā ; ocl::Kernel k(kname.c_str(), ocl::imgproc::gauss_oclsrc, kdefs.c_str() ); ...r0…r1}r2(hZUh[j,ubaubh“)r3}r4(hZXnImplementation for this OpenCL kernel is provided in modules/imgproc/src/opencl/gauss.cl, which is a new file.r5h[j°h\h_hah–hc}r6(hi]hj]hh]hg]hk]uhlMŌhmhhU]r7hoXnImplementation for this OpenCL kernel is provided in modules/imgproc/src/opencl/gauss.cl, which is a new file.r8…r9}r:(hZj5h[j3ubaubh“)r;}r<(hZXHDSP kernels can use standard 1.2 OpenCL C and DSP specific extensions. OpenCL included in PLSDK 3.1 allows direct use of functions in edmamgr module. We can even use printf() in .cl files (developer does not need to bother with any additional hooks on Host side) which is very useful for development, debugging and benchmarking.r=h[j°h\h_hah–hc}r>(hi]hj]hh]hg]hk]uhlM×hmhhU]r?hoXHDSP kernels can use standard 1.2 OpenCL C and DSP specific extensions. OpenCL included in PLSDK 3.1 allows direct use of functions in edmamgr module. We can even use printf() in .cl files (developer does not need to bother with any additional hooks on Host side) which is very useful for development, debugging and benchmarking.r@…rA}rB(hZj=h[j;ubaubjI)rC}rD(hZX ... #ifdef TIDSP_OPENCL_VERBOSE clk_end = __clock(); printf ("TIDSP dilate clockdiff=%d\n", clk_end - clk_start); #endif ...h[j°h\h_hajLhc}rE(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlMŻhmhhU]rFhoX ... #ifdef TIDSP_OPENCL_VERBOSE clk_end = __clock(); printf ("TIDSP dilate clockdiff=%d\n", clk_end - clk_start); #endif ...rG…rH}rI(hZUh[jCubaubh“)rJ}rK(hZXOutput looks like:rLh[j°h\h_hah–hc}rM(hi]hj]hh]hg]hk]uhlMęhmhhU]rNhoXOutput looks like:rO…rP}rQ(hZjLh[jJubaubjI)rR}rS(hZXN [core 1] TIDSP dilate clockdiff=532646 [core 0] TIDSP dilate clockdiff=531362h[j°h\h_hajLhc}rT(hehfhg]hh]hi]hj]hk]uhlMģhmhhU]rUhoXN [core 1] TIDSP dilate clockdiff=532646 [core 0] TIDSP dilate clockdiff=531362rV…rW}rX(hZUh[jRubaubeubhs)rY}rZ(hZUh[j{h\h_hahvhc}r[(hi]hj]hh]hg]r\hMahk]r]h!auhlMļhmhhU]r^(h{)r_}r`(hZX?OpenCV OpenCL kernels implemented specifically for DSP C66 corerah[jYh\h_hahhc}rb(hi]hj]hh]hg]hk]uhlMļhmhhU]rchoX?OpenCV OpenCL kernels implemented specifically for DSP C66 corerd…re}rf(hZjah[j_ubaubh“)rg}rh(hZX—Coding in OpenCL C is very close to coding in Native DSP C (cl6x). Many platform specific details are automatically resolved with OpenCL tools (like memory map handling, header file inclusion, etc) and framework (loading, buffer transfer). OpenCV is based on run-time compilation of OpenCL kernels provided in source, and preprocessed and converted to header and CPP arrays during configure stage. But, it is also possible to use off-line compilation or link with Native DSP C libraries. TI DSP OpenCL supports 1.2 standard and several DSP extensions. In order to achieve maximum performance, majority of techniques applicable in DSP C are applicable in OpenCL C:rih[jYh\h_hah–hc}rj(hi]hj]hh]hg]hk]uhlMńhmhhU]rkhoX—Coding in OpenCL C is very close to coding in Native DSP C (cl6x). Many platform specific details are automatically resolved with OpenCL tools (like memory map handling, header file inclusion, etc) and framework (loading, buffer transfer). OpenCV is based on run-time compilation of OpenCL kernels provided in source, and preprocessed and converted to header and CPP arrays during configure stage. But, it is also possible to use off-line compilation or link with Native DSP C libraries. TI DSP OpenCL supports 1.2 standard and several DSP extensions. In order to achieve maximum performance, majority of techniques applicable in DSP C are applicable in OpenCL C:rl…rm}rn(hZjih[jgubaubhĘ)ro}rp(hZUh[jYh\h_hahÉhc}rq(hĖX-hg]hh]hi]hj]hk]uhlMühmhhU]rrhĶ)rs}rt(hZXDSP intrinsics. h[joh\h_hahŃhc}ru(hi]hj]hh]hg]hk]uhlNhmhhU]rvh“)rw}rx(hZXDSP intrinsics.ryh[jsh\h_hah–hc}rz(hi]hj]hh]hg]hk]uhlMühU]r{hoXDSP intrinsics.r|…r}}r~(hZjyh[jwubaubaubaubjI)r}r€(hZXØ ... /* Convert from 8bpp to 16bpp so we can do SIMD of rows \*/ r0_2 = _dmpyu4(as_uchar8(r0), as_uchar8(mask1_8)); /* 8-way unsigned 8-bit X 8-bit multiplication \*/ r1_2 = _dmpyu4(as_uchar8(r1), as_uchar8(mask2_8)); r2_2 = _dmpyu4(as_uchar8(r2), as_uchar8(mask1_8)); /* Add rows 0+1, column-wise \*/ r01_lo = _dadd2(as_long(r0_2.s0123), as_long(r1_2.s0123)); r01_hi = _dadd2(as_long(r0_2.s4567), as_long(r1_2.s4567)); ...h[jYh\h_hajLhc}r(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlMžhmhhU]r‚hoXØ ... /* Convert from 8bpp to 16bpp so we can do SIMD of rows \*/ r0_2 = _dmpyu4(as_uchar8(r0), as_uchar8(mask1_8)); /* 8-way unsigned 8-bit X 8-bit multiplication \*/ r1_2 = _dmpyu4(as_uchar8(r1), as_uchar8(mask2_8)); r2_2 = _dmpyu4(as_uchar8(r2), as_uchar8(mask1_8)); /* Add rows 0+1, column-wise \*/ r01_lo = _dadd2(as_long(r0_2.s0123), as_long(r1_2.s0123)); r01_hi = _dadd2(as_long(r0_2.s4567), as_long(r1_2.s4567)); ...rƒ…r„}r…(hZUh[jubaubhĘ)r†}r‡(hZUh[jYh\h_hahÉhc}rˆ(hĖX-hg]hh]hi]hj]hk]uhlM hmhhU]r‰hĶ)rŠ}r‹(hZXJMulti-DSP core operation - splitting work load by partitioning input data h[j†h\h_hahŃhc}rŒ(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)rŽ}r(hZXIMulti-DSP core operation - splitting work load by partitioning input datarh[jŠh\h_hah–hc}r‘(hi]hj]hh]hg]hk]uhlM hU]r’hoXIMulti-DSP core operation - splitting work load by partitioning input datar“…r”}r•(hZjh[jŽubaubaubaubjI)r–}r—(hZXTint gid = get_global_id(0); /* 1st dimension can be used to identify DSP core */h[jYh\h_hajLhc}r˜(j‘‰j’Xcpphehfhg]hh]hi]j“}hj]hk]uhlM hmhhU]r™hoXTint gid = get_global_id(0); /* 1st dimension can be used to identify DSP core */rš…r›}rœ(hZUh[j–ubaubhĘ)r}rž(hZUh[jYh\h_hahÉhc}rŸ(hĖX-hg]hh]hi]hj]hk]uhlMhmhhU]r hĶ)r”}r¢(hZX˜It is highly advisable to copy input data to L2 or even L1 memory. Use EDMA to parallelize data transfers (from DDR to/from L2) with DSP core execution h[jh\h_hahŃhc}r£(hi]hj]hh]hg]hk]uhlNhmhhU]r¤h“)r„}r¦(hZX—It is highly advisable to copy input data to L2 or even L1 memory. Use EDMA to parallelize data transfers (from DDR to/from L2) with DSP core executionr§h[j”h\h_hah–hc}rØ(hi]hj]hh]hg]hk]uhlMhU]r©hoX—It is highly advisable to copy input data to L2 or even L1 memory. Use EDMA to parallelize data transfers (from DDR to/from L2) with DSP core executionrŖ…r«}r¬(hZj§h[j„ubaubaubaubhs)r­}r®(hZUh[jYh\h_hahvhc}rÆ(hi]hj]hh]hg]r°h9ahk]r±h auhlMhmhhU]r²(h{)r³}r“(hZXEDMA transfer frameworkrµh[j­h\h_hahhc}r¶(hi]hj]hh]hg]hk]uhlMhmhhU]r·hoXEDMA transfer frameworkrø…r¹}rŗ(hZjµh[j³ubaubh“)r»}r¼(hZXøIt is essential that EDMA operates in parallel with DSP core operation, so that DSP core always have ready data to be processed. This can be accomplished with well known "ping-pong" scheme at input end. It is possible to implement similar method at output end of operation, but typically there are much fewer write operations. Several kernels include "EDMA image processing framework": it ensures that several consecutive image rows are transferred to L2 memory and ready to be processed by DSP core. In order to avoid redundant copies, an array of pointers to beginning of image rows is maintained. Main unit of operation is single image row. Only one image row is in-flight, both on input and output. Still, DSP processing (which is typical use case) may use multiple consecutive image rows. Examples of this framework can be found in: gauss.cl, sobel.cl, thresh.cl in tiopencv repository (http://git.ti.com/opencv/tiopencv/trees/tiopencvrelease_3.1)h[j­h\h_hah–hc}r½(hi]hj]hh]hg]hk]uhlMhmhhU]r¾(hoX|It is essential that EDMA operates in parallel with DSP core operation, so that DSP core always have ready data to be processed. This can be accomplished with well known "ping-pong" scheme at input end. It is possible to implement similar method at output end of operation, but typically there are much fewer write operations. Several kernels include "EDMA image processing framework": it ensures that several consecutive image rows are transferred to L2 memory and ready to be processed by DSP core. In order to avoid redundant copies, an array of pointers to beginning of image rows is maintained. Main unit of operation is single image row. Only one image row is in-flight, both on input and output. Still, DSP processing (which is typical use case) may use multiple consecutive image rows. Examples of this framework can be found in: gauss.cl, sobel.cl, thresh.cl in tiopencv repository (r慁rĄ}rĮ(hZX|It is essential that EDMA operates in parallel with DSP core operation, so that DSP core always have ready data to be processed. This can be accomplished with well known "ping-pong" scheme at input end. It is possible to implement similar method at output end of operation, but typically there are much fewer write operations. Several kernels include "EDMA image processing framework": it ensures that several consecutive image rows are transferred to L2 memory and ready to be processed by DSP core. In order to avoid redundant copies, an array of pointers to beginning of image rows is maintained. Main unit of operation is single image row. Only one image row is in-flight, both on input and output. Still, DSP processing (which is typical use case) may use multiple consecutive image rows. Examples of this framework can be found in: gauss.cl, sobel.cl, thresh.cl in tiopencv repository (h[j»ubh™)rĀ}rĆ(hZX;http://git.ti.com/opencv/tiopencv/trees/tiopencvrelease_3.1rÄhc}rÅ(UrefurijÄhg]hh]hi]hj]hk]uh[j»hU]rĘhoX;http://git.ti.com/opencv/tiopencv/trees/tiopencvrelease_3.1rĒ…rČ}rÉ(hZUh[jĀubahah¢ubhoX)…rŹ}rĖ(hZX)h[j»ubeubhĘ)rĢ}rĶ(hZUh[j­h\h_hahÉhc}rĪ(hĖX-hg]hh]hi]hj]hk]uhlM'hmhhU]rĻhĶ)rŠ}rŃ(hZX(Initialization: resetting L2 image rows h[jĢh\h_hahŃhc}rŅ(hi]hj]hh]hg]hk]uhlNhmhhU]rÓh“)rŌ}rÕ(hZX'Initialization: resetting L2 image rowsrÖh[jŠh\h_hah–hc}r×(hi]hj]hh]hg]hk]uhlM'hU]rŲhoX'Initialization: resetting L2 image rowsrŁ…rŚ}rŪ(hZjÖh[jŌubaubaubaubjI)rÜ}rŻ(hZXa for(i = 0; i < (LINES_CACHED + 1); i ++) { memset ((void \*)img_lines[i], 0, MAX_LINE_SIZE); }h[j­h\h_hajLhc}rŽ(hehfhg]hh]hi]hj]hk]uhlM-hmhhU]rßhoXa for(i = 0; i < (LINES_CACHED + 1); i ++) { memset ((void \*)img_lines[i], 0, MAX_LINE_SIZE); }rą…rį}rā(hZUh[jÜubaubhĘ)rć}rä(hZUh[j­h\h_hahÉhc}rå(hĖX-hg]hh]hi]hj]hk]uhlM0hmhhU]ręhĶ)rē}rč(hZX$Partitioning data between DSP cores h[jćh\h_hahŃhc}ré(hi]hj]hh]hg]hk]uhlNhmhhU]rźh“)rė}rģ(hZX#Partitioning data between DSP coresrķh[jēh\h_hah–hc}rī(hi]hj]hh]hg]hk]uhlM0hU]rļhoX#Partitioning data between DSP coresrš…rń}rņ(hZjķh[jėubaubaubaubjI)ró}rō(hZX| ... int gid = get_global_id(0); /* Identify DSP core: gid is set to 0 for 1st DSP core, and 1 for 2nd DSP core \*/ ...h[j­h\h_hajLhc}rõ(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlM2hmhhU]röhoX| ... int gid = get_global_id(0); /* Identify DSP core: gid is set to 0 for 1st DSP core, and 1 for 2nd DSP core \*/ ...r÷…rų}rł(hZUh[jóubaubjI)rś}rū(hZXŁ if(gid == 0) { /* Upper half of image \*/ for(i = 1; i < LINES_CACHED; i ++) { /* Use this, one time multiple 1D1D transfers, instead of one linked transfer, to allow for fast EDMA later \*/ EdmaMgr_copy1D1D(evIN, (void \*)(srcptr + (rows - 1 + i) * cols), (void \*)(img_lines[i]), cols); } fetch_rd_idx = cols; } else if(gid == 1) { /* Bottom half of image \*/ for(i = 0; i < LINES_CACHED; i ++) { /* Use this, one time multiple 1D1D transfers, instead of one linked transfer, to allow for fast EDMA later \*/ EdmaMgr_copy1D1D(evIN, (void \*)(srcptr + (rows - 1 + i) * cols), (void \*)(img_lines[i]), cols); } fetch_rd_idx = (rows + 1) * cols; dest_ptr += rows * cols; } else return; start_rd_idx = 0;h[j­h\h_hajLhc}rü(hehfhg]hh]hi]hj]hk]uhlM<hmhhU]rżhoXŁ if(gid == 0) { /* Upper half of image \*/ for(i = 1; i < LINES_CACHED; i ++) { /* Use this, one time multiple 1D1D transfers, instead of one linked transfer, to allow for fast EDMA later \*/ EdmaMgr_copy1D1D(evIN, (void \*)(srcptr + (rows - 1 + i) * cols), (void \*)(img_lines[i]), cols); } fetch_rd_idx = cols; } else if(gid == 1) { /* Bottom half of image \*/ for(i = 0; i < LINES_CACHED; i ++) { /* Use this, one time multiple 1D1D transfers, instead of one linked transfer, to allow for fast EDMA later \*/ EdmaMgr_copy1D1D(evIN, (void \*)(srcptr + (rows - 1 + i) * cols), (void \*)(img_lines[i]), cols); } fetch_rd_idx = (rows + 1) * cols; dest_ptr += rows * cols; } else return; start_rd_idx = 0;rž…r’}r(hZUh[jśubaubhĘ)r}r(hZUh[j­h\h_hahÉhc}r(hĖX-hg]hh]hi]hj]hk]uhlMLhmhhU]rhĶ)r}r(hZXMain image row loop h[jh\h_hahŃhc}r(hi]hj]hh]hg]hk]uhlNhmhhU]rh“)r }r (hZXMain image row loopr h[jh\h_hah–hc}r (hi]hj]hh]hg]hk]uhlMLhU]r hoXMain image row loopr…r}r(hZj h[j ubaubaubaubjI)r}r(hZXj for (int y = 0; y < rows; y ++) { EdmaMgr_wait(evIN); rd_idx = start_rd_idx; for(kk = 0; kk < LINES_CACHED; kk ++) { y_ptr[kk] = (uchar \*)img_lines[rd_idx]; rd_idx = (rd_idx + 1) & LINES_CACHED; } start_rd_idx = (start_rd_idx + 1) & LINES_CACHED; EdmaMgr_copyFast(evIN, (void*)(srcptr + fetch_rd_idx), (void*)(img_lines[rd_idx])); fetch_rd_idx += cols; /**********************************************************************************/ yprev_ptr = y_ptr[0]; ycurr_ptr = y_ptr[1]; ynext_ptr = y_ptr[2]; ... /* Access L2 data directly using yprev_ptr, ycurr_ptr, ynext_ptr... \*/h[j­h\h_hajLhc}r(hehfhg]hh]hi]hj]hk]uhlMRhmhhU]rhoXj for (int y = 0; y < rows; y ++) { EdmaMgr_wait(evIN); rd_idx = start_rd_idx; for(kk = 0; kk < LINES_CACHED; kk ++) { y_ptr[kk] = (uchar \*)img_lines[rd_idx]; rd_idx = (rd_idx + 1) & LINES_CACHED; } start_rd_idx = (start_rd_idx + 1) & LINES_CACHED; EdmaMgr_copyFast(evIN, (void*)(srcptr + fetch_rd_idx), (void*)(img_lines[rd_idx])); fetch_rd_idx += cols; /**********************************************************************************/ yprev_ptr = y_ptr[0]; ycurr_ptr = y_ptr[1]; ynext_ptr = y_ptr[2]; ... /* Access L2 data directly using yprev_ptr, ycurr_ptr, ynext_ptr... \*/r…r}r(hZUh[jubaubeubhs)r}r(hZUh[jYh\h_hahvhc}r(hi]hj]hh]hg]rh:ahk]rhauhlMehmhhU]r(h{)r}r(hZX7Additional information about C66 specific optimizationsr h[jh\h_hahhc}r!(hi]hj]hh]hg]hk]uhlMehmhhU]r"hoX7Additional information about C66 specific optimizationsr#…r$}r%(hZj h[jubaubjŹ)r&}r'(hZUh[jh\h_hajĶhc}r((jĻU.hg]hh]hi]jŠUhj]hk]jŃjŅuhlMghmhhU]r)(hĶ)r*}r+(hZXHC6000 Programmers guide: http://www.ti.com/lit/ug/spru198k/spru198k.pdf.h[j&h\h_hahŃhc}r,(hi]hj]hh]hg]hk]uhlNhmhhU]r-h“)r.}r/(hZXHC6000 Programmers guide: http://www.ti.com/lit/ug/spru198k/spru198k.pdf.h[j*h\h_hah–hc}r0(hi]hj]hh]hg]hk]uhlMghU]r1(hoXC6000 Programmers guide: r2…r3}r4(hZXC6000 Programmers guide: h[j.ubh™)r5}r6(hZX.http://www.ti.com/lit/ug/spru198k/spru198k.pdfr7hc}r8(Urefurij7hg]hh]hi]hj]hk]uh[j.hU]r9hoX.http://www.ti.com/lit/ug/spru198k/spru198k.pdfr:…r;}r<(hZUh[j5ubahah¢ubhoX.…r=}r>(hZX.h[j.ubeubaubhĶ)r?}r@(hZX—TMS320C6000 DSP Optimization Workshop Student Guide (6.1 MB) (pdf file): http://processors.wiki.ti.com/index.php/TMS320C6000_DSP_Optimization_Workshop,h[j&h\h_hahŃhc}rA(hi]hj]hh]hg]hk]uhlNhmhhU]rBh“)rC}rD(hZX—TMS320C6000 DSP Optimization Workshop Student Guide (6.1 MB) (pdf file): http://processors.wiki.ti.com/index.php/TMS320C6000_DSP_Optimization_Workshop,h[j?h\h_hah–hc}rE(hi]hj]hh]hg]hk]uhlMihU]rF(hoXITMS320C6000 DSP Optimization Workshop Student Guide (6.1 MB) (pdf file): rG…rH}rI(hZXITMS320C6000 DSP Optimization Workshop Student Guide (6.1 MB) (pdf file): h[jCubh™)rJ}rK(hZXMhttp://processors.wiki.ti.com/index.php/TMS320C6000_DSP_Optimization_WorkshoprLhc}rM(UrefurijLhg]hh]hi]hj]hk]uh[jChU]rNhoXMhttp://processors.wiki.ti.com/index.php/TMS320C6000_DSP_Optimization_WorkshoprO…rP}rQ(hZUh[jJubahah¢ubhoX,…rR}rS(hZX,h[jCubeubaubhĶ)rT}rU(hZXOTMS320C6000 Optimizing Compiler: http://www.ti.com/lit/ug/spru187u/spru187u.pdfh[j&h\h_hahŃhc}rV(hi]hj]hh]hg]hk]uhlNhmhhU]rWh“)rX}rY(hZXOTMS320C6000 Optimizing Compiler: http://www.ti.com/lit/ug/spru187u/spru187u.pdfh[jTh\h_hah–hc}rZ(hi]hj]hh]hg]hk]uhlMlhU]r[(hoX!TMS320C6000 Optimizing Compiler: r\…r]}r^(hZX!TMS320C6000 Optimizing Compiler: h[jXubh™)r_}r`(hZX.http://www.ti.com/lit/ug/spru187u/spru187u.pdfrahc}rb(Urefurijahg]hh]hi]hj]hk]uh[jXhU]rchoX.http://www.ti.com/lit/ug/spru187u/spru187u.pdfrd…re}rf(hZUh[j_ubahah¢ubeubaubhĶ)rg}rh(hZXMTMS320C66x CorePac User Guide: http://www.ti.com/lit/ug/sprugw0c/sprugw0c.pdfh[j&h\h_hahŃhc}ri(hi]hj]hh]hg]hk]uhlNhmhhU]rjh“)rk}rl(hZXMTMS320C66x CorePac User Guide: http://www.ti.com/lit/ug/sprugw0c/sprugw0c.pdfh[jgh\h_hah–hc}rm(hi]hj]hh]hg]hk]uhlMnhU]rn(hoXTMS320C66x CorePac User Guide: ro…rp}rq(hZXTMS320C66x CorePac User Guide: h[jkubh™)rr}rs(hZX.http://www.ti.com/lit/ug/sprugw0c/sprugw0c.pdfrthc}ru(Urefurijthg]hh]hi]hj]hk]uh[jkhU]rvhoX.http://www.ti.com/lit/ug/sprugw0c/sprugw0c.pdfrw…rx}ry(hZUh[jrubahah¢ubeubaubhĶ)rz}r{(hZXƒTMS320C66x DSP CPU and instruction set: https://training.ti.com/system/files/docs/c66x-corepac-instruction-set-reference-guide.pdf h[j&h\h_hahŃhc}r|(hi]hj]hh]hg]hk]uhlNhmhhU]r}h“)r~}r(hZX‚TMS320C66x DSP CPU and instruction set: https://training.ti.com/system/files/docs/c66x-corepac-instruction-set-reference-guide.pdfh[jzh\h_hah–hc}r€(hi]hj]hh]hg]hk]uhlMphU]r(hoX(TMS320C66x DSP CPU and instruction set: r‚…rƒ}r„(hZX(TMS320C66x DSP CPU and instruction set: h[j~ubh™)r…}r†(hZXZhttps://training.ti.com/system/files/docs/c66x-corepac-instruction-set-reference-guide.pdfr‡hc}rˆ(Urefurij‡hg]hh]hi]hj]hk]uh[j~hU]r‰hoXZhttps://training.ti.com/system/files/docs/c66x-corepac-instruction-set-reference-guide.pdfrŠ…r‹}rŒ(hZUh[j…ubahah¢ubeubaubeubeubeubhs)r}rŽ(hZUh[j{h\h_hahvhc}r(hi]hj]hh]hg]rhQahk]r‘h%auhlMuhmhhU]r’(h{)r“}r”(hZXgList of currently (PLSDK 3.1) DSP optimized OpenCV OpenCL kernels, using non-standard OpenCL extensionsr•h[jh\h_hahhc}r–(hi]hj]hh]hg]hk]uhlMuhmhhU]r—hoXgList of currently (PLSDK 3.1) DSP optimized OpenCV OpenCL kernels, using non-standard OpenCL extensionsr˜…r™}rš(hZj•h[j“ubaubhs)r›}rœ(hZUh[jh\h_hahvhc}r(hi]hj]hh]hg]ržhSahk]rŸh'auhlMyhmhhU]r (h{)r”}r¢(hZXOpenCL C C66 DSP kernelsr£h[j›h\h_hahhc}r¤(hi]hj]hh]hg]hk]uhlMyhmhhU]r„hoXOpenCL C C66 DSP kernelsr¦…r§}rØ(hZj£h[j”ubaubjY)r©}rŖ(hZUh[j›h\h_haj\hc}r«(hi]hj]hh]hg]hk]uhlNhmhhU]r¬j_)r­}r®(hZUhc}rÆ(hg]hh]hi]hj]hk]UcolsKuh[j©hU]r°(jd)r±}r²(hZUhc}r³(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjd)r“}rµ(hZUhc}r¶(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjd)r·}rø(hZUhc}r¹(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjd)rŗ}r»(hZUhc}r¼(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjd)r½}r¾(hZUhc}ræ(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjd)rĄ}rĮ(hZUhc}rĀ(hg]hh]hi]hj]hk]UcolwidthKuh[j­hU]hajhubjr)rĆ}rÄ(hZUhc}rÅ(hi]hj]hh]hg]hk]uh[j­hU]rĘjw)rĒ}rČ(hZUhc}rÉ(hi]hj]hh]hg]hk]uh[jĆhU]rŹ(j|)rĖ}rĢ(hZUhc}rĶ(hi]hj]hh]hg]hk]uh[jĒhU]rĪh“)rĻ}rŠ(hZX Kernel namerŃh[jĖh\h_hah–hc}rŅ(hi]hj]hh]hg]hk]uhlKhU]rÓhoX Kernel namerŌ…rÕ}rÖ(hZjŃh[jĻubaubahaj‰ubj|)r×}rŲ(hZUhc}rŁ(hi]hj]hh]hg]hk]uh[jĒhU]rŚh“)rŪ}rÜ(hZXData type - inputrŻh[j×h\h_hah–hc}rŽ(hi]hj]hh]hg]hk]uhlKhU]rßhoXData type - inputrą…rį}rā(hZjŻh[jŪubaubahaj‰ubj|)rć}rä(hZUhc}rå(hi]hj]hh]hg]hk]uh[jĒhU]ręh“)rē}rč(hZXData type - outputréh[jćh\h_hah–hc}rź(hi]hj]hh]hg]hk]uhlKhU]rėhoXData type - outputr셁rķ}rī(hZjéh[jēubaubahaj‰ubj|)rļ}rš(hZUhc}rń(hi]hj]hh]hg]hk]uh[jĒhU]rņh“)ró}rō(hZXHost side file (full path)rõh[jļh\h_hah–hc}rö(hi]hj]hh]hg]hk]uhlKhU]r÷hoXHost side file (full path)rų…rł}rś(hZjõh[jóubaubahaj‰ubj|)rū}rü(hZUhc}rż(hi]hj]hh]hg]hk]uh[jĒhU]ržh“)r’}r(hZX OpenCL C kernel file (full path)rh[jūh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX OpenCL C kernel file (full path)r…r}r(hZjh[j’ubaubahaj‰ubj|)r}r(hZUhc}r (hi]hj]hh]hg]hk]uh[jĒhU]r h“)r }r (hZXCommentsr h[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXCommentsr…r}r(hZj h[j ubaubahaj‰ubehaj®ubahajÆubj°)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[j­hU]r(jw)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]rh“)r}r (hZXeroder!h[jh\h_hah–hc}r"(hi]hj]hh]hg]hk]uhlKhU]r#hoXeroder$…r%}r&(hZj!h[jubaubahaj‰ubj|)r'}r((hZUhc}r)(hi]hj]hh]hg]hk]uh[jhU]r*h“)r+}r,(hZXuint8r-h[j'h\h_hah–hc}r.(hi]hj]hh]hg]hk]uhlKhU]r/hoXuint8r0…r1}r2(hZj-h[j+ubaubahaj‰ubj|)r3}r4(hZUhc}r5(hi]hj]hh]hg]hk]uh[jhU]r6h“)r7}r8(hZXuint8r9h[j3h\h_hah–hc}r:(hi]hj]hh]hg]hk]uhlKhU]r;hoXuint8r<…r=}r>(hZj9h[j7ubaubahaj‰ubj|)r?}r@(hZUhc}rA(hi]hj]hh]hg]hk]uh[jhU]rBh“)rC}rD(hZXmodules/imgproc/src/morph.cpprEh[j?h\h_hah–hc}rF(hi]hj]hh]hg]hk]uhlKhU]rGhoXmodules/imgproc/src/morph.cpprH…rI}rJ(hZjEh[jCubaubahaj‰ubj|)rK}rL(hZUhc}rM(hi]hj]hh]hg]hk]uh[jhU]rNh“)rO}rP(hZX#modules/imgproc/src/opencl/morph.clrQh[jKh\h_hah–hc}rR(hi]hj]hh]hg]hk]uhlKhU]rShoX#modules/imgproc/src/opencl/morph.clrT…rU}rV(hZjQh[jOubaubahaj‰ubj|)rW}rX(hZUhc}rY(hi]hj]hh]hg]hk]uh[jhU]haj‰ubehaj®ubjw)rZ}r[(hZUhc}r\(hi]hj]hh]hg]hk]uh[jhU]r](j|)r^}r_(hZUhc}r`(hi]hj]hh]hg]hk]uh[jZhU]rah“)rb}rc(hZXdilaterdh[j^h\h_hah–hc}re(hi]hj]hh]hg]hk]uhlKhU]rfhoXdilaterg…rh}ri(hZjdh[jbubaubahaj‰ubj|)rj}rk(hZUhc}rl(hi]hj]hh]hg]hk]uh[jZhU]rmh“)rn}ro(hZXuint8rph[jjh\h_hah–hc}rq(hi]hj]hh]hg]hk]uhlKhU]rrhoXuint8rs…rt}ru(hZjph[jnubaubahaj‰ubj|)rv}rw(hZUhc}rx(hi]hj]hh]hg]hk]uh[jZhU]ryh“)rz}r{(hZXuint8r|h[jvh\h_hah–hc}r}(hi]hj]hh]hg]hk]uhlKhU]r~hoXuint8r…r€}r(hZj|h[jzubaubahaj‰ubj|)r‚}rƒ(hZUhc}r„(hi]hj]hh]hg]hk]uh[jZhU]r…h“)r†}r‡(hZXmodules/imgproc/src/morph.cpprˆh[j‚h\h_hah–hc}r‰(hi]hj]hh]hg]hk]uhlKhU]rŠhoXmodules/imgproc/src/morph.cppr‹…rŒ}r(hZjˆh[j†ubaubahaj‰ubj|)rŽ}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jZhU]r‘h“)r’}r“(hZX#modules/imgproc/src/opencl/morph.clr”h[jŽh\h_hah–hc}r•(hi]hj]hh]hg]hk]uhlKhU]r–hoX#modules/imgproc/src/opencl/morph.clr—…r˜}r™(hZj”h[j’ubaubahaj‰ubj|)rš}r›(hZUhc}rœ(hi]hj]hh]hg]hk]uh[jZhU]haj‰ubehaj®ubjw)r}rž(hZUhc}rŸ(hi]hj]hh]hg]hk]uh[jhU]r (j|)r”}r¢(hZUhc}r£(hi]hj]hh]hg]hk]uh[jhU]r¤h“)r„}r¦(hZX SobelX/SobelYr§h[j”h\h_hah–hc}rØ(hi]hj]hh]hg]hk]uhlKhU]r©hoX SobelX/SobelYrŖ…r«}r¬(hZj§h[j„ubaubahaj‰ubj|)r­}r®(hZUhc}rÆ(hi]hj]hh]hg]hk]uh[jhU]r°h“)r±}r²(hZXuint8r³h[j­h\h_hah–hc}r“(hi]hj]hh]hg]hk]uhlKhU]rµhoXuint8r¶…r·}rø(hZj³h[j±ubaubahaj‰ubj|)r¹}rŗ(hZUhc}r»(hi]hj]hh]hg]hk]uh[jhU]r¼h“)r½}r¾(hZXint16ræh[j¹h\h_hah–hc}rĄ(hi]hj]hh]hg]hk]uhlKhU]rĮhoXint16rĀ…rĆ}rÄ(hZjæh[j½ubaubahaj‰ubj|)rÅ}rĘ(hZUhc}rĒ(hi]hj]hh]hg]hk]uh[jhU]rČh“)rÉ}rŹ(hZXmodules/imgproc/src/deriv.cpprĖh[jÅh\h_hah–hc}rĢ(hi]hj]hh]hg]hk]uhlKhU]rĶhoXmodules/imgproc/src/deriv.cpprĪ…rĻ}rŠ(hZjĖh[jÉubaubahaj‰ubj|)rŃ}rŅ(hZUhc}rÓ(hi]hj]hh]hg]hk]uh[jhU]rŌh“)rÕ}rÖ(hZX#modules/imgproc/src/opencl/sobel.clr×h[jŃh\h_hah–hc}rŲ(hi]hj]hh]hg]hk]uhlKhU]rŁhoX#modules/imgproc/src/opencl/sobel.clrŚ…rŪ}rÜ(hZj×h[jÕubaubahaj‰ubj|)rŻ}rŽ(hZUhc}rß(hi]hj]hh]hg]hk]uh[jhU]haj‰ubehaj®ubjw)rą}rį(hZUhc}rā(hi]hj]hh]hg]hk]uh[jhU]rć(j|)rä}rå(hZUhc}rę(hi]hj]hh]hg]hk]uh[jąhU]rēh“)rč}ré(hZX thresholdrźh[jäh\h_hah–hc}rė(hi]hj]hh]hg]hk]uhlKhU]rģhoX thresholdr텁rī}rļ(hZjźh[jčubaubahaj‰ubj|)rš}rń(hZUhc}rņ(hi]hj]hh]hg]hk]uh[jąhU]róh“)rō}rõ(hZXuint8röh[jšh\h_hah–hc}r÷(hi]hj]hh]hg]hk]uhlKhU]rųhoXuint8rł…rś}rū(hZjöh[jōubaubahaj‰ubj|)rü}rż(hZUhc}rž(hi]hj]hh]hg]hk]uh[jąhU]r’h“)r}r(hZXuint8rh[jüh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXuint8r…r}r(hZjh[jubaubahaj‰ubj|)r}r (hZUhc}r (hi]hj]hh]hg]hk]uh[jąhU]r h“)r }r (hZXmodules/imgproc/src/thresh.cpprh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXmodules/imgproc/src/thresh.cppr…r}r(hZjh[j ubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jąhU]rh“)r}r(hZX'modules/imgproc/src/opencl/threshold.clrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX'modules/imgproc/src/opencl/threshold.clr…r}r(hZjh[jubaubahaj‰ubj|)r }r!(hZUhc}r"(hi]hj]hh]hg]hk]uh[jąhU]haj‰ubehaj®ubjw)r#}r$(hZUhc}r%(hi]hj]hh]hg]hk]uh[jhU]r&(j|)r'}r((hZUhc}r)(hi]hj]hh]hg]hk]uh[j#hU]r*h“)r+}r,(hZXGaussBlur (3x3)r-h[j'h\h_hah–hc}r.(hi]hj]hh]hg]hk]uhlKhU]r/hoXGaussBlur (3x3)r0…r1}r2(hZj-h[j+ubaubahaj‰ubj|)r3}r4(hZUhc}r5(hi]hj]hh]hg]hk]uh[j#hU]r6h“)r7}r8(hZXuint8r9h[j3h\h_hah–hc}r:(hi]hj]hh]hg]hk]uhlKhU]r;hoXuint8r<…r=}r>(hZj9h[j7ubaubahaj‰ubj|)r?}r@(hZUhc}rA(hi]hj]hh]hg]hk]uh[j#hU]rBh“)rC}rD(hZXuint8rEh[j?h\h_hah–hc}rF(hi]hj]hh]hg]hk]uhlKhU]rGhoXuint8rH…rI}rJ(hZjEh[jCubaubahaj‰ubj|)rK}rL(hZUhc}rM(hi]hj]hh]hg]hk]uh[j#hU]rNh“)rO}rP(hZXmodules/imgproc/src/smooth.cpprQh[jKh\h_hah–hc}rR(hi]hj]hh]hg]hk]uhlKhU]rShoXmodules/imgproc/src/smooth.cpprT…rU}rV(hZjQh[jOubaubahaj‰ubj|)rW}rX(hZUhc}rY(hi]hj]hh]hg]hk]uh[j#hU]rZh“)r[}r\(hZX#modules/imgproc/src/opencl/gauss.clr]h[jWh\h_hah–hc}r^(hi]hj]hh]hg]hk]uhlKhU]r_hoX#modules/imgproc/src/opencl/gauss.clr`…ra}rb(hZj]h[j[ubaubahaj‰ubj|)rc}rd(hZUhc}re(hi]hj]hh]hg]hk]uh[j#hU]haj‰ubehaj®ubjw)rf}rg(hZUhc}rh(hi]hj]hh]hg]hk]uh[jhU]ri(j|)rj}rk(hZUhc}rl(hi]hj]hh]hg]hk]uh[jfhU]rmh“)rn}ro(hZXconvertScaleAbsrph[jjh\h_hah–hc}rq(hi]hj]hh]hg]hk]uhlKhU]rrhoXconvertScaleAbsrs…rt}ru(hZjph[jnubaubahaj‰ubj|)rv}rw(hZUhc}rx(hi]hj]hh]hg]hk]uh[jfhU]ryh“)rz}r{(hZXint16r|h[jvh\h_hah–hc}r}(hi]hj]hh]hg]hk]uhlKhU]r~hoXint16r…r€}r(hZj|h[jzubaubahaj‰ubj|)r‚}rƒ(hZUhc}r„(hi]hj]hh]hg]hk]uh[jfhU]r…h“)r†}r‡(hZXuint8rˆh[j‚h\h_hah–hc}r‰(hi]hj]hh]hg]hk]uhlKhU]rŠhoXuint8r‹…rŒ}r(hZjˆh[j†ubaubahaj‰ubj|)rŽ}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jfhU]r‘h“)r’}r“(hZXmodules/core/src/convert.cppr”h[jŽh\h_hah–hc}r•(hi]hj]hh]hg]hk]uhlKhU]r–hoXmodules/core/src/convert.cppr—…r˜}r™(hZj”h[j’ubaubahaj‰ubj|)rš}r›(hZUhc}rœ(hi]hj]hh]hg]hk]uh[jfhU]rh“)rž}rŸ(hZX&modules/core/src/opencl/tidsparithm.clr h[jšh\h_hah–hc}r”(hi]hj]hh]hg]hk]uhlKhU]r¢hoX&modules/core/src/opencl/tidsparithm.clr£…r¤}r„(hZj h[jžubaubahaj‰ubj|)r¦}r§(hZUhc}rØ(hi]hj]hh]hg]hk]uh[jfhU]r©h“)rŖ}r«(hZX!Additional optimizations possibler¬h[j¦h\h_hah–hc}r­(hi]hj]hh]hg]hk]uhlKhU]r®hoX!Additional optimizations possiblerÆ…r°}r±(hZj¬h[jŖubaubahaj‰ubehaj®ubjw)r²}r³(hZUhc}r“(hi]hj]hh]hg]hk]uh[jhU]rµ(j|)r¶}r·(hZUhc}rø(hi]hj]hh]hg]hk]uh[j²hU]r¹h“)rŗ}r»(hZXMOG2 (mixture of Gaussians)r¼h[j¶h\h_hah–hc}r½(hi]hj]hh]hg]hk]uhlKhU]r¾hoXMOG2 (mixture of Gaussians)r慁rĄ}rĮ(hZj¼h[jŗubaubahaj‰ubj|)rĀ}rĆ(hZUhc}rÄ(hi]hj]hh]hg]hk]uh[j²hU]rÅh“)rĘ}rĒ(hZXuint8 (float32 internal)rČh[jĀh\h_hah–hc}rÉ(hi]hj]hh]hg]hk]uhlKhU]rŹhoXuint8 (float32 internal)rĖ…rĢ}rĶ(hZjČh[jĘubaubahaj‰ubj|)rĪ}rĻ(hZUhc}rŠ(hi]hj]hh]hg]hk]uh[j²hU]rŃh“)rŅ}rÓ(hZXuint8 (float32 internal)rŌh[jĪh\h_hah–hc}rÕ(hi]hj]hh]hg]hk]uhlKhU]rÖhoXuint8 (float32 internal)r×…rŲ}rŁ(hZjŌh[jŅubaubahaj‰ubj|)rŚ}rŪ(hZUhc}rÜ(hi]hj]hh]hg]hk]uh[j²hU]rŻh“)rŽ}rß(hZX#modules/core/src/bgfg_gaussmix2.cpprąh[jŚh\h_hah–hc}rį(hi]hj]hh]hg]hk]uhlKhU]rāhoX#modules/core/src/bgfg_gaussmix2.cppr慁rä}rå(hZjąh[jŽubaubahaj‰ubj|)rę}rē(hZUhc}rč(hi]hj]hh]hg]hk]uh[j²hU]réh“)rź}rė(hZX$modules/core/src/opencl/bgfg_mog2.clrģh[jęh\h_hah–hc}rķ(hi]hj]hh]hg]hk]uhlKhU]rīhoX$modules/core/src/opencl/bgfg_mog2.clrrš}rń(hZjģh[jźubaubahaj‰ubj|)rņ}ró(hZUhc}rō(hi]hj]hh]hg]hk]uh[j²hU]rõh“)rö}r÷(hZX!Additional optimizations possiblerųh[jņh\h_hah–hc}rł(hi]hj]hh]hg]hk]uhlKhU]rśhoX!Additional optimizations possiblerū…rü}rż(hZjųh[jöubaubahaj‰ubehaj®ubehajÆubehaj°ubaubj±)rž}r’(hZUh[j›h\h_haj“hc}r(hi]hj]hh]hg]hk]uhlM‡hmhhU]rj·)r}r(hZUjŗKh[jžh\h_hahlhc}r(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubeubhs)r}r(hZUh[j{h\h_hahvhc}r(hi]hj]hh]hg]rhKahk]r hauhlM‹hmhhU]r (h{)r }r (hZXUProfiling results of DSP optimized OpenCV OpenCL kernels (PLSDK 3.1), AM5728 platformr h[jh\h_hahhc}r(hi]hj]hh]hg]hk]uhlM‹hmhhU]rhoXUProfiling results of DSP optimized OpenCV OpenCL kernels (PLSDK 3.1), AM5728 platformr…r}r(hZj h[j ubaubhs)r}r(hZUh[jh\h_hahvhc}r(hi]hj]hh]hg]rh;ahk]rhauhlMhmhhU]r(h{)r}r(hZX=**Single channel, 1200x709, barcode ROIĀ detection use case**rh[jh\h_hahhc}r(hi]hj]hh]hg]hk]uhlMhmhhU]rjģ)r}r(hZjhc}r (hi]hj]hh]hg]hk]uh[jhU]r!hoX9Single channel, 1200x709, barcode ROIĀ detection use caser"…r#}r$(hZUh[jubahajōubaubjY)r%}r&(hZUh[jh\h_haj\hc}r'(hi]hj]hh]hg]hk]uhlNhmhhU]r(j_)r)}r*(hZUhc}r+(hg]hh]hi]hj]hk]UcolsKuh[j%hU]r,(jd)r-}r.(hZUhc}r/(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjd)r0}r1(hZUhc}r2(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjd)r3}r4(hZUhc}r5(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjd)r6}r7(hZUhc}r8(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjd)r9}r:(hZUhc}r;(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjd)r<}r=(hZUhc}r>(hg]hh]hi]hj]hk]UcolwidthKuh[j)hU]hajhubjr)r?}r@(hZUhc}rA(hi]hj]hh]hg]hk]uh[j)hU]rBjw)rC}rD(hZUhc}rE(hi]hj]hh]hg]hk]uh[j?hU]rF(j|)rG}rH(hZUhc}rI(hi]hj]hh]hg]hk]uh[jChU]rJh“)rK}rL(hZX Kernel namerMh[jGh\h_hah–hc}rN(hi]hj]hh]hg]hk]uhlKhU]rOhoX Kernel namerP…rQ}rR(hZjMh[jKubaubahaj‰ubj|)rS}rT(hZUhc}rU(hi]hj]hh]hg]hk]uh[jChU]rVh“)rW}rX(hZX DSP optimized, cycles (per core)rYh[jSh\h_hah–hc}rZ(hi]hj]hh]hg]hk]uhlKhU]r[hoX DSP optimized, cycles (per core)r\…r]}r^(hZjYh[jWubaubahaj‰ubj|)r_}r`(hZUhc}ra(hi]hj]hh]hg]hk]uh[jChU]rbh“)rc}rd(hZXDSP baseline wall clockreh[j_h\h_hah–hc}rf(hi]hj]hh]hg]hk]uhlKhU]rghoXDSP baseline wall clockrh…ri}rj(hZjeh[jcubaubahaj‰ubj|)rk}rl(hZUhc}rm(hi]hj]hh]hg]hk]uh[jChU]rnh“)ro}rp(hZXDSP optimized wall clockrqh[jkh\h_hah–hc}rr(hi]hj]hh]hg]hk]uhlKhU]rshoXDSP optimized wall clockrt…ru}rv(hZjqh[joubaubahaj‰ubj|)rw}rx(hZUhc}ry(hi]hj]hh]hg]hk]uh[jChU]rzh“)r{}r|(hZXARM wall clockr}h[jwh\h_hah–hc}r~(hi]hj]hh]hg]hk]uhlKhU]rhoXARM wall clockr€…r}r‚(hZj}h[j{ubaubahaj‰ubj|)rƒ}r„(hZUhc}r…(hi]hj]hh]hg]hk]uh[jChU]r†h“)r‡}rˆ(hZXDSP/ARMr‰h[jƒh\h_hah–hc}rŠ(hi]hj]hh]hg]hk]uhlKhU]r‹hoXDSP/ARMrŒ…r}rŽ(hZj‰h[j‡ubaubahaj‰ubehaj®ubahajÆubj°)r}r(hZUhc}r‘(hi]hj]hh]hg]hk]uh[j)hU]r’(jw)r“}r”(hZUhc}r•(hi]hj]hh]hg]hk]uh[jhU]r–(j|)r—}r˜(hZUhc}r™(hi]hj]hh]hg]hk]uh[j“hU]ršh“)r›}rœ(hZXeroderh[j—h\h_hah–hc}rž(hi]hj]hh]hg]hk]uhlKhU]rŸhoXeroder …r”}r¢(hZjh[j›ubaubahaj‰ubj|)r£}r¤(hZUhc}r„(hi]hj]hh]hg]hk]uh[j“hU]r¦h“)r§}rØ(hZX883436r©h[j£h\h_hah–hc}rŖ(hi]hj]hh]hg]hk]uhlKhU]r«hoX883436r¬…r­}r®(hZj©h[j§ubaubahaj‰ubj|)rÆ}r°(hZUhc}r±(hi]hj]hh]hg]hk]uh[j“hU]r²h“)r³}r“(hZX288.10msrµh[jÆh\h_hah–hc}r¶(hi]hj]hh]hg]hk]uhlKhU]r·hoX288.10msrø…r¹}rŗ(hZjµh[j³ubaubahaj‰ubj|)r»}r¼(hZUhc}r½(hi]hj]hh]hg]hk]uh[j“hU]r¾h“)ræ}rĄ(hZX2.33msrĮh[j»h\h_hah–hc}rĀ(hi]hj]hh]hg]hk]uhlKhU]rĆhoX2.33msrÄ…rÅ}rĘ(hZjĮh[jæubaubahaj‰ubj|)rĒ}rČ(hZUhc}rÉ(hi]hj]hh]hg]hk]uh[j“hU]rŹh“)rĖ}rĢ(hZX13.65msrĶh[jĒh\h_hah–hc}rĪ(hi]hj]hh]hg]hk]uhlKhU]rĻhoX13.65msrŠ…rŃ}rŅ(hZjĶh[jĖubaubahaj‰ubj|)rÓ}rŌ(hZUhc}rÕ(hi]hj]hh]hg]hk]uh[j“hU]rÖh“)r×}rŲ(hZX5.8xrŁh[jÓh\h_hah–hc}rŚ(hi]hj]hh]hg]hk]uhlKhU]rŪhoX5.8xrÜ…rŻ}rŽ(hZjŁh[j×ubaubahaj‰ubehaj®ubjw)rß}rą(hZUhc}rį(hi]hj]hh]hg]hk]uh[jhU]rā(j|)rć}rä(hZUhc}rå(hi]hj]hh]hg]hk]uh[jßhU]ręh“)rē}rč(hZXdilateréh[jćh\h_hah–hc}rź(hi]hj]hh]hg]hk]uhlKhU]rėhoXdilater셁rķ}rī(hZjéh[jēubaubahaj‰ubj|)rļ}rš(hZUhc}rń(hi]hj]hh]hg]hk]uh[jßhU]rņh“)ró}rō(hZX893387rõh[jļh\h_hah–hc}rö(hi]hj]hh]hg]hk]uhlKhU]r÷hoX893387rų…rł}rś(hZjõh[jóubaubahaj‰ubj|)rū}rü(hZUhc}rż(hi]hj]hh]hg]hk]uh[jßhU]ržh“)r’}r(hZX 290.232msrh[jūh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX 290.232msr…r}r(hZjh[j’ubaubahaj‰ubj|)r}r(hZUhc}r (hi]hj]hh]hg]hk]uh[jßhU]r h“)r }r (hZX2.36msr h[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX2.36msr…r}r(hZj h[j ubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jßhU]rh“)r}r(hZX13.67msrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX13.67msr…r}r(hZjh[jubaubahaj‰ubj|)r}r (hZUhc}r!(hi]hj]hh]hg]hk]uh[jßhU]r"h“)r#}r$(hZX5.8xr%h[jh\h_hah–hc}r&(hi]hj]hh]hg]hk]uhlKhU]r'hoX5.8xr(…r)}r*(hZj%h[j#ubaubahaj‰ubehaj®ubjw)r+}r,(hZUhc}r-(hi]hj]hh]hg]hk]uh[jhU]r.(j|)r/}r0(hZUhc}r1(hi]hj]hh]hg]hk]uh[j+hU]r2h“)r3}r4(hZX SobelX/SobelYr5h[j/h\h_hah–hc}r6(hi]hj]hh]hg]hk]uhlKhU]r7hoX SobelX/SobelYr8…r9}r:(hZj5h[j3ubaubahaj‰ubj|)r;}r<(hZUhc}r=(hi]hj]hh]hg]hk]uh[j+hU]r>h“)r?}r@(hZX586885rAh[j;h\h_hah–hc}rB(hi]hj]hh]hg]hk]uhlKhU]rChoX586885rD…rE}rF(hZjAh[j?ubaubahaj‰ubj|)rG}rH(hZUhc}rI(hi]hj]hh]hg]hk]uh[j+hU]rJh“)rK}rL(hZX 232.450msrMh[jGh\h_hah–hc}rN(hi]hj]hh]hg]hk]uhlKhU]rOhoX 232.450msrP…rQ}rR(hZjMh[jKubaubahaj‰ubj|)rS}rT(hZUhc}rU(hi]hj]hh]hg]hk]uh[j+hU]rVh“)rW}rX(hZX1.58msrYh[jSh\h_hah–hc}rZ(hi]hj]hh]hg]hk]uhlKhU]r[hoX1.58msr\…r]}r^(hZjYh[jWubaubahaj‰ubj|)r_}r`(hZUhc}ra(hi]hj]hh]hg]hk]uh[j+hU]rbh“)rc}rd(hZX2.69msreh[j_h\h_hah–hc}rf(hi]hj]hh]hg]hk]uhlKhU]rghoX2.69msrh…ri}rj(hZjeh[jcubaubahaj‰ubj|)rk}rl(hZUhc}rm(hi]hj]hh]hg]hk]uh[j+hU]rnh“)ro}rp(hZX1.7xrqh[jkh\h_hah–hc}rr(hi]hj]hh]hg]hk]uhlKhU]rshoX1.7xrt…ru}rv(hZjqh[joubaubahaj‰ubehaj®ubjw)rw}rx(hZUhc}ry(hi]hj]hh]hg]hk]uh[jhU]rz(j|)r{}r|(hZUhc}r}(hi]hj]hh]hg]hk]uh[jwhU]r~h“)r}r€(hZX thresholdrh[j{h\h_hah–hc}r‚(hi]hj]hh]hg]hk]uhlKhU]rƒhoX thresholdr„…r…}r†(hZjh[jubaubahaj‰ubj|)r‡}rˆ(hZUhc}r‰(hi]hj]hh]hg]hk]uh[jwhU]rŠh“)r‹}rŒ(hZX676208rh[j‡h\h_hah–hc}rŽ(hi]hj]hh]hg]hk]uhlKhU]rhoX676208r…r‘}r’(hZjh[j‹ubaubahaj‰ubj|)r“}r”(hZUhc}r•(hi]hj]hh]hg]hk]uh[jwhU]r–h“)r—}r˜(hZX3.583msr™h[j“h\h_hah–hc}rš(hi]hj]hh]hg]hk]uhlKhU]r›hoX3.583msrœ…r}rž(hZj™h[j—ubaubahaj‰ubj|)rŸ}r (hZUhc}r”(hi]hj]hh]hg]hk]uh[jwhU]r¢h“)r£}r¤(hZX1.72msr„h[jŸh\h_hah–hc}r¦(hi]hj]hh]hg]hk]uhlKhU]r§hoX1.72msrØ…r©}rŖ(hZj„h[j£ubaubahaj‰ubj|)r«}r¬(hZUhc}r­(hi]hj]hh]hg]hk]uh[jwhU]r®h“)rÆ}r°(hZX 0.49288msr±h[j«h\h_hah–hc}r²(hi]hj]hh]hg]hk]uhlKhU]r³hoX 0.49288msr“…rµ}r¶(hZj±h[jÆubaubahaj‰ubj|)r·}rø(hZUhc}r¹(hi]hj]hh]hg]hk]uh[jwhU]rŗh“)r»}r¼(hZX0.3xr½h[j·h\h_hah–hc}r¾(hi]hj]hh]hg]hk]uhlKhU]ræhoX0.3xrĄ…rĮ}rĀ(hZj½h[j»ubaubahaj‰ubehaj®ubjw)rĆ}rÄ(hZUhc}rÅ(hi]hj]hh]hg]hk]uh[jhU]rĘ(j|)rĒ}rČ(hZUhc}rÉ(hi]hj]hh]hg]hk]uh[jĆhU]rŹh“)rĖ}rĢ(hZXGaussBlur (3x3)rĶh[jĒh\h_hah–hc}rĪ(hi]hj]hh]hg]hk]uhlKhU]rĻhoXGaussBlur (3x3)rŠ…rŃ}rŅ(hZjĶh[jĖubaubahaj‰ubj|)rÓ}rŌ(hZUhc}rÕ(hi]hj]hh]hg]hk]uh[jĆhU]rÖh“)r×}rŲ(hZX903159rŁh[jÓh\h_hah–hc}rŚ(hi]hj]hh]hg]hk]uhlKhU]rŪhoX903159rÜ…rŻ}rŽ(hZjŁh[j×ubaubahaj‰ubj|)rß}rą(hZUhc}rį(hi]hj]hh]hg]hk]uh[jĆhU]rāh“)rć}rä(hZX82.601msråh[jßh\h_hah–hc}rę(hi]hj]hh]hg]hk]uhlKhU]rēhoX82.601msr腁ré}rź(hZjåh[jćubaubahaj‰ubj|)rė}rģ(hZUhc}rķ(hi]hj]hh]hg]hk]uh[jĆhU]rīh“)rļ}rš(hZX2.036msrńh[jėh\h_hah–hc}rņ(hi]hj]hh]hg]hk]uhlKhU]róhoX2.036msrō…rõ}rö(hZjńh[jļubaubahaj‰ubj|)r÷}rų(hZUhc}rł(hi]hj]hh]hg]hk]uh[jĆhU]rśh“)rū}rü(hZX4.289msrżh[j÷h\h_hah–hc}rž(hi]hj]hh]hg]hk]uhlKhU]r’hoX4.289msr…r}r(hZjżh[jūubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jĆhU]rh“)r}r(hZX2.1xr h[jh\h_hah–hc}r (hi]hj]hh]hg]hk]uhlKhU]r hoX2.1xr …r }r(hZj h[jubaubahaj‰ubehaj®ubjw)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]rh“)r}r(hZXconvertScaleAbsrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXconvertScaleAbsr…r}r(hZjh[jubaubahaj‰ubj|)r}r (hZUhc}r!(hi]hj]hh]hg]hk]uh[jhU]r"h“)r#}r$(hZX725346r%h[jh\h_hah–hc}r&(hi]hj]hh]hg]hk]uhlKhU]r'hoX725346r(…r)}r*(hZj%h[j#ubaubahaj‰ubj|)r+}r,(hZUhc}r-(hi]hj]hh]hg]hk]uh[jhU]r.h“)r/}r0(hZX112.60msr1h[j+h\h_hah–hc}r2(hi]hj]hh]hg]hk]uhlKhU]r3hoX112.60msr4…r5}r6(hZj1h[j/ubaubahaj‰ubj|)r7}r8(hZUhc}r9(hi]hj]hh]hg]hk]uh[jhU]r:h“)r;}r<(hZX 1.73077msr=h[j7h\h_hah–hc}r>(hi]hj]hh]hg]hk]uhlKhU]r?hoX 1.73077msr@…rA}rB(hZj=h[j;ubaubahaj‰ubj|)rC}rD(hZUhc}rE(hi]hj]hh]hg]hk]uh[jhU]rFh“)rG}rH(hZX3.92msrIh[jCh\h_hah–hc}rJ(hi]hj]hh]hg]hk]uhlKhU]rKhoX3.92msrL…rM}rN(hZjIh[jGubaubahaj‰ubj|)rO}rP(hZUhc}rQ(hi]hj]hh]hg]hk]uh[jhU]rRh“)rS}rT(hZX2.3xrUh[jOh\h_hah–hc}rV(hi]hj]hh]hg]hk]uhlKhU]rWhoX2.3xrX…rY}rZ(hZjUh[jSubaubahaj‰ubehaj®ubehajÆubehaj°ubaubj±)r[}r\(hZUh[jh\h_haj“hc}r](hi]hj]hh]hg]hk]uhlMœhmhhU]r^j·)r_}r`(hZUjŗKh[j[h\h_hahlhc}ra(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubhs)rb}rc(hZUh[jh\h_hahvhc}rd(hi]hj]hh]hg]reh3ahk]rfhauhlM hmhhU]rg(h{)rh}ri(hZX=**Single channel, 1920x1080. barcode ROI detection use case**rjh[jbh\h_hahhc}rk(hi]hj]hh]hg]hk]uhlM hmhhU]rljģ)rm}rn(hZjjhc}ro(hi]hj]hh]hg]hk]uh[jhhU]rphoX9Single channel, 1920x1080. barcode ROI detection use caserq…rr}rs(hZUh[jmubahajōubaubjY)rt}ru(hZUh[jbh\h_haj\hc}rv(hi]hj]hh]hg]hk]uhlNhmhhU]rwj_)rx}ry(hZUhc}rz(hg]hh]hi]hj]hk]UcolsKuh[jthU]r{(jd)r|}r}(hZUhc}r~(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjd)r}r€(hZUhc}r(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjd)r‚}rƒ(hZUhc}r„(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjd)r…}r†(hZUhc}r‡(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjd)rˆ}r‰(hZUhc}rŠ(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjd)r‹}rŒ(hZUhc}r(hg]hh]hi]hj]hk]UcolwidthKuh[jxhU]hajhubjr)rŽ}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jxhU]r‘jw)r’}r“(hZUhc}r”(hi]hj]hh]hg]hk]uh[jŽhU]r•(j|)r–}r—(hZUhc}r˜(hi]hj]hh]hg]hk]uh[j’hU]r™h“)rš}r›(hZX Kernel namerœh[j–h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]ržhoX Kernel namerŸ…r }r”(hZjœh[jšubaubahaj‰ubj|)r¢}r£(hZUhc}r¤(hi]hj]hh]hg]hk]uh[j’hU]r„h“)r¦}r§(hZX DSP optimized, cycles (per core)rØh[j¢h\h_hah–hc}r©(hi]hj]hh]hg]hk]uhlKhU]rŖhoX DSP optimized, cycles (per core)r«…r¬}r­(hZjØh[j¦ubaubahaj‰ubj|)r®}rÆ(hZUhc}r°(hi]hj]hh]hg]hk]uh[j’hU]r±h“)r²}r³(hZXDSP baseline wall clockr“h[j®h\h_hah–hc}rµ(hi]hj]hh]hg]hk]uhlKhU]r¶hoXDSP baseline wall clockr·…rø}r¹(hZj“h[j²ubaubahaj‰ubj|)rŗ}r»(hZUhc}r¼(hi]hj]hh]hg]hk]uh[j’hU]r½h“)r¾}ræ(hZXDSP optimized wall clockrĄh[jŗh\h_hah–hc}rĮ(hi]hj]hh]hg]hk]uhlKhU]rĀhoXDSP optimized wall clockrĆ…rÄ}rÅ(hZjĄh[j¾ubaubahaj‰ubj|)rĘ}rĒ(hZUhc}rČ(hi]hj]hh]hg]hk]uh[j’hU]rÉh“)rŹ}rĖ(hZXARM wall clockrĢh[jĘh\h_hah–hc}rĶ(hi]hj]hh]hg]hk]uhlKhU]rĪhoXARM wall clockrĻ…rŠ}rŃ(hZjĢh[jŹubaubahaj‰ubj|)rŅ}rÓ(hZUhc}rŌ(hi]hj]hh]hg]hk]uh[j’hU]rÕh“)rÖ}r×(hZXDSP/ARMrŲh[jŅh\h_hah–hc}rŁ(hi]hj]hh]hg]hk]uhlKhU]rŚhoXDSP/ARMrŪ…rÜ}rŻ(hZjŲh[jÖubaubahaj‰ubehaj®ubahajÆubj°)rŽ}rß(hZUhc}rą(hi]hj]hh]hg]hk]uh[jxhU]rį(jw)rā}rć(hZUhc}rä(hi]hj]hh]hg]hk]uh[jŽhU]rå(j|)rę}rē(hZUhc}rč(hi]hj]hh]hg]hk]uh[jāhU]réh“)rź}rė(hZXeroderģh[jęh\h_hah–hc}rķ(hi]hj]hh]hg]hk]uhlKhU]rīhoXeroderrš}rń(hZjģh[jźubaubahaj‰ubj|)rņ}ró(hZUhc}rō(hi]hj]hh]hg]hk]uh[jāhU]rõh“)rö}r÷(hZX2016149rųh[jņh\h_hah–hc}rł(hi]hj]hh]hg]hk]uhlKhU]rśhoX2016149rū…rü}rż(hZjųh[jöubaubahaj‰ubj|)rž}r’(hZUhc}r(hi]hj]hh]hg]hk]uh[jāhU]rh“)r}r(hZX358.46msrh[jžh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX358.46msr…r}r (hZjh[jubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jāhU]r h“)r}r(hZX3.762msrh[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX3.762msr…r}r(hZjh[jubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jāhU]rh“)r}r(hZX 74.7736msrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX 74.7736msr…r }r!(hZjh[jubaubahaj‰ubj|)r"}r#(hZUhc}r$(hi]hj]hh]hg]hk]uh[jāhU]r%h“)r&}r'(hZX20.2xr(h[j"h\h_hah–hc}r)(hi]hj]hh]hg]hk]uhlKhU]r*hoX20.2xr+…r,}r-(hZj(h[j&ubaubahaj‰ubehaj®ubjw)r.}r/(hZUhc}r0(hi]hj]hh]hg]hk]uh[jŽhU]r1(j|)r2}r3(hZUhc}r4(hi]hj]hh]hg]hk]uh[j.hU]r5h“)r6}r7(hZXdilater8h[j2h\h_hah–hc}r9(hi]hj]hh]hg]hk]uhlKhU]r:hoXdilater;…r<}r=(hZj8h[j6ubaubahaj‰ubj|)r>}r?(hZUhc}r@(hi]hj]hh]hg]hk]uh[j.hU]rAh“)rB}rC(hZX2020188rDh[j>h\h_hah–hc}rE(hi]hj]hh]hg]hk]uhlKhU]rFhoX2020188rG…rH}rI(hZjDh[jBubaubahaj‰ubj|)rJ}rK(hZUhc}rL(hi]hj]hh]hg]hk]uh[j.hU]rMh“)rN}rO(hZX 348.255msrPh[jJh\h_hah–hc}rQ(hi]hj]hh]hg]hk]uhlKhU]rRhoX 348.255msrS…rT}rU(hZjPh[jNubaubahaj‰ubj|)rV}rW(hZUhc}rX(hi]hj]hh]hg]hk]uh[j.hU]rYh“)rZ}r[(hZX3.734msr\h[jVh\h_hah–hc}r](hi]hj]hh]hg]hk]uhlKhU]r^hoX3.734msr_…r`}ra(hZj\h[jZubaubahaj‰ubj|)rb}rc(hZUhc}rd(hi]hj]hh]hg]hk]uh[j.hU]reh“)rf}rg(hZX 68.1547msrhh[jbh\h_hah–hc}ri(hi]hj]hh]hg]hk]uhlKhU]rjhoX 68.1547msrk…rl}rm(hZjhh[jfubaubahaj‰ubj|)rn}ro(hZUhc}rp(hi]hj]hh]hg]hk]uh[j.hU]rqh“)rr}rs(hZX20.2xrth[jnh\h_hah–hc}ru(hi]hj]hh]hg]hk]uhlKhU]rvhoX20.2xrw…rx}ry(hZjth[jrubaubahaj‰ubehaj®ubjw)rz}r{(hZUhc}r|(hi]hj]hh]hg]hk]uh[jŽhU]r}(j|)r~}r(hZUhc}r€(hi]hj]hh]hg]hk]uh[jzhU]rh“)r‚}rƒ(hZX SobelX/SobelYr„h[j~h\h_hah–hc}r…(hi]hj]hh]hg]hk]uhlKhU]r†hoX SobelX/SobelYr‡…rˆ}r‰(hZj„h[j‚ubaubahaj‰ubj|)rŠ}r‹(hZUhc}rŒ(hi]hj]hh]hg]hk]uh[jzhU]rh“)rŽ}r(hZX1260833rh[jŠh\h_hah–hc}r‘(hi]hj]hh]hg]hk]uhlKhU]r’hoX1260833r“…r”}r•(hZjh[jŽubaubahaj‰ubj|)r–}r—(hZUhc}r˜(hi]hj]hh]hg]hk]uh[jzhU]r™h“)rš}r›(hZX281.58msrœh[j–h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]ržhoX281.58msrŸ…r }r”(hZjœh[jšubaubahaj‰ubj|)r¢}r£(hZUhc}r¤(hi]hj]hh]hg]hk]uh[jzhU]r„h“)r¦}r§(hZX2.38msrØh[j¢h\h_hah–hc}r©(hi]hj]hh]hg]hk]uhlKhU]rŖhoX2.38msr«…r¬}r­(hZjØh[j¦ubaubahaj‰ubj|)r®}rÆ(hZUhc}r°(hi]hj]hh]hg]hk]uh[jzhU]r±h“)r²}r³(hZX 13.3328msr“h[j®h\h_hah–hc}rµ(hi]hj]hh]hg]hk]uhlKhU]r¶hoX 13.3328msr·…rø}r¹(hZj“h[j²ubaubahaj‰ubj|)rŗ}r»(hZUhc}r¼(hi]hj]hh]hg]hk]uh[jzhU]r½h“)r¾}ræ(hZX5.6xrĄh[jŗh\h_hah–hc}rĮ(hi]hj]hh]hg]hk]uhlKhU]rĀhoX5.6xrĆ…rÄ}rÅ(hZjĄh[j¾ubaubahaj‰ubehaj®ubjw)rĘ}rĒ(hZUhc}rČ(hi]hj]hh]hg]hk]uh[jŽhU]rÉ(j|)rŹ}rĖ(hZUhc}rĢ(hi]hj]hh]hg]hk]uh[jĘhU]rĶh“)rĪ}rĻ(hZX thresholdrŠh[jŹh\h_hah–hc}rŃ(hi]hj]hh]hg]hk]uhlKhU]rŅhoX thresholdrÓ…rŌ}rÕ(hZjŠh[jĪubaubahaj‰ubj|)rÖ}r×(hZUhc}rŲ(hi]hj]hh]hg]hk]uh[jĘhU]rŁh“)rŚ}rŪ(hZX1535483rÜh[jÖh\h_hah–hc}rŻ(hi]hj]hh]hg]hk]uhlKhU]rŽhoX1535483rß…rą}rį(hZjÜh[jŚubaubahaj‰ubj|)rā}rć(hZUhc}rä(hi]hj]hh]hg]hk]uh[jĘhU]råh“)rę}rē(hZX6.311msrčh[jāh\h_hah–hc}ré(hi]hj]hh]hg]hk]uhlKhU]rźhoX6.311msr녁rģ}rķ(hZjčh[jęubaubahaj‰ubj|)rī}rļ(hZUhc}rš(hi]hj]hh]hg]hk]uh[jĘhU]rńh“)rņ}ró(hZX2.815msrōh[jīh\h_hah–hc}rõ(hi]hj]hh]hg]hk]uhlKhU]röhoX2.815msr÷…rų}rł(hZjōh[jņubaubahaj‰ubj|)rś}rū(hZUhc}rü(hi]hj]hh]hg]hk]uh[jĘhU]rżh“)rž}r’(hZX 1.08271msrh[jśh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX 1.08271msr…r}r(hZjh[jžubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jĘhU]r h“)r }r (hZX0.4xr h[jh\h_hah–hc}r (hi]hj]hh]hg]hk]uhlKhU]rhoX0.4xr…r}r(hZj h[j ubaubahaj‰ubehaj®ubjw)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jŽhU]r(j|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jhU]rh“)r}r(hZXGaussBlur (3x3)rh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXGaussBlur (3x3)r…r }r!(hZjh[jubaubahaj‰ubj|)r"}r#(hZUhc}r$(hi]hj]hh]hg]hk]uh[jhU]r%h“)r&}r'(hZX2092713r(h[j"h\h_hah–hc}r)(hi]hj]hh]hg]hk]uhlKhU]r*hoX2092713r+…r,}r-(hZj(h[j&ubaubahaj‰ubj|)r.}r/(hZUhc}r0(hi]hj]hh]hg]hk]uh[jhU]r1h“)r2}r3(hZX98.61msr4h[j.h\h_hah–hc}r5(hi]hj]hh]hg]hk]uhlKhU]r6hoX98.61msr7…r8}r9(hZj4h[j2ubaubahaj‰ubj|)r:}r;(hZUhc}r<(hi]hj]hh]hg]hk]uh[jhU]r=h“)r>}r?(hZX3.478msr@h[j:h\h_hah–hc}rA(hi]hj]hh]hg]hk]uhlKhU]rBhoX3.478msrC…rD}rE(hZj@h[j>ubaubahaj‰ubj|)rF}rG(hZUhc}rH(hi]hj]hh]hg]hk]uh[jhU]rIh“)rJ}rK(hZX 10.0458msrLh[jFh\h_hah–hc}rM(hi]hj]hh]hg]hk]uhlKhU]rNhoX 10.0458msrO…rP}rQ(hZjLh[jJubaubahaj‰ubj|)rR}rS(hZUhc}rT(hi]hj]hh]hg]hk]uh[jhU]rUh“)rV}rW(hZX2.9xrXh[jRh\h_hah–hc}rY(hi]hj]hh]hg]hk]uhlKhU]rZhoX2.9xr[…r\}r](hZjXh[jVubaubahaj‰ubehaj®ubjw)r^}r_(hZUhc}r`(hi]hj]hh]hg]hk]uh[jŽhU]ra(j|)rb}rc(hZUhc}rd(hi]hj]hh]hg]hk]uh[j^hU]reh“)rf}rg(hZXconvertScaleAbsrhh[jbh\h_hah–hc}ri(hi]hj]hh]hg]hk]uhlKhU]rjhoXconvertScaleAbsrk…rl}rm(hZjhh[jfubaubahaj‰ubj|)rn}ro(hZUhc}rp(hi]hj]hh]hg]hk]uh[j^hU]rqh“)rr}rs(hZX1646050rth[jnh\h_hah–hc}ru(hi]hj]hh]hg]hk]uhlKhU]rvhoX1646050rw…rx}ry(hZjth[jrubaubahaj‰ubj|)rz}r{(hZUhc}r|(hi]hj]hh]hg]hk]uh[j^hU]r}h“)r~}r(hZX 268.272msr€h[jzh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]r‚hoX 268.272msrƒ…r„}r…(hZj€h[j~ubaubahaj‰ubj|)r†}r‡(hZUhc}rˆ(hi]hj]hh]hg]hk]uh[j^hU]r‰h“)rŠ}r‹(hZX 3.13524msrŒh[j†h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rŽhoX 3.13524msr…r}r‘(hZjŒh[jŠubaubahaj‰ubj|)r’}r“(hZUhc}r”(hi]hj]hh]hg]hk]uh[j^hU]r•h“)r–}r—(hZX 5.77027msr˜h[j’h\h_hah–hc}r™(hi]hj]hh]hg]hk]uhlKhU]ršhoX 5.77027msr›…rœ}r(hZj˜h[j–ubaubahaj‰ubj|)rž}rŸ(hZUhc}r (hi]hj]hh]hg]hk]uh[j^hU]r”h“)r¢}r£(hZX1.8xr¤h[jžh\h_hah–hc}r„(hi]hj]hh]hg]hk]uhlKhU]r¦hoX1.8xr§…rØ}r©(hZj¤h[j¢ubaubahaj‰ubehaj®ubehajÆubehaj°ubaubj±)rŖ}r«(hZUh[jbh\h_haj“hc}r¬(hi]hj]hh]hg]hk]uhlM­hmhhU]r­j·)r®}rÆ(hZUjŗKh[jŖh\h_hahlhc}r°(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubhs)r±}r²(hZUh[jh\h_hahvhc}r³(hi]hj]hh]hg]r“hAahk]rµhauhlM±hmhhU]r¶(h{)r·}rø(hZX9**Single channel, 720x576, Gesture recognition use case**r¹h[j±h\h_hahhc}rŗ(hi]hj]hh]hg]hk]uhlM±hmhhU]r»jģ)r¼}r½(hZj¹hc}r¾(hi]hj]hh]hg]hk]uh[j·hU]ræhoX5Single channel, 720x576, Gesture recognition use caserĄ…rĮ}rĀ(hZUh[j¼ubahajōubaubjY)rĆ}rÄ(hZUh[j±h\h_haj\hc}rÅ(hi]hj]hh]hg]hk]uhlNhmhhU]rĘj_)rĒ}rČ(hZUhc}rÉ(hg]hh]hi]hj]hk]UcolsKuh[jĆhU]rŹ(jd)rĖ}rĢ(hZUhc}rĶ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjd)rĪ}rĻ(hZUhc}rŠ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjd)rŃ}rŅ(hZUhc}rÓ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjd)rŌ}rÕ(hZUhc}rÖ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjd)r×}rŲ(hZUhc}rŁ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjd)rŚ}rŪ(hZUhc}rÜ(hg]hh]hi]hj]hk]UcolwidthKuh[jĒhU]hajhubjr)rŻ}rŽ(hZUhc}rß(hi]hj]hh]hg]hk]uh[jĒhU]rąjw)rį}rā(hZUhc}rć(hi]hj]hh]hg]hk]uh[jŻhU]rä(j|)rå}rę(hZUhc}rē(hi]hj]hh]hg]hk]uh[jįhU]rčh“)ré}rź(hZX Kernel namerėh[jåh\h_hah–hc}rģ(hi]hj]hh]hg]hk]uhlKhU]rķhoX Kernel namerrļ}rš(hZjėh[jéubaubahaj‰ubj|)rń}rņ(hZUhc}ró(hi]hj]hh]hg]hk]uh[jįhU]rōh“)rõ}rö(hZX DSP optimized, cycles (per core)r÷h[jńh\h_hah–hc}rų(hi]hj]hh]hg]hk]uhlKhU]rłhoX DSP optimized, cycles (per core)rś…rū}rü(hZj÷h[jõubaubahaj‰ubj|)rż}rž(hZUhc}r’(hi]hj]hh]hg]hk]uh[jįhU]rh“)r}r(hZXDSP baseline wall clockrh[jżh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXDSP baseline wall clockr…r}r(hZjh[jubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jįhU]r h“)r }r(hZXDSP optimized wall clockrh[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXDSP optimized wall clockr…r}r(hZjh[j ubaubahaj‰ubj|)r}r(hZUhc}r(hi]hj]hh]hg]hk]uh[jįhU]rh“)r}r(hZXARM wall clockrh[jh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoXARM wall clockr…r}r (hZjh[jubaubahaj‰ubj|)r!}r"(hZUhc}r#(hi]hj]hh]hg]hk]uh[jįhU]r$h“)r%}r&(hZXDSP/ARMr'h[j!h\h_hah–hc}r((hi]hj]hh]hg]hk]uhlKhU]r)hoXDSP/ARMr*…r+}r,(hZj'h[j%ubaubahaj‰ubehaj®ubahajÆubj°)r-}r.(hZUhc}r/(hi]hj]hh]hg]hk]uh[jĒhU]r0(jw)r1}r2(hZUhc}r3(hi]hj]hh]hg]hk]uh[j-hU]r4(j|)r5}r6(hZUhc}r7(hi]hj]hh]hg]hk]uh[j1hU]r8h“)r9}r:(hZXeroder;h[j5h\h_hah–hc}r<(hi]hj]hh]hg]hk]uhlKhU]r=hoXeroder>…r?}r@(hZj;h[j9ubaubahaj‰ubj|)rA}rB(hZUhc}rC(hi]hj]hh]hg]hk]uh[j1hU]rDh“)rE}rF(hZX567719rGh[jAh\h_hah–hc}rH(hi]hj]hh]hg]hk]uhlKhU]rIhoX567719rJ…rK}rL(hZjGh[jEubaubahaj‰ubj|)rM}rN(hZUhc}rO(hi]hj]hh]hg]hk]uh[j1hU]rPh“)rQ}rR(hZX30.985msrSh[jMh\h_hah–hc}rT(hi]hj]hh]hg]hk]uhlKhU]rUhoX30.985msrV…rW}rX(hZjSh[jQubaubahaj‰ubj|)rY}rZ(hZUhc}r[(hi]hj]hh]hg]hk]uh[j1hU]r\h“)r]}r^(hZX1.707msr_h[jYh\h_hah–hc}r`(hi]hj]hh]hg]hk]uhlKhU]rahoX1.707msrb…rc}rd(hZj_h[j]ubaubahaj‰ubj|)re}rf(hZUhc}rg(hi]hj]hh]hg]hk]uh[j1hU]rhh“)ri}rj(hZX5.45msrkh[jeh\h_hah–hc}rl(hi]hj]hh]hg]hk]uhlKhU]rmhoX5.45msrn…ro}rp(hZjkh[jiubaubahaj‰ubj|)rq}rr(hZUhc}rs(hi]hj]hh]hg]hk]uh[j1hU]rth“)ru}rv(hZX3.2xrwh[jqh\h_hah–hc}rx(hi]hj]hh]hg]hk]uhlKhU]ryhoX3.2xrz…r{}r|(hZjwh[juubaubahaj‰ubehaj®ubjw)r}}r~(hZUhc}r(hi]hj]hh]hg]hk]uh[j-hU]r€(j|)r}r‚(hZUhc}rƒ(hi]hj]hh]hg]hk]uh[j}hU]r„h“)r…}r†(hZXdilater‡h[jh\h_hah–hc}rˆ(hi]hj]hh]hg]hk]uhlKhU]r‰hoXdilaterŠ…r‹}rŒ(hZj‡h[j…ubaubahaj‰ubj|)r}rŽ(hZUhc}r(hi]hj]hh]hg]hk]uh[j}hU]rh“)r‘}r’(hZX570094r“h[jh\h_hah–hc}r”(hi]hj]hh]hg]hk]uhlKhU]r•hoX570094r–…r—}r˜(hZj“h[j‘ubaubahaj‰ubj|)r™}rš(hZUhc}r›(hi]hj]hh]hg]hk]uh[j}hU]rœh“)r}rž(hZX31.035msrŸh[j™h\h_hah–hc}r (hi]hj]hh]hg]hk]uhlKhU]r”hoX31.035msr¢…r£}r¤(hZjŸh[jubaubahaj‰ubj|)r„}r¦(hZUhc}r§(hi]hj]hh]hg]hk]uh[j}hU]rØh“)r©}rŖ(hZX1.750msr«h[j„h\h_hah–hc}r¬(hi]hj]hh]hg]hk]uhlKhU]r­hoX1.750msr®…rÆ}r°(hZj«h[j©ubaubahaj‰ubj|)r±}r²(hZUhc}r³(hi]hj]hh]hg]hk]uh[j}hU]r“h“)rµ}r¶(hZX5.455msr·h[j±h\h_hah–hc}rø(hi]hj]hh]hg]hk]uhlKhU]r¹hoX5.455msrŗ…r»}r¼(hZj·h[jµubaubahaj‰ubj|)r½}r¾(hZUhc}ræ(hi]hj]hh]hg]hk]uh[j}hU]rĄh“)rĮ}rĀ(hZX3.2xrĆh[j½h\h_hah–hc}rÄ(hi]hj]hh]hg]hk]uhlKhU]rÅhoX3.2xrĘ…rĒ}rČ(hZjĆh[jĮubaubahaj‰ubehaj®ubjw)rÉ}rŹ(hZUhc}rĖ(hi]hj]hh]hg]hk]uh[j-hU]rĢ(j|)rĶ}rĪ(hZUhc}rĻ(hi]hj]hh]hg]hk]uh[jÉhU]rŠh“)rŃ}rŅ(hZXMOG2 (mixture of Gaussians)rÓh[jĶh\h_hah–hc}rŌ(hi]hj]hh]hg]hk]uhlKhU]rÕhoXMOG2 (mixture of Gaussians)rÖ…r×}rŲ(hZjÓh[jŃubaubahaj‰ubj|)rŁ}rŚ(hZUhc}rŪ(hi]hj]hh]hg]hk]uh[jÉhU]rÜh“)rŻ}rŽ(hZX40307446rßh[jŁh\h_hah–hc}rą(hi]hj]hh]hg]hk]uhlKhU]rįhoX40307446r⅁rć}rä(hZjßh[jŻubaubahaj‰ubj|)rå}rę(hZUhc}rē(hi]hj]hh]hg]hk]uh[jÉhU]rčh“)ré}rź(hZX 316.984msrėh[jåh\h_hah–hc}rģ(hi]hj]hh]hg]hk]uhlKhU]rķhoX 316.984msrrļ}rš(hZjėh[jéubaubahaj‰ubj|)rń}rņ(hZUhc}ró(hi]hj]hh]hg]hk]uh[jÉhU]rōh“)rõ}rö(hZX59.63msr÷h[jńh\h_hah–hc}rų(hi]hj]hh]hg]hk]uhlKhU]rłhoX59.63msrś…rū}rü(hZj÷h[jõubaubahaj‰ubj|)rż}rž(hZUhc}r’(hi]hj]hh]hg]hk]uh[jÉhU]rh“)r}r(hZX40.667msrh[jżh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX40.667msr…r}r(hZjh[jubaubahaj‰ubj|)r }r (hZUhc}r (hi]hj]hh]hg]hk]uh[jÉhU]r h“)r }r(hZX0.7xrh[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlKhU]rhoX0.7xr…r}r(hZjh[j ubaubahaj‰ubehaj®ubehajÆubehaj°ubaubj±)r}r(hZUh[j±h\h_haj“hc}r(hi]hj]hh]hg]hk]uhlM¼hmhhU]rj·)r}r(hZUjŗKh[jh\h_hahlhc}r(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubeubhs)r}r(hZUh[j{h\h_hahvhc}r(hi]hj]hh]hg]rhRahk]r h&auhlMĄhmhhU]r!(h{)r"}r#(hZXJAlternative approach to add new OpenCL kernels at OpenCV application levelr$h[jh\h_hahhc}r%(hi]hj]hh]hg]hk]uhlMĄhmhhU]r&hoXJAlternative approach to add new OpenCL kernels at OpenCV application levelr'…r(}r)(hZj$h[j"ubaubh“)r*}r+(hZXéInstead of adding OpenCL kernels into OpenCV framework, it is possible to do that directly from OpenCV application. This approach might be preferred if scope and reuse of work are limited. Primary benefit is more direct control of development (avoid OpenCV framework complexities) and reduced build time (only top level application and specific kernels need to be recompiled instead of doing Yocto builds). Building the application (below example is executed on target) is straightforward:r,h[jh\h_hah–hc}r-(hi]hj]hh]hg]hk]uhlMĀhmhhU]r.hoXéInstead of adding OpenCL kernels into OpenCV framework, it is possible to do that directly from OpenCV application. This approach might be preferred if scope and reuse of work are limited. Primary benefit is more direct control of development (avoid OpenCV framework complexities) and reduced build time (only top level application and specific kernels need to be recompiled instead of doing Yocto builds). Building the application (below example is executed on target) is straightforward:r/…r0}r1(hZj,h[j*ubaubjI)r2}r3(hZXŚg++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -g -c cvclapp-direct.cpp g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o cvclapp \ cvclapp.cpp \ cvclapp-direct.o \ -lrt \ -lopencv_core \ -lopencv_imgproc \ -lopencv_highgui \ -lopencv_ml \ -lopencv_video \ -lopencv_features2d \ -lopencv_calib3d \ -lopencv_objdetect \ -lopencv_imgcodecs \ -lOpenCL -locl_utilh[jh\h_hajLhc}r4(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlMŹhmhhU]r5hoXŚg++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -g -c cvclapp-direct.cpp g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o cvclapp \ cvclapp.cpp \ cvclapp-direct.o \ -lrt \ -lopencv_core \ -lopencv_imgproc \ -lopencv_highgui \ -lopencv_ml \ -lopencv_video \ -lopencv_features2d \ -lopencv_calib3d \ -lopencv_objdetect \ -lopencv_imgcodecs \ -lOpenCL -locl_utilr6…r7}r8(hZUh[j2ubaubh“)r9}r:(hZXkBelow two sections show how OpenCL kernels can be dispatched from OpenCV application in two different ways.r;h[jh\h_hah–hc}r<(hi]hj]hh]hg]hk]uhlMÜhmhhU]r=hoXkBelow two sections show how OpenCL kernels can be dispatched from OpenCV application in two different ways.r>…r?}r@(hZj;h[j9ubaubhs)rA}rB(hZUh[jh\h_hahvhc}rC(hi]hj]hh]hg]rDh=ahk]rEhauhlMįhmhhU]rF(h{)rG}rH(hZXTOpenCL kernel dispatch from OpenCV application, using existing OpenCV-OpenCL classesrIh[jAh\h_hahhc}rJ(hi]hj]hh]hg]hk]uhlMįhmhhU]rKhoXTOpenCL kernel dispatch from OpenCV application, using existing OpenCV-OpenCL classesrL…rM}rN(hZjIh[jGubaubh“)rO}rP(hZX‹OpenCV host side code, using OpenCV classes (defined in modules/core/src/ocl.cpp) to load and dispatch OpenCL kernels (online compilation).rQh[jAh\h_hah–hc}rR(hi]hj]hh]hg]hk]uhlMćhmhhU]rShoX‹OpenCV host side code, using OpenCV classes (defined in modules/core/src/ocl.cpp) to load and dispatch OpenCL kernels (online compilation).rT…rU}rV(hZjQh[jOubaubjI)rW}rX(hZX( #define __CL_ENABLE_EXCEPTIONS #include #include #include #include #include #include #include "ocl_util.h" #include #include #include #include using namespace std; using namespace cv; // This function is used for 2nd approach described in next section (standard OpenCL kernel dispatch) extern void ProcRawCL(Mat &mat_src, const string &kernel_name); int main() { if (!ocl::haveOpenCL()) { cout << "OpenCL is not avaiable..." << endl; return 0; } ocl::Context context; if (!context.create(ocl::Device::TYPE_ACCELERATOR)) { cout << "Failed creating the context..." << endl; return 0; } // Select the first device ocl::Device(context.device(0)); // Read the OpenCL kernel code into a string ifstream ifs("kernel_inv.cl"); if (ifs.fail()) return 0; std::string kernelSource((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); ocl::ProgramSource programSource(kernelSource); // Compile the kernel code cv::String errmsg; cv::String buildopt = "-DDBG_VERBOSE "; // We can set various clocl build options here, e.g. define-s to compile-in/out parts of CL code ocl::Program program = context.getProg(programSource, buildopt, errmsg); ocl::Kernel kernel("invert_img", program); // Transfer Mat data to the device Mat mat_src = imread("lena.png", IMREAD_GRAYSCALE); UMat umat_src = mat_src.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); cout << "Input image size: " << mat_src.size() << endl << flush; UMat umat_dst(mat_src.size(), mat_src.type(), ACCESS_WRITE, USAGE_ALLOCATE_DEVICE_MEMORY); kernel.args(ocl::KernelArg::ReadOnlyNoSize(umat_src), ocl::KernelArg::ReadWrite(umat_dst)); size_t globalThreads[2] = { (unsigned int)mat_src.cols, (unsigned int)mat_src.rows }; size_t localThreads[2] = { 16, 16 }; bool success = kernel.run(2, globalThreads, localThreads, false); if (!success){ cout << "Failed running the kernel..." << endl; return 0; } else { cout << "Kernel OK!" << endl; } GaussianBlur(umat_dst, umat_dst, Size(5, 5), 1.25); Canny(umat_dst, umat_dst, 0, 50); // Fetch the dst data from the device Mat mat_dst = umat_dst.getMat(ACCESS_READ); imwrite("out1.jpg", mat_dst); ProcRawCL(mat_src, "kernel_direct.cl"); // imshow("src", mat_src); // imshow("dst", mat_dst); // waitKey(); return 1; }h[jAh\h_hajLhc}rY(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlMēhmhhU]rZhoX( #define __CL_ENABLE_EXCEPTIONS #include #include #include #include #include #include #include "ocl_util.h" #include #include #include #include using namespace std; using namespace cv; // This function is used for 2nd approach described in next section (standard OpenCL kernel dispatch) extern void ProcRawCL(Mat &mat_src, const string &kernel_name); int main() { if (!ocl::haveOpenCL()) { cout << "OpenCL is not avaiable..." << endl; return 0; } ocl::Context context; if (!context.create(ocl::Device::TYPE_ACCELERATOR)) { cout << "Failed creating the context..." << endl; return 0; } // Select the first device ocl::Device(context.device(0)); // Read the OpenCL kernel code into a string ifstream ifs("kernel_inv.cl"); if (ifs.fail()) return 0; std::string kernelSource((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); ocl::ProgramSource programSource(kernelSource); // Compile the kernel code cv::String errmsg; cv::String buildopt = "-DDBG_VERBOSE "; // We can set various clocl build options here, e.g. define-s to compile-in/out parts of CL code ocl::Program program = context.getProg(programSource, buildopt, errmsg); ocl::Kernel kernel("invert_img", program); // Transfer Mat data to the device Mat mat_src = imread("lena.png", IMREAD_GRAYSCALE); UMat umat_src = mat_src.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); cout << "Input image size: " << mat_src.size() << endl << flush; UMat umat_dst(mat_src.size(), mat_src.type(), ACCESS_WRITE, USAGE_ALLOCATE_DEVICE_MEMORY); kernel.args(ocl::KernelArg::ReadOnlyNoSize(umat_src), ocl::KernelArg::ReadWrite(umat_dst)); size_t globalThreads[2] = { (unsigned int)mat_src.cols, (unsigned int)mat_src.rows }; size_t localThreads[2] = { 16, 16 }; bool success = kernel.run(2, globalThreads, localThreads, false); if (!success){ cout << "Failed running the kernel..." << endl; return 0; } else { cout << "Kernel OK!" << endl; } GaussianBlur(umat_dst, umat_dst, Size(5, 5), 1.25); Canny(umat_dst, umat_dst, 0, 50); // Fetch the dst data from the device Mat mat_dst = umat_dst.getMat(ACCESS_READ); imwrite("out1.jpg", mat_dst); ProcRawCL(mat_src, "kernel_direct.cl"); // imshow("src", mat_src); // imshow("dst", mat_dst); // waitKey(); return 1; }r[…r\}r](hZUh[jWubaubh“)r^}r_(hZXsThis is kernel\_inv.cl file with OpenCL kernels (executed on DSP). It is loaded and compiled by above host program.h[jAh\h_hah–hc}r`(hi]hj]hh]hg]hk]uhlM-hmhhU]rahoXrThis is kernel_inv.cl file with OpenCL kernels (executed on DSP). It is loaded and compiled by above host program.rb…rc}rd(hZXsThis is kernel\_inv.cl file with OpenCL kernels (executed on DSP). It is loaded and compiled by above host program.h[j^ubaubjI)re}rf(hZX+__kernel void invert_img(__global uchar* src, int src_step, int src_offset, __global uchar* dst, int dst_step, int dst_offset, int dst_rows, int dst_cols) { int x = get_global_id(0); int y = get_global_id(1); if (x >= dst_cols) return; int src_index = mad24(y, src_step, x + src_offset); int dst_index = mad24(y, dst_step, x + dst_offset); dst[dst_index] = 255 - src[src_index]; #ifdef DBG_VERBOSE if((x < 3) && ((y < 3) || (y >= (512 - 3)))) printf ("[x=%d][y=%d]\n", x, y); #endif }h[jAh\h_hajLhc}rg(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlM0hmhhU]rhhoX+__kernel void invert_img(__global uchar* src, int src_step, int src_offset, __global uchar* dst, int dst_step, int dst_offset, int dst_rows, int dst_cols) { int x = get_global_id(0); int y = get_global_id(1); if (x >= dst_cols) return; int src_index = mad24(y, src_step, x + src_offset); int dst_index = mad24(y, dst_step, x + dst_offset); dst[dst_index] = 255 - src[src_index]; #ifdef DBG_VERBOSE if((x < 3) && ((y < 3) || (y >= (512 - 3)))) printf ("[x=%d][y=%d]\n", x, y); #endif }ri…rj}rk(hZUh[jeubaubj±)rl}rm(hZUh[jAh\h_haj“hc}rn(hi]hj]hh]hg]hk]uhlMAhmhhU]roj·)rp}rq(hZUjŗKh[jlh\h_hahlhc}rr(hi]hj]hh]hg]hk]uhlKhmhhU]ubaubeubhs)rs}rt(hZUh[jh\h_hahvhc}ru(hi]hj]hh]hg]rvhHahk]rwhauhlMEhmhhU]rx(h{)ry}rz(hZXqOpenCL kernel dispatch from OpenCV application, using standard OpenCL dispatch with access to OpenCV data objectsr{h[jsh\h_hahhc}r|(hi]hj]hh]hg]hk]uhlMEhmhhU]r}hoXqOpenCL kernel dispatch from OpenCV application, using standard OpenCL dispatch with access to OpenCV data objectsr~…r}r€(hZj{h[jyubaubh“)r}r‚(hZX This example shows how to use CMEM memory directly accessible by DSP. OpenCV Mat data structures are created to store data in CMEM, thus avoid buffer copy. For more information refer to http://downloads.ti.com/mctools/esd/docs/opencl/memory/host-malloc-extension.html .h[jsh\h_hah–hc}rƒ(hi]hj]hh]hg]hk]uhlMGhmhhU]r„(hoXŗThis example shows how to use CMEM memory directly accessible by DSP. OpenCV Mat data structures are created to store data in CMEM, thus avoid buffer copy. For more information refer to r……r†}r‡(hZXŗThis example shows how to use CMEM memory directly accessible by DSP. OpenCV Mat data structures are created to store data in CMEM, thus avoid buffer copy. For more information refer to h[jubh™)rˆ}r‰(hZXQhttp://downloads.ti.com/mctools/esd/docs/opencl/memory/host-malloc-extension.htmlrŠhc}r‹(UrefurijŠhg]hh]hi]hj]hk]uh[jhU]rŒhoXQhttp://downloads.ti.com/mctools/esd/docs/opencl/memory/host-malloc-extension.htmlr…rŽ}r(hZUh[jˆubahah¢ubhoX .r…r‘}r’(hZX .h[jubeubjI)r“}r”(hZXj #define __CL_ENABLE_EXCEPTIONS #include #include #include #include #include #include #include "ocl_util.h" #include #include #include #include using namespace std; using namespace cv; using namespace cl; const int NumElements = 512*512; // image size const int NumWorkGroups = 256; const int VectorElements = 4; const int NumVecElements = NumElements / VectorElements; const int WorkGroupSize = NumVecElements / NumWorkGroups; void ProcRawCL(Mat &mat_src, const std::string &kernel_name) { //=============================================================== // Allocates memory in CMEM, directly accessible by both DSP and A15. // This avoids buffer copying. // Create three Mat data objects using pre-allocated CMEM memory int bufsize = mat_src.rows * mat_src.cols; void *ptr_cmem1 = __malloc_ddr(bufsize); void *ptr_cmem2 = __malloc_ddr(bufsize); void *ptr_cmem3 = __malloc_ddr(bufsize); Mat test_mat1(mat_src.size(), CV_8UC1, ptr_cmem1); Mat test_mat2(mat_src.size(), CV_8UC1, ptr_cmem2); Mat test_mat3(mat_src.size(), CV_8UC1, ptr_cmem3); mat_src.copyTo(test_mat1); threshold(test_mat1, test_mat2, 128.0, 192.0, THRESH_BINARY); imwrite("out_cmem1.jpg", test_mat2); //---- mat_src.copyTo(test_mat3); try { Context context(CL_DEVICE_TYPE_ACCELERATOR); std::vector devices = context.getInfo(); int d = 0; std::string str; ifstream t(kernel_name); std::string kernelStr((istreambuf_iterator(t)), istreambuf_iterator()); devices[d].getInfo(CL_DEVICE_NAME, &str); cout << "DEVICE: " << str << endl << endl; Program::Sources source(1, std::make_pair(kernelStr.c_str(), kernelStr.length())); Program program = Program(context, source); program.build(devices); Kernel kernel(program, "maskVector"); Buffer bufA (context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, bufsize, ptr_cmem2); Buffer bufDst (context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, bufsize, ptr_cmem1); kernel.setArg(0, bufA); kernel.setArg(1, bufDst); Event ev1; CommandQueue Q(context, devices[d], CL_QUEUE_PROFILING_ENABLE); Q.enqueueNDRangeKernel(kernel, NullRange, NDRange(NumVecElements), NDRange(WorkGroupSize), NULL, &ev1); ev1.wait(); ocl_event_times(ev1, "Kernel Exec"); imwrite("out_cmem2.jpg", test_mat1); } catch (cl::Error err) { cerr << "ERROR: " << err.what() << "(" << err.err() << ", " << ocl_decode_error(err.err()) << ")" << endl; } //---- __free_ddr(ptr_cmem1); __free_ddr(ptr_cmem2); __free_ddr(ptr_cmem3); //=============================================================== }h[jsh\h_hajLhc}r•(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlMMhmhhU]r–hoXj #define __CL_ENABLE_EXCEPTIONS #include #include #include #include #include #include #include "ocl_util.h" #include #include #include #include using namespace std; using namespace cv; using namespace cl; const int NumElements = 512*512; // image size const int NumWorkGroups = 256; const int VectorElements = 4; const int NumVecElements = NumElements / VectorElements; const int WorkGroupSize = NumVecElements / NumWorkGroups; void ProcRawCL(Mat &mat_src, const std::string &kernel_name) { //=============================================================== // Allocates memory in CMEM, directly accessible by both DSP and A15. // This avoids buffer copying. // Create three Mat data objects using pre-allocated CMEM memory int bufsize = mat_src.rows * mat_src.cols; void *ptr_cmem1 = __malloc_ddr(bufsize); void *ptr_cmem2 = __malloc_ddr(bufsize); void *ptr_cmem3 = __malloc_ddr(bufsize); Mat test_mat1(mat_src.size(), CV_8UC1, ptr_cmem1); Mat test_mat2(mat_src.size(), CV_8UC1, ptr_cmem2); Mat test_mat3(mat_src.size(), CV_8UC1, ptr_cmem3); mat_src.copyTo(test_mat1); threshold(test_mat1, test_mat2, 128.0, 192.0, THRESH_BINARY); imwrite("out_cmem1.jpg", test_mat2); //---- mat_src.copyTo(test_mat3); try { Context context(CL_DEVICE_TYPE_ACCELERATOR); std::vector devices = context.getInfo(); int d = 0; std::string str; ifstream t(kernel_name); std::string kernelStr((istreambuf_iterator(t)), istreambuf_iterator()); devices[d].getInfo(CL_DEVICE_NAME, &str); cout << "DEVICE: " << str << endl << endl; Program::Sources source(1, std::make_pair(kernelStr.c_str(), kernelStr.length())); Program program = Program(context, source); program.build(devices); Kernel kernel(program, "maskVector"); Buffer bufA (context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, bufsize, ptr_cmem2); Buffer bufDst (context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, bufsize, ptr_cmem1); kernel.setArg(0, bufA); kernel.setArg(1, bufDst); Event ev1; CommandQueue Q(context, devices[d], CL_QUEUE_PROFILING_ENABLE); Q.enqueueNDRangeKernel(kernel, NullRange, NDRange(NumVecElements), NDRange(WorkGroupSize), NULL, &ev1); ev1.wait(); ocl_event_times(ev1, "Kernel Exec"); imwrite("out_cmem2.jpg", test_mat1); } catch (cl::Error err) { cerr << "ERROR: " << err.what() << "(" << err.err() << ", " << ocl_decode_error(err.err()) << ")" << endl; } //---- __free_ddr(ptr_cmem1); __free_ddr(ptr_cmem2); __free_ddr(ptr_cmem3); //=============================================================== }r—…r˜}r™(hZUh[j“ubaubh“)rš}r›(hZXrThis is kernel\_direct.cl OpenCL C file. Kernel maskVector is loaded, compiled and disptache by above host programh[jsh\h_hah–hc}rœ(hi]hj]hh]hg]hk]uhlM„hmhhU]rhoXqThis is kernel_direct.cl OpenCL C file. Kernel maskVector is loaded, compiled and disptache by above host programrž…rŸ}r (hZXrThis is kernel\_direct.cl OpenCL C file. Kernel maskVector is loaded, compiled and disptache by above host programh[jšubaubjI)r”}r¢(hZX•kernel void maskVector(global const uchar4* a, global uchar4* b) { int id = get_global_id(0); b[id] = a[id] & (uchar4)(127, 127, 127, 127); }h[jsh\h_hajLhc}r£(j‘‰j’Xchehfhg]hh]hi]j“}hj]hk]uhlMØhmhhU]r¤hoX•kernel void maskVector(global const uchar4* a, global uchar4* b) { int id = get_global_id(0); b[id] = a[id] & (uchar4)(127, 127, 127, 127); }r„…r¦}r§(hZUh[j”ubaubeubeubhs)rØ}r©(hZUh[j{h\h_hahvhc}rŖ(hi]hj]hh]hg]r«hPahk]r¬h$auhlM²hmhhU]r­(h{)r®}rÆ(hZX%OpenCV profiling - standard procedurer°h[jØh\h_hahhc}r±(hi]hj]hh]hg]hk]uhlM²hmhhU]r²hoX%OpenCV profiling - standard procedurer³…r“}rµ(hZj°h[j®ubaubh“)r¶}r·(hZXStandard procedure for profiling OpenCV kernels (with OpenCL dispatch or without), is described in: https://github.com/opencv/opencv/wiki/HowToUsePerfTests In case of Processor Linux SDK on AM3/4/5 (AM57xx only supports OpenCL dispatch to DSP cores), these steps should be followed:h[jØh\h_hah–hc}rø(hi]hj]hh]hg]hk]uhlM“hmhhU]r¹(hoXdStandard procedure for profiling OpenCV kernels (with OpenCL dispatch or without), is described in: rŗ…r»}r¼(hZXdStandard procedure for profiling OpenCV kernels (with OpenCL dispatch or without), is described in: h[j¶ubh™)r½}r¾(hZX7https://github.com/opencv/opencv/wiki/HowToUsePerfTestsræhc}rĄ(Urefurijæhg]hh]hi]hj]hk]uh[j¶hU]rĮhoX7https://github.com/opencv/opencv/wiki/HowToUsePerfTestsrĀ…rĆ}rÄ(hZUh[j½ubahah¢ubhoX In case of Processor Linux SDK on AM3/4/5 (AM57xx only supports OpenCL dispatch to DSP cores), these steps should be followed:rÅ…rĘ}rĒ(hZX In case of Processor Linux SDK on AM3/4/5 (AM57xx only supports OpenCL dispatch to DSP cores), these steps should be followed:h[j¶ubeubjI)rČ}rÉ(hZXV[EVM] cd /usr/share/OpenCV/titestsuite [EVM] source setupEnv.txt [LINUXBOX] Copy test vectors (copy https://github.com/opencv/opencv_extra/tree/master/testdata) to [EVM] /usr/share/OpenCV/testdata [LINUXBOX] We need Yocto build (follow http://processors.wiki.ti.com/index.php/Processor_SDK_Building_The_SDK) as opencv performance executables or scripts are not distributed, as standard deliverables: From Yocto build, copy all python scripts from opencv/XYZ/git/modules/ts/misc, to EVM folder: /usr/share/OpenCV/titestsuite From Yocto build, copy opencv_perf_* executables from opencv/XYZ/build/bin, to EVM folder: /usr/share/OpenCV/titestsuite [EVM] Use environment variable to enable / disable OpenCL kernel acceleration: OPENCL off: export OPENCV_OPENCL_DEVICE=' OPENCL on: export TI_OCL_CACHE_KERNELS=Y export TI_OCL_KEEP_FILES=Y export OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP' [EVM] Now we are ready to run the tests, or subsets of tests: EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py -t objdetect (run objdetect module performance tests) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py -t core,imgproc (run both core and imgproc performance tests... this takes a lot of time) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --perf_force_samples=5 -t imgproc --gtest_filter="*Sobel*" (run only Sobel filters from imgproc module) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --gtest_list_tests -t imgproc (list all the available performance tests, for imgproc module) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --perf_force_samples=5 -t imgproc --gtest_filter="*threshold/20*" (run single test case)h[jØh\h_hajLhc}rŹ(hehfhg]hh]hi]hj]hk]uhlM¾hmhhU]rĖhoXV[EVM] cd /usr/share/OpenCV/titestsuite [EVM] source setupEnv.txt [LINUXBOX] Copy test vectors (copy https://github.com/opencv/opencv_extra/tree/master/testdata) to [EVM] /usr/share/OpenCV/testdata [LINUXBOX] We need Yocto build (follow http://processors.wiki.ti.com/index.php/Processor_SDK_Building_The_SDK) as opencv performance executables or scripts are not distributed, as standard deliverables: From Yocto build, copy all python scripts from opencv/XYZ/git/modules/ts/misc, to EVM folder: /usr/share/OpenCV/titestsuite From Yocto build, copy opencv_perf_* executables from opencv/XYZ/build/bin, to EVM folder: /usr/share/OpenCV/titestsuite [EVM] Use environment variable to enable / disable OpenCL kernel acceleration: OPENCL off: export OPENCV_OPENCL_DEVICE=' OPENCL on: export TI_OCL_CACHE_KERNELS=Y export TI_OCL_KEEP_FILES=Y export OPENCV_OPENCL_DEVICE='TI AM57:ACCELERATOR:TI Multicore C66 DSP' [EVM] Now we are ready to run the tests, or subsets of tests: EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py -t objdetect (run objdetect module performance tests) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py -t core,imgproc (run both core and imgproc performance tests... this takes a lot of time) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --perf_force_samples=5 -t imgproc --gtest_filter="*Sobel*" (run only Sobel filters from imgproc module) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --gtest_list_tests -t imgproc (list all the available performance tests, for imgproc module) EXAMPLE (EVM, execute from folder /usr/share/OpenCV/titestsuite): python ./run.py --perf_force_samples=5 -t imgproc --gtest_filter="*threshold/20*" (run single test case)rĢ…rĶ}rĪ(hZUh[jČubaubeubeubhs)rĻ}rŠ(hZUh[hth\h_hahvhc}rŃ(hi]hj]hh]hg]rŅhLahk]rÓh auhlMŌhmhhU]rŌ(h{)rÕ}rÖ(hZXOpenCV Performancer×h[jĻh\h_hahhc}rŲ(hi]hj]hh]hg]hk]uhlMŌhmhhU]rŁhoXOpenCV PerformancerŚ…rŪ}rÜ(hZj×h[jÕubaubh“)rŻ}rŽ(hZX Please refer to `OpenCV Performance `__ for the comparison of example performance of OpenCV routines as measured on multicore ARM Cortex-A15 cores and C66x DSPs in two different TI SoCs.h[jĻh\h_hah–hc}rß(hi]hj]hh]hg]hk]uhlMÖhmhhU]rą(hoXPlease refer to rᅁrā}rć(hZXPlease refer to h[jŻubh™)rä}rå(hZXf`OpenCV Performance `__hc}rę(UnameXOpenCV PerformancehXMhttp://www.ti.com/processors/digital-signal-processors/libraries/open-cv.htmlhg]hh]hi]hj]hk]uh[jŻhU]rēhoXOpenCV Performancer腁ré}rź(hZUh[jäubahah¢ubhoX“ for the comparison of example performance of OpenCV routines as measured on multicore ARM Cortex-A15 cores and C66x DSPs in two different TI SoCs.r녁rģ}rķ(hZX“ for the comparison of example performance of OpenCV routines as measured on multicore ARM Cortex-A15 cores and C66x DSPs in two different TI SoCs.h[jŻubeubeubhs)rī}rļ(hZUh[hth\h_hahvhc}rš(hi]hj]hh]hg]rńhNahk]rņh"auhlMÜhmhhU]ró(h{)rō}rõ(hZXFrequently Asked Questionsröh[jīh\h_hahhc}r÷(hi]hj]hh]hg]hk]uhlMÜhmhhU]rųhoXFrequently Asked Questionsrł…rś}rū(hZjöh[jōubaubh“)rü}rż(hZX6**How to compile OpenCV natively on 66AK2H platform?**ržh[jīh\h_hah–hc}r’(hi]hj]hh]hg]hk]uhlMŽhmhhU]rjģ)r}r(hZjžhc}r(hi]hj]hh]hg]hk]uh[jühU]rhoX2How to compile OpenCV natively on 66AK2H platform?r…r}r(hZUh[jubahajōubaubcdocutils.nodes block_quote r)r }r (hZUh[jīh\h_haU block_quoter hc}r (hi]hj]hh]hg]hk]uhlNhmhhU]r (h“)r}r(hZXThe ARM gcc compiler is included in the ProcSDK filesystem under /usr/bin directory. OpenCV is supported on Keystone2 platforms (K2H/K/E/L). However, the following OpenCV include files and libraries are not in the filesystem, but needed to compile natively.rh[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMąhU]rhoXThe ARM gcc compiler is included in the ProcSDK filesystem under /usr/bin directory. OpenCV is supported on Keystone2 platforms (K2H/K/E/L). However, the following OpenCV include files and libraries are not in the filesystem, but needed to compile natively.r…r}r(hZjh[jubaubh“)r}r(hZXxLibraries need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/lib to /usr/lib are::h[j h\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMähU]rhoXwLibraries need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/lib to /usr/lib are:r…r}r(hZXwLibraries need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/lib to /usr/lib are:h[jubaubjI)r}r(hZXclibopencv* libgst* libgphoto* liborc* libtbb* libwebp* libtiff* libgst* libgphoto* libexif* liborc*h[j hajLhc}r(hehfhg]hh]hi]hj]hk]uhlMéhU]r hoXclibopencv* libgst* libgphoto* liborc* libtbb* libwebp* libtiff* libgst* libgphoto* libexif* liborc*r!…r"}r#(hZUh[jubaubh“)r$}r%(hZX‘OpenCV include directories need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/include to /usr/include are::h[j h\h_hah–hc}r&(hi]hj]hh]hg]hk]uhlMóhU]r'hoXOpenCV include directories need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/include to /usr/include are:r(…r)}r*(hZXOpenCV include directories need to be copied from Linux_ProSDK/linux-devkit/sysroot/armv7ahf-neon-linux-gnueabi/usr/include to /usr/include are:h[j$ubaubjI)r+}r,(hZXopencv opencv2h[j hajLhc}r-(hehfhg]hh]hi]hj]hk]uhlMųhU]r.hoXopencv opencv2r/…r0}r1(hZUh[j+ubaubh“)r2}r3(hZXuOnce all the libraries and include files are copied, the OpenCV example, canny_ex1, can be compiled natively on EVM..r4h[j h\h_hah–hc}r5(hi]hj]hh]hg]hk]uhlMłhU]r6hoXuOnce all the libraries and include files are copied, the OpenCV example, canny_ex1, can be compiled natively on EVM..r7…r8}r9(hZj4h[j2ubaubeubh“)r:}r;(hZXq**Why the performance of running on DSP offloaded using OpenCL is slower than that running on ARM using OpenMP?**r<h[jīh\h_hah–hc}r=(hi]hj]hh]hg]hk]uhlMūhmhhU]r>jģ)r?}r@(hZj<hc}rA(hi]hj]hh]hg]hk]uh[j:hU]rBhoXmWhy the performance of running on DSP offloaded using OpenCL is slower than that running on ARM using OpenMP?rC…rD}rE(hZUh[j?ubahajōubaubj)rF}rG(hZUh[jīh\h_haj hc}rH(hi]hj]hh]hg]hk]uhlNhmhhU]rI(h“)rJ}rK(hZXĶUnless the system can hide somewhat the data movement (using DMA to move data while some other computations are taking place) this is data movement problem. Each of the cores, DSP and the ARM are capable of doing floating point multiplication and addition in a single step (in pipeline fashion) so really the bottle neck is the data in and out the DDR, 2M 32-bit elements of two vectors read and one vector write must reside in the DDR (or generated on the fly)rLh[jFh\h_hah–hc}rM(hi]hj]hh]hg]hk]uhlMżhU]rNhoXĶUnless the system can hide somewhat the data movement (using DMA to move data while some other computations are taking place) this is data movement problem. Each of the cores, DSP and the ARM are capable of doing floating point multiplication and addition in a single step (in pipeline fashion) so really the bottle neck is the data in and out the DDR, 2M 32-bit elements of two vectors read and one vector write must reside in the DDR (or generated on the fly)rO…rP}rQ(hZjLh[jJubaubh“)rR}rS(hZX>Since this is data movement problem and not processing problem, it is not expected that the DSP to be much faster, unless the ARM is busy doing something else at the same time. So the advantage of the OpenCL in this case is that the ARM can do something else while the DSP is busy performing the (so simple) algorithm.rTh[jFh\h_hah–hc}rU(hi]hj]hh]hg]hk]uhlMhU]rVhoX>Since this is data movement problem and not processing problem, it is not expected that the DSP to be much faster, unless the ARM is busy doing something else at the same time. So the advantage of the OpenCL in this case is that the ARM can do something else while the DSP is busy performing the (so simple) algorithm.rW…rX}rY(hZjTh[jRubaubeubh“)rZ}r[(hZX}**When using UMat to do remap, it shows faster than using Mat, but why UMat time cost of saving results is longer than Mat?**r\h[jīh\h_hah–hc}r](hi]hj]hh]hg]hk]uhlM hmhhU]r^jģ)r_}r`(hZj\hc}ra(hi]hj]hh]hg]hk]uh[jZhU]rbhoXyWhen using UMat to do remap, it shows faster than using Mat, but why UMat time cost of saving results is longer than Mat?rc…rd}re(hZUh[j_ubahajōubaubj)rf}rg(hZUh[jīh\h_haj hc}rh(hi]hj]hh]hg]hk]uhlNhmhhU]ri(h“)rj}rk(hZXWhen OpenCL is turned on and if data are in UMat, remap is directed to DSP, i.e. offload to DSP happens, but OpenCL in OpenCV has somewhat different call flow. It submits a task (to DSP OpenCL queue) and returns immediately. This allows parallelization between accelerator (DSP) and CPU, as long as data dependency is satisfied. So, when save is requested, CPU waits for end of submitted task before it can actually do the save. DSP in many cases is slower than A15 (NEON operation). The UMat cost time includes: waiting time (for DSP to finish) plus actual write and any format conversion (done on CPU). It also depends a lot on data types used, and if floating point operations are involved. This can be accelerated if DSP optimized implementation of remap() is created.rlh[jfh\h_hah–hc}rm(hi]hj]hh]hg]hk]uhlM hU]rnhoXWhen OpenCL is turned on and if data are in UMat, remap is directed to DSP, i.e. offload to DSP happens, but OpenCL in OpenCV has somewhat different call flow. It submits a task (to DSP OpenCL queue) and returns immediately. This allows parallelization between accelerator (DSP) and CPU, as long as data dependency is satisfied. So, when save is requested, CPU waits for end of submitted task before it can actually do the save. DSP in many cases is slower than A15 (NEON operation). The UMat cost time includes: waiting time (for DSP to finish) plus actual write and any format conversion (done on CPU). It also depends a lot on data types used, and if floating point operations are involved. This can be accelerated if DSP optimized implementation of remap() is created.ro…rp}rq(hZjlh[jjubaubh“)rr}rs(hZXTo optimize DSP, please follow guideline in Chapters `Creating OpenCL C kernel optimized for C66 core `__ to `Alternative approach to add new OpenCL kernels at OpenCV application level `__h[jfh\h_hah–hc}rt(hi]hj]hh]hg]hk]uhlMhU]ru(hoX5To optimize DSP, please follow guideline in Chapters rv…rw}rx(hZX5To optimize DSP, please follow guideline in Chapters h[jrubh™)ry}rz(hZX‰`Creating OpenCL C kernel optimized for C66 core `__hc}r{(UnameX/Creating OpenCL C kernel optimized for C66 corehXSFoundational_Components_OpenCV.html#creating-opencl-c-kernel-optimized-for-c66-corehg]hh]hi]hj]hk]uh[jrhU]r|hoX/Creating OpenCL C kernel optimized for C66 corer}…r~}r(hZUh[jyubahah¢ubhoX to r€…r}r‚(hZX to h[jrubh™)rƒ}r„(hZXæ`Alternative approach to add new OpenCL kernels at OpenCV application level `__hc}r…(UnameXJAlternative approach to add new OpenCL kernels at OpenCV application levelhXnFoundational_Components_OpenCV.html#alternative-approach-to-add-new-opencl-kernels-at-opencv-application-levelhg]hh]hi]hj]hk]uh[jrhU]r†hoXJAlternative approach to add new OpenCL kernels at OpenCV application levelr‡…rˆ}r‰(hZUh[jƒubahah¢ubeubeubh“)rŠ}r‹(hZXX**Why isn't the performance improved when calling dsplib and use OpenMP to accelerate?**rŒh[jīh\h_hah–hc}r(hi]hj]hh]hg]hk]uhlMhmhhU]rŽjģ)r}r(hZjŒhc}r‘(hi]hj]hh]hg]hk]uh[jŠhU]r’hoXTWhy isn't the performance improved when calling dsplib and use OpenMP to accelerate?r“…r”}r•(hZUh[jubahajōubaubj)r–}r—(hZUh[jīh\XJinternal padding after source/linux/Foundational_Components/OpenCV.rst.incr˜haj hc}r™(hi]hj]hh]hg]hk]uhlNhmhhU]ršh“)r›}rœ(hZXLThere is overhead involved in dispatching compute to the DSP. If the amount of compute in the offloaded region is small, the user can notice a slowdown. The "null" OpenMPAcc example that ships on the target file system (/usr/share/ti/examples/openmpacc/) can be run to determine the overhead involved in dispatching a target region.rh[j–h\h_hah–hc}rž(hi]hj]hh]hg]hk]uhlM!hU]rŸhoXLThere is overhead involved in dispatching compute to the DSP. If the amount of compute in the offloaded region is small, the user can notice a slowdown. The "null" OpenMPAcc example that ships on the target file system (/usr/share/ti/examples/openmpacc/) can be run to determine the overhead involved in dispatching a target region.r …r”}r¢(hZjh[j›ubaubaubeubeubehZUU transformerr£NU footnote_refsr¤}r„Urefnamesr¦}r§Usymbol_footnotesrØ]r©Uautofootnote_refsrŖ]r«Usymbol_footnote_refsr¬]r­U citationsr®]rÆhmhU current_liner°NUtransform_messagesr±]r²Ureporterr³NUid_startr“KU autofootnotesrµ]r¶U citation_refsr·}røUindirect_targetsr¹]rŗUsettingsr»(cdocutils.frontend Values r¼or½}r¾(Ufootnote_backlinksræKUrecord_dependenciesrĄNU rfc_base_urlrĮUhttps://tools.ietf.org/html/rĀU tracebackrĆˆUpep_referencesrÄNUstrip_commentsrÅNU toc_backlinksrĘj‰U language_coderĒUenrČU datestamprÉNU report_levelrŹKU _destinationrĖNU halt_levelrĢKU strip_classesrĶNhNUerror_encoding_error_handlerrĪUbackslashreplacerĻUdebugrŠNUembed_stylesheetrщUoutput_encoding_error_handlerrŅUstrictrÓU sectnum_xformrŌKUdump_transformsrÕNU docinfo_xformrÖKUwarning_streamr×NUpep_file_url_templaterŲUpep-%04drŁUexit_status_levelrŚKUconfigrŪNUstrict_visitorrÜNUcloak_email_addressesrŻˆUtrim_footnote_reference_spacerމUenvrßNUdump_pseudo_xmlrąNUexpose_internalsrįNUsectsubtitle_xformrā‰U source_linkrćNUrfc_referencesräNUoutput_encodingråUutf-8ręU source_urlrēNUinput_encodingrčU utf-8-sigréU_disable_configrźNU id_prefixrėUU tab_widthrģKUerror_encodingrķUUTF-8rīU_sourcerļX^/home/gtbldadm/nightlybuilds/processor-sdk-doc/source/linux/Foundational_Components_OpenCV.rstršUgettext_compactrńˆU generatorrņNUdump_internalsróNU smart_quotesrō‰U pep_base_urlrõU https://www.python.org/dev/peps/röUsyntax_highlightr÷UlongrųUinput_encoding_error_handlerrłjÓUauto_id_prefixrśUidrūUdoctitle_xformrü‰Ustrip_elements_with_classesrżNU _config_filesrž]Ufile_insertion_enabledr’ˆU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(h?j@h8jBh7j(hQjh=jAh9j­h4j{hSj›hEjh6jChPjØh:jh2j˜hHjshBjhChthFj®hIj€h5j‘hLjĻhJj6hKjh;jhRjhDj¼hOjĄhj°hNjīhTjuUsubstitution_namesr}rhahmhc}r(hi]hg]hh]Usourcejšhj]hk]uU footnotesr]r Urefidsr }r ub.